2016-08-04 16 views
0

私はまだかなり新しい反応を示しています。親を再レンダリングすることなく親状態を変更しますが、子を再レンダリングします

私は、2つの異なる子コンポーネント間で情報を転送するために単独で使用される状態を持っています。最初の子はテーブル(BootstrapTable)です。行をクリックすると、onClick関数が呼び出されます。この関数は親ステートを、現在クリックされているすべての行の配列に設定します。そして、この情報は2番目の子に渡され、処理のためにバックエンドサーバーに行を送信することができます。現在、親の再レンダリングでは、テーブルのチェックマークが消去されます。そして、私はノードモジュールを使用しているので、カスタムテーブルを作成する前に、新しい小道具を受け取った直後にcheckBoxの状態を設定することができたので、手動でそれを何に戻すことができました以前はそうだった)。

私が見ることができる唯一の解決策は、再レンダリングせずに、変更された状態を子に渡すことです。これは可能なのですか?もしそうなら、代わりに何をすべきですか?

getInitialState : function() { 
    return (
     { 
      tableData : [], 
      selectedRows : [] 
     } 
    ); 
} 

onRowSelect : function() { 
    this.setState({selectedRows : this.refs.table.state.selectedRowKeys}, 
     function() { 
      console.log('selectedRows are ', this.state.selectedRows); 
     } 
    ); 
}, 
render : function() { 
    if (this.state.tableData.length === 0) { 
     return (<div>Loading...</div>); 
    } else { 
     return (
     <div className='full-table'> 
      <div className='react-table'> 
       <BootstrapTable 
        ref='table' 
        data={ this.state.tableData } 
        selectRow={ this.getSelectRowProps() } 
        options={ this.getOptions() } 
        insertRow 
        deleteRow 
        search 
        columnFilter 
        hover 
        pagination> 
        <TableHeaderColumn dataField='key' dataAlign='right' hidden={true} isKey={true}> 
         Key 
        </TableHeaderColumn> 
        <TableHeaderColumn dataField='in_progress_text' dataAlign='right'> 
         In-Progress 
        </TableHeaderColumn> 
        <TableHeaderColumn dataField='payment_id' dataAlign='right'> 
         Id 
        </TableHeaderColumn> 
        <TableHeaderColumn dataField='product_code' dataAlign='center'> 
         Type 
        </TableHeaderColumn> 
        <TableHeaderColumn dataField='status_description' dataAlign='center'> 
         State 
        </TableHeaderColumn> 
        <TableHeaderColumn dataField='payment_amount' dataAlign='center'> 
         Amount 
        </TableHeaderColumn> 
        <TableHeaderColumn dataField='payment_currency' dataAlign='center'> 
         Currency 
        </TableHeaderColumn> 
        <TableHeaderColumn dataField='process_state' dataAlign='center'> 
         Status 
        </TableHeaderColumn> 
        <TableHeaderColumn dataField='process_message' dataAlign='left'> 
         Message 
        </TableHeaderColumn> 
       </BootstrapTable> 
      </div> 
      <div className='submit-buttons'> 
        <SubmitButtonContainer selectedRows={this.state.selectedRows} /> 
      </div> 
     </div> 
    ); 
    } 
} 
+0

いくつかのコード例を追加してください。 – Hardy

+0

コード例が追加されました。 –

+0

ある種の磁束の実装にアクセスできない場合は、それを使ってコンポーネント間の通信ができます。 –

答えて

0

レンダリングは冪等でなければなりません。つまり、何も影響を与えずに親を何度もレンダリングすることができます。これは、React内で管理されている状態とReact以外で管理されている状態の問題のようです。リアクションは、それがレンダリングするものに影響を与えるすべての状態を所有し、管理することができれば、より良くなります。

+0

"あなたは、ある種の国家がある国の中で管理されており、ある国家は、国外から管理されていますか?私はreact-bootstrap-tableというテーブルを使用しています。おそらく、ノードモジュールが子供の状態を適切に管理していないと言っていますか? –

+0

ああ、あなたはReactですべてをやっている。私は、あなたがいくつかの第三者の非反応性のlibとインターフェースを取ろうとしていると思っていました。いずれの場合でも、私の最初の陳述書が立って、レンダリングは状態を変えるべきではない – John

+0

ここで実際にonRowSelect関数を使用しているかどうかはわかりませんが、親が子どもの状態に達している場合、それはあなたがReactで行うべきことではありません。 Reactは、データが常に親から子に流れる「単方向データフロー」と連動します。この状態は親にのみ生き、子どもたちに小道具を介して伝えられるはずです。 – John

関連する問題