2017-10-30 3 views
1

私は複数選択モーダルを構築しています。ユーザーが項目を押すと、項目は「チェック済み」とマークされます。FlatList項目は更新されません)

問題 Iは、IDアレイから/除去IDを追加しました。私が開いてモーダルをチェックすると、「チェック」サインは表示されません。しかし、モーダルをもう一度閉じて開くと、「チェック」サインが表示されます。

enter image description here

選択した項目を追跡するために、私は、モーダル・コンポーネントの状態の項目を定義しました。ここ

state = { 
    selectedSeasonIds: this.props.selectedSeasonIds, 
    } 

が反応ネイティブモーダルIこれは、各項目

_renderItemForMultiple = ({item}) => { 
    return (
     <TouchableOpacity 
     style={styles.itemStyle} 
     onPress={() => {this._handleMultipleItemPress(item.id)}}> 
     <RkText>{item.value}</RkText> 
     { this._renderCheck(item.id) } <<< Here is the problem 
     </TouchableOpacity> 
    ); 
    } 

ユーザーが項目をクリック

する機能をレンダリングある

<Modal 
     isVisible={isSelectorVisible} 
     onBackdropPress = {() => this.props.hideSelector()}> 
     <View style={styles.modalContainer}> 
      <FlatList 
       style={styles.root} 
       data={this.props.items} 
       ItemSeparatorComponent={this._renderSeparator} 
       keyExtractor={this._keyExtractor} 
       renderItem={this._renderItemForMultiple}/> 
     </View> 
</Modal> 

画面にモーダルを表示するために使用され、フラットリストのアイテムコール_handleMultipleitemPress

_handleMultipleItemPress = (id) => { 
    let { selectionType } = this.props; 
    let { selectedSeasonIds, selectedSizeIds, selectedColorIds } = this.state; 
    if(selectionType===2) { 
     if(_.includes(this.state.selectedSeasonIds, id)) { 
     let newSelectedSeasonIds = _.filter(this.state.selectedSeasonIds, (curObject) => { 
      return curObject !== id; 
     }); 
     this.setState({selectedSeasonIds : newSelectedSeasonIds}); 
     } else { 
     let newSelectedSeasonIds = [...this.state.selectedSeasonIds, id]; 
     this.setState({selectedSeasonIds : newSelectedSeasonIds}); 
     } 
    } 
    // season Select Action 
    this.props.seasonSelectAction(id); 
    } 

通報我々は、IDアレイから/除去IDを追加しました。私が開いてモーダルをチェックすると、「チェック」サインは表示されません。しかし、モーダルをもう一度閉じて開くと、「チェック」サインが表示されます。

でも、setStaterenderCheck()にしても、モーダルはレンダリングされません。なぜそれが起こっているのですか?そしてそれをどうやって修正できますか?

_renderCheck = (id) => { 
    let { selectionType, selectedSeasonIds, selectedSizeIds, selectedColorIds } = this.props; 
    if(selectionType===2) { 
     if(_.includes(this.state.selectedSeasonIds, id)) { 
     return (<RkText>Check </RkText>); 
     } 
    } 
    return (<RkText> </RkText>); 
    } 

その他のアドバイスもあります。このポストを読んでくれてありがとう。

UPDATE私はコードでデバッグしましたが、アイテムを押すと_renderItemForMultipleは通過しません。 _renderItemForMultipleのパラメータを定義していなかったからだと思います。どのようにアイテムをそのパラメータに渡すことができますか?何か案が?

+1

私は他のものと少し忙しい、私はあなたを助けたいが、あなたは、このコードの作業のデモを提供できる場合、私はより速く、それをデバッグすることができ、今で議論することはできません。 –

+0

この問題について私に手伝ってくれてありがとう。しかし、私は実行しているplankrを作る:(しかし、ここでは良いニュースではありませんでした、私は線でコード行をデバッグし、私は私がSETSTATEとき '_renderItemForMultiple'がレンダリングされていません発見しました。それはなぜ私がこのアウトを考え出し。EXACTLY? –

答えて

1

でも、あなたの状態が変化しても、あなたは<FlatList>にそれを渡していないので、その小道具は変更されません。そのshouldComponentUpdateメソッドは、その小道具が変更されないときにfalseを返します。ドキュメントの状態として:

FlatListextraData={this.state}を渡すことによって、私たちはときstate.selected変更FlatList自体が再レンダリングすることを確認してください。この小道具を設定しないと、FlatListPureComponentであり、小道具の比較で変更が表示されないため、アイテムを再レンダリングする必要があることはわかりません。

extraData={this.state}からFlatListに渡す必要があります。

+0

をレンダリングされていませんあなたが投稿した前に。私は自分の質問に答えていましたが、あなたは早く投稿しました。ありがとう!! –

+0

私の質問も投票します。これは他の人にとって本当に役に立つかもしれません。 –

+0

あなたは歓迎です、すでにしています! – Andy

関連する問題