2017-11-16 23 views
0

要するに、私はチュートリアルではhereを見つけています。React Native:setState()は、FlatListの子コンポーネントを再レンダリングしません。

FlatListコンポーネントに、状態が変更されたときに再レンダリングするために状態が関連付けられているpropを割り当てる必要があるのはわかりません。この例のようにextraDataプロップを省略すると、FlatListは再レンダリングされません。私はsetState()がコンポーネントとそのすべての子を再レンダリングするはずだったと思っていましたが、このインスタンスではありません。

ありがとうございます。

+0

コードでは、「extraData」小道具を使用していますか? –

+0

「次へ」のページを検索した場合、状態が変更されたときにFlatListが再レンダリングされるようにしてください。これはFlatList propsで処理されます。 – finferflu

答えて

1

このページでhttps://facebook.github.io/react-native/docs/flatlist.html

を見てみるならば、あなたは彼らがstate.selectedを設定しているが、私はあなた/彼はそのチュートリアル、多分そのthis.stateにそれをやっていることを確認することはできません見ることができます。プロパティとしてisntが選択されていますか?

は、私はあなたがこのようごonSelectItem()方法で状態にselectedを追加する必要がありますと思う:

onSelectItem: (item) => { 
    console.log('onSelectItem ', item); 
    this.setState({ 
     selected: item 
    }); 
}, 
+0

これを指摘してくれてありがとう。 "extraData = {this.state}をFlatListに渡すことによって、FlatList自体がstate.selectedの変更が行われたときに再描画されることを確認していますこの小道具を設定しないと、FlatListはPureComponentであり、小道具の比較で変更が表示されないため、アイテムを再レンダリングする必要があることはわかりません。だから私はこれが他のコンポーネントでは起こらないと仮定しています... – finferflu

+0

明らかに違いはFlatListは['PureComponent'](https://reactjs.org/docs/react-api.html#reactpurecomponent)です): "React.PureComponentはReact.Componentとまったく同じですが、浅い小道具と状態の比較でshouldComponentUpdate()を実装しています。" – finferflu

0

より注意深くdocumentation for the FlatListコンポーネント(おかげで、@Lucas Reppe Welander)を読んだ後、それはFlatListがあることが明らかになりました通常のコンポーネントではありませんが、実際はPureComponentです。つまり、親コンポーネントの状態が変わっても、PureComponentは "shouldComponentUpdate()を浅い小道具と状態の比較で実装している"ので、FlatListの "小道具比較は変更を表示しません"。私はこれが必要とするすべての複雑さについて完全にはわかっていませんが、なぜこの場合にextraData支柱を使用する必要があるのか​​を理解するだけで十分です。

関連する問題