レイアウトのためのatomコンポーネントとかtemplates層とかの実装
Atomic Designの本「Atomic Design ~堅牢で使いやすいUIを効率良く設計する」を参考にしながら、こういう感じでやっていってる。
// atoms/AppLayout.tsx const AppLayout = (props: Props) => { const children = React.Children.toArray(props.children) return ( <div className={styles.left}>{children[0]}</div> <div className={styles.right}>{children[1]}</div> <main>{children[2]}</main> ) } // templates/UserPageTemplate.tsx interface Props { user: UserInterface; } const UserPageTemplate = (props: Props) => { return ( <AppLayout> <AppHeader /> <AppSidebar /> <UserView user={props.user} /> </AppLayout> ) }
AppLayout
に当てるCSSのflexboxなりgrid layoutなりでレイアウトを実現しておいて、同じレイアウトのページを作成するときは同じようにAppLayout
で囲えばそのレイアウトになるという感じになる。
templateのコンポーネントでは、どのレイアウトにどのOrganismを置くかということを記述する。URLから最初の状態を作ってpropsとして渡すのはその上のpageコンポーネントにやってもらう。なのでtemplateはStateless Functional Component (状態無し関数コンポーネント)になる。
レイアウトがAtomだってことに最初はちょっと違和感あったけど、別に何もおかしなことはなかった。