私はReactで可能な限りきれいに物事を整理する方法を考えるのに多くの時間を費やします。最近、ReactコンテナがRedux(または他のデータ - Meteor)に接続して単一のコンポーネントをレンダリング/返すか、またはコンテナがイベント処理も担当する必要があるかどうかを調べています。だから、例えば、これら2つのモデル間のトスアップだ:AJAX呼び出しをプレゼンテーションコンポーネントに入れることはできますか、またはコンテナを抽出する必要がありますか?
モデル1
// ThingContainer.js
import Thing from '../components/Thing';
export default someHigherOrderFunc(/* map state/data to props */)(Thing)
// Thing.js
export default class Thing extends Component {
handleClick() { /* ... */ }
handleMouseEnter() { /* ... */ }
render() {
// Other components rendered here, both container or presentational
}
}
モデル2
// ThingContainer.js
class ThingContainer extends Component {
handleClick() { /* ... */ }
handleMouseEnter() { /* ... */ }
render() {
// Now Thing can be stateless
return <Thing
onClick={this.handleClick}
onMouseEnter={this.handleMouseEnter}
/>
}
}
export default someHigherOrderFunc()(ThingContainer)
は、それはほとんどThing
は内に独自のコンテナになり、モデル1でのように感じています私は私が好きではないかと思う感覚。モデル2は、より自然な感じです。ThingContainer
は、データとReduxを処理するだけでなく、イベントを処理し、componentDidMount
などでAjaxリクエストを発生させるなどの費用がかかります。最初のモデルでは、AjaxリクエストをcomponentDidMount
で呼び出したい場合、それは右に見えないThing
に入る必要があります。
これらのアプローチのいずれかに特有の利点や落とし穴があるのか、それとも単にスタイル/プリファレンスになるのか不思議です。
あなたはReact + Reduxでいくつかの経験があるようですが;) – markthethomas
これはかなり意味があります!そして、もし私が 'Thing'をラップすることができる別のコンテナを持っていたいならば、それは命名規則(ThingContainerのいくつかのバリエーションの名前を付ける方法)の問題になります。 – ffxsam
うん。私は実際の使用事例で問題になるという名前は見つけられません。例えば。 'List'と' UserFollowerList'、 'UserFollowingList'、' UserPostList'などです。 –