React全部バケツリレー自動化

THE バケツリレー

このようなコードを書くと、Contextstatepropsが合体したものが、各Componentpropsとして配給される感じです。

let user = new User(JSON.parse(dom.getAttribute('data-user')));

ReactDOM.render(
  <Context {...{user}}>
    <Component/>
    <SubComponent/>
  </Context>
  , dom);

Contextrenderをこうします。

render() {
  let props = Object.assign({}, this.props, this.state);
  delete props.children;

  let {children} = this.props;
  let elements = !!children.map ? children : [children];

  return <div className="context-wrapper">
    {elements.map((child, i)=> React.cloneElement(child, Object.assign(props, {key: i})))}
  </div>;
}

これで、最初の例だと、userComponentにもSubComponentにも配給されて、並列関係として描画されます。

なぜ

現在作成中のものでは、SPAではなく、各機能ごとにReactでひとつのセットを作成しました。結果、12機能ぐらいに分割されましたが、最初に出したようなコードを機能ごとに書くことになりました。

その際、機能が違えば扱うstatepropsも変わるわけですが、Contextの中にComponentが具体的に出てきたり、具体的にpropsを書くのはなんだかめんどくさいなぁと思ってこうなりました。

Contextは処理に集中、ComponentはUIに集中、ReactDOM.renderでどれを使っていくか決めるみたいな分け方ができて、比較的コードがとっちらからずに済んでよかったです。