現在、react + redux プロジェクトに取り組んでいます。
また、normalizrを使用してデータ構造を処理し、再選択してアプリ コンポーネントの適切なデータを収集しています。
すべてうまくいっているようです。
葉のようなコンポーネントがストアからのデータを必要とする状況に陥っているためconnect()
、コンポーネントにそれを実装する必要があります。
簡単な例として、アプリが、複数のユーザーがフィードバックを収集する本の編集システムであると想像してください。
Book
Chapters
Chapter
Comments
Comments
Comments
アプリのさまざまなレベルで、ユーザーはコンテンツに貢献したり、コメントを提供したりできます。
チャプターをレンダリングしているとします。チャプターにはコンテンツ (および作成者) とコメント (それぞれに独自のコンテンツと作成者があります) があります。
現在、私はIDconnect()
にreselect
基づいてチャプターのコンテンツを作成しています。
データベースは normalizr で正規化されているため、実際には章の基本的なコンテンツ フィールドと作成者のユーザー ID しか取得していません。
コメントをレンダリングするには、章にリンクされたコメントを再選択できる接続コンポーネントを使用し、各コメント コンポーネントを個別にレンダリングします。
繰り返しますが、データベースは normalizr で正規化されているため、実際には基本的なコンテンツとコメント作成者のユーザー ID しか取得できません。
ここで、作成者バッジのような単純なものをレンダリングするには、別の接続されたコンポーネントを使用して、所有しているユーザー ID からユーザーの詳細を取得する必要があります (章の作成者をレンダリングするときと、個々のコメントの作成者ごとの両方の場合)。
コンポーネントは次のような単純なものになります。
@connect(
createSelector(
(state) => state.entities.get('users'),
(state,props) => props.id,
(users,id) => ( { user:users.get(id)})
)
)
class User extends Component {
render() {
const { user } = this.props
if (!user)
return null
return <div className='user'>
<Avatar name={`${user.first_name} ${user.last_name}`} size={24} round={true} />
</div>
}
}
User.propTypes = {
id : PropTypes.string.isRequired
}
export default User
そして、それは一見うまく機能します。
私は逆のことを試み、より高いレベルでデータを非正規化して、たとえばチャプターデータがユーザー ID だけでなくユーザーデータを直接埋め込み、それをユーザーに直接渡すようにしましたが、それだけです。非常に複雑なセレクターを作成しているように見えました。私のデータは不変であるため、毎回オブジェクトを再作成するだけです。
それで、私の質問は、connect()
アンチパターンのサインをレンダリングするためにストアに葉のようなコンポーネント(上記のユーザーのような)を持っていますか?
私は正しいことをしていますか、それともこれを間違った方法で見ていますか?