ユーザーが自分のコンポーネント上のボタンをクリックするたびに、その状態のオブジェクトセットをフィルタリングしようとしています。フィルタリングのロジックはうまく動作しますが、コンポーネントに戻ったときにフィルタリングされたオブジェクトがなくなり、代わりにプロパティが定義されていません。私はライフサイクルメソッドを欠いていますか?小道具変更後にリアクションコンポーネントが再レンダリングされない
クリックイベント:
<div onClick={this.filterMyPosts}>My Posts</div>
...
<div>
{this.renderPosts()}
</div>
filterMyPosts
filterMyPosts() {
this.props.updateFilter("myPosts");
// filtering function uses switch statement based on strings to filter posts
}
コンポーネントコンテナ:
const mapStateToProps = (state) => {
return {currentUser: state.session.currentUser,
posts: allPostsByFilter(state.posts, state.filter, state.session.currentUser.id, state.bookmarks)}
};
const mapDispatchToProps = (dispatch) => ({
updateFilter: (filter) => dispatch(updateFilter(filter))
})
フィルタリングでフィルタリングイベントを返す別のファイルに行われますオブジェクト。そのロジックにはエラーはありません。
問題:それは次の関数になる頃には、「記事は」未定義です。その途中で、フィルタリングされたポストはコンポーネントに戻ることはありません。
renderPosts() {
return (
<div className ="user-profile-posts">
<ul>
{Object.keys(this.props.posts).map(id => <PostIndexItem
key={`posts-index-item${id}`}
post={this.props.posts[id]}
user={true}
/>)}
</ul>
</div>
);
}
EDIT - フィルタ機能
export const allPostsByFilter = (filter, currentUserId, posts) => {
switch (filter) {
case "myPosts":
let postKeys = Object.keys(posts).filter((id) => {
return(posts[id].user_id === currentUserId)
});
let userPosts = {}
postKeys.forEach((key) => userPosts[key] = posts[key])
let newPosts = {}
let postKeys = Object.keys(posts).filter((id) => {
return (Object.keys(userPosts).includes(id))
});
eventKeys.forEach((key) => newPosts[key] = posts[key])
return newPosts
default:
return posts
申し訳ありません、これは以前のタイプミスですが、私はそれを上に変更しました。 –
allPostsByFilter関数を共有できますか?たぶん、あなたが戻ってこない状態があります。 – vijayst
私は上記のコードを追加しました。私はそれが問題だとは思わないが。問題は、updateFilterディスパッチが状態のフィルタを更新していますが、 'mapStateToProps'が再び実行されることではありません。つまり、フィルタ処理されたイベントが実際にユーザーに表示されることはありません。私は使用できるライフサイクルの方法がなければならないと思います。 –