2016-05-21 16 views
0

まず最初に、いくつかの同様の質問があることを認識していますが、答えのどれも助けていません。react-native:状態変更時にListViewの行を再レンダリングします

とにかく、私は単純なリストビューを持っています。特定の行をクリックすると、いくつかの異なるスタイルとコンテンツを追加したいと思います。

私は state.selected_rowを設定し、この再 _renderRowで選択された行が何であるかを判定し、スタイリングが、私はそれを作ることができるか、適切に適用されますが、何らかの理由 _renderRowのためにのみレンダリング初期に呼ばれて、ビューをレンダリング _pressRow

毎回更新し、なぜこれはまだ起こっていないのですか?

私はそれが一緒にいくつかの異なる答えを貼り付けて作業してしまった
var List = React.createClass({ 

    getInitialState: function() { 
    var ds = new React.ListView.DataSource({ 
     rowHasChanged: (r1, r2) => r1 !== r2 
    }); 
    return { 
     dataSource: ds.cloneWithRows(some_data), 
     loaded: false, 
     selected_row: null, 
    }  
    }, 

    _renderRow: function(rowData, sectionID, rowID) { 
    var selected = (this.state.selected_row == rowID) 
    return (
     <React.View 
      style={selected ? styles.row_expanded : row_styles.row} 
      onPress={() => this._pressRow(rowID)> 
     </React.View> 
    ) 
    }, 

    _pressRow: function(rowId){ 
    this.setState({ 
     selected_row: rowId, 
    }); 
    }, 

    render: function() { 

     return <React.View> 
     <React.ListView 
      dataSource={this.state.dataSource} 
      renderRow={this._renderRow} 
      style={styles.container} 
     /> 
     </React.View> 

    } 

}); 

答えて

2

...

_pressRow: function(rowId){ 

    var clone = this.state.tours.map((item, i) => { 
     return { 
     ...item, 
     selected: i == rowId ? true : false 
     } 
    }); 

    this.setState({ 
     data: clone, 
     selected_row: rowId, 
     dataSource: this.state.dataSource.cloneWithRows(clone) 
    }); 

    }, 

あなたが明示的に古いデータに基づいて新しいオブジェクトを作成する必要があります。単に何らかの理由でプロパティを変更しても機能しません。

+0

こんにちは、あなたは解決策をJSフィドルを作ることができますか?私は同じことにこだわった –

+0

@PrateekRathore JS Fiddleは助けにならない、これはReact Native固有の問題で、js fiddleでネイティブ環境を実行することはできません。特にあなたの問題は何ですか?とにかくここでのソリューションは非常にシンプルで、古いデータソースを新しいオブジェクトにコピーしてからcloneWithRowsに渡すだけです。 – AllTheTime

+0

ありがとうございます、あなたのソリューションは実行可能なようです。まずそれを試してみよう。 –

関連する問題