2017-02-18 11 views
0

私はこれについてあなたの意見をお願いしたいと思います。基本的には、オブジェクトリストのアイテムを削除した後、コンポーネントリストを更新することです。現在、私は成功しdeleteHeroes(list,index)機能を経由してアイテムを削除することができますが、私のコンポーネントが削除された項目を反映するために、全く爽やかではありません。どうすればいいのですか?以下は私のコードです:更新コンポーネントは、後にオブジェクトを削除 - ReactJSは

componentDidMount(){ 
    // Fetch lists of heroes 
    this.props.getAllHeroes(); 
} 

renderHeroesList(){ 
    var listData = this.props.heroes.map((heroes,index) => (
     <HeroesListComponent key={heroes.id} heroes={heroes} onDelete = {() => this.deleteHeroes(heroes,index)} /> 
    )); 

    return listData; 
} 

// Remove item on heroes list 
deleteHeroes(list,index){ 
    const heroesProps = this.props.heroes; 
    heroesProps.splice(heroesProps.indexOf(index), 1); 
} 

render(){ 

    return(
     { this.renderHeroesList() } 
    ); 


function mapStateToProps(state){ 
    return { 
     heroes: state.heroes.data 
    } 
}} 
function mapDispatchToProps(dispatch){ 
    return bindActionCreators ({ 
     getAllHeroes: getAllHeroes, 
     deleteHero: deleteHero, 
    }, dispatch); 
} 

答えて

0

あなたの変更については何も通知していないためです。

あなたは、deleteHeroes後にこの

deleteHeroes(list,index){ 
    const { heroesProps, dispatch }= this.props; 
    heroesProps.splice(heroesProps.indexOf(index), 1); 
    dispatch({type: 'SAVE_HEROES', heroes: heroesProps}); 
} 

// and somewhere in reducer 
case SAVE_HEROES: 
    return {...state, heroes: action.heroes} 

のようなものがアクションを派遣し、減速への適切な関数を記述する必要があります。 しかし、コンポーネントが(状態を変更)hereosを削除してみましょう、あなたはReduxのの考えを破りました。

代わりに、コンポーネントが直接あなたが「DELETE_HEROES」のようなアクションを派遣、英雄を変更すると減速が残りをやらせるべきではありません。

+0

私は、あなたの指示に従ってください(deleteHeroes後にアクションを派遣)、しかし、私はweirdedよreduxがヒーローリストの状態を変更したにもかかわらず、レンダリングメソッドが起動しない理由を調べる。 –

0

あなたが考慮すべき2つの主要なオプションがあります。

  1. が共有される共通の祖先にデータ(状態を)入れて、それが反応するから、標準的な戦略です:https://facebook.github.io/react/docs/lifting-state-up.html

  2. をReduxのにすべての状態を置きます( https://github.com/reactjs/react-redux)、還元状態に基づいてコンポーネントとディスプレイを接続します。この場合は、uは削除した後、任意のものを行う必要はありません、Reduxのフレームワークは、データフローおよびUIリフレッシュの世話をします

+0

私は現在番号2をしていますが、状態が変わってもレンダリングメソッドが起動していなくても、今問題が発生しています –

1

あなたはすべてのコストで避けるべき副作用を持っています。あなたのケースでは、それはあなたがheroes小道具の内部リファレンスを変異されていることです。したがって、この問題を回避する典型的な計画は、小道具を複製し、新しい小道具データで新しい動作を送信することです。だからあなたのコードは次のようになります。

deleteHeroes(list,index){ 
    const clonedHeroesProps = this.props.heroes.slice(0); // clone the array 
    heroesProps.splice(heroesProps.indexOf(index), 1); 
    dispatch({type: 'SAVE_HEROES', heroes: clonedHeroesProps}); 
} 

より良い、より多くのReactish方法はImmutability Helpersを使って、次のようになります。

deleteHeroes(list,index){ 
    const clonedHeroesProps = update(heroesProps, {$splice: [[heroesProps.indexOf(index), 1]]}); 
    dispatch({type: 'SAVE_HEROES', heroes: clonedHeroesProps}); 
} 
+0

ええ、私はすでにこれを行い、更新されたヒーローを送ります。私の問題は、更新されたヒーローリストを受け取った後でコンポーネントが反応しないということです。 –

+0

これを 'componentWillReceiveProps(nextProps)'メソッドでデバッグしようとすると、新しいプロップを取得しているかどうか確認できます。また、このプロセス全体で、React devツールで何が起こっているかを小道具や状態で確認してください。 – Shota

+0

componentWillReceivePropsはトリガーしていませんが、renderHeroesList()内のコンソールログを見ると、deleteHeroesで削除したアイテムに基づいてthis.props.heroesが変更されていることがわかります。しかし、renderHeroesList()が変更されてもレンダリングメソッドは起動しません。 –

関連する問題