29
19

More than 5 years have passed since last update.

atomic designのTemplatesはrender propsで書く

Posted at

はじめに

reactを用いたatomic designのTemplatesの実装に2通りあると思っている。

  • データを引数で受け取る方式。pagesにデータとの依存解決をしてもらう。
  • コンポーネントを引数で受け取る方式。pagesにorganismsとの依存解決をしてもらう。

本には前者で書いてあるようだけど、render propsを使うことでtemplatesの抽象度を上げることできる。

danが言っていた「render propsを使えばバケツリレーを浅くできるよ」の意味を知るわかりやすい例にもなると思うので書いてみる。

データを引数で受ける方式

本にはこう書いてあるみたい

const TweetsPage = ({ tweets, goBack }) => (
  <TweetsTemplate
    headerData={{
      title: 'tweets',
      onCLickLeftButton: () => goBack(),
    }}
    ListData={tweets}
  />
)

templateはデータを受け取る。
命名はわかり易さのためにPageとかOrganismsとかをsufixにしてます。
TweetsPageに対してTweetTemplateがある。
TemplatesはPageとほとんどが1対1で作っていくことになると思う。
Templateにデータを流し込むのがPageのしごと。

コンポーネントを引数で受ける方式

個人的にはこうだと思ってた

const TweetsPage = ({ tweets, goBack }) => (
  <MyTemplate
    headerTitle='tweets'
    headerLeftItem={() => (
      <MyButtonAtom
        icon='back'
        onClick={() => goBack()}
      />
    )}
    body={() => (
      <TweetsList tweets={tweets} />
    )}
  />
)

templateはコンポーネントを受け取る。
Templatesの抽象度は前者より高く、枠だけ決めていてコンテンツが何かはPagesが注入する。
なのでTemplatesはPageと1対1ではなく1アプリケーションに付き1~3個くらいにしかならないと思う。

「PageがTemplatesとOrganismsを知っている」って感じなので、Organismsに直接Paramsを渡せる。
これでdanが言っていた「render propsを使えばバケツリレーを浅くできるよ」を体感できると思う。

きもち

reactはpropsを受けてjsxを返すだけのただ関数。(Props) => JSX
propsがデータだろうがコンポーネント(関数)だろうが大した差ではないけど、関数渡しても良いんだ、高階化してい良いんだってのを知ってるか知らないかで設計は変わる。ただの知識なので誰もが知ってて損ないと思う。

29
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
19