2016-09-04 28 views
6

ユーザーが自分のコンポーネント上のボタンをクリックするたびに、その状態のオブジェクトセットをフィルタリングしようとしています。フィルタリングのロジックはうまく動作しますが、コンポーネントに戻ったときにフィルタリングされたオブジェクトがなくなり、代わりにプロパティが定義されていません。私はライフサイクルメソッドを欠いていますか?小道具変更後にリアクションコンポーネントが再レンダリングされない

クリックイベント:

<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 

答えて

0

あなたの行動を結合するときは、thisコンテキストを失います。

<div onClick={this.filterMyPosts}>My Posts</div> 

変更呼び出し

<div onClick={() => this.filterMyPosts()}>My Posts</div> 

にこれはあなたのfilterMyPosts方法でthisを保証します。それがなければ、小道具は未定義です。

0

州は、プロパティ/レデューサーの1つとして投稿を紛失しています。イベントは投稿に置き換えてください。

const mapStateToProps = (state) => { 
    return {currentUser: state.session.currentUser, 
    events: allPostsByFilter(state.posts, state.filter, state.session.currentUser.id, state.bookmarks)} 
}; 

allPostsByFilter呼び出しと関数定義の間のパラメータに不一致があります。

最初のパラメータはフィルタである必要があります。代わりに、最初のパラメータとして投稿が渡されます。

ディスパッチメソッド - updateFilterは、allPostByFilterがトリガされるようにフィルタの状態を変更する必要があります。

+0

申し訳ありません、これは以前のタイプミスですが、私はそれを上に変更しました。 –

+0

allPostsByFilter関数を共有できますか?たぶん、あなたが戻ってこない状態があります。 – vijayst

+0

私は上記のコードを追加しました。私はそれが問題だとは思わないが。問題は、updateFilterディスパッチが状態のフィルタを更新していますが、 'mapStateToProps'が再び実行されることではありません。つまり、フィルタ処理されたイベントが実際にユーザーに表示されることはありません。私は使用できるライフサイクルの方法がなければならないと思います。 –

関連する問題