2017-12-14 19 views
3

ダム・チャイルド・コンポーネントから親状態を更新する方法はありますか?私は子供(ヘッダーとボディ)を持っているグリッドレイアウトを持っていると私は入力とフィルターとして使用するヘッダーをしたい。私は、親コンポーネントと私のグリッドをdbに接続し、すべてのデータをボディとヘッダーに渡しますが、ヘッダーからフィルターを接続してスマートコンポーネントに接続したいのです。私が見つけた唯一の方法は、GridHeaderを接続してデータを直接格納して渡すことです。ダム・チャイルドからRedux更新状態に反応する

私のsolutoinの問題は、異なるデータ型の別のページで私のグリッドを使いたいので、すべてのグリッドコンポーネントをダムにする必要があるということです。私のソリューションでは、私はすべてのデータ/テーブルの種類のための特定のGridHeaderを書いて、別のストアキーにすべてのヘッダーを接続する必要があります。一つはcatalog: store.catalog秒に接続されるusers: store.users等... 私のソリューションそのDRYないことが、私はそれを好まないでしょう:/ここ

を助けてください、私のGridHeaderです:

import React from 'react'; 

import { connect } from 'react-redux'; 
import { filterCatalog, setFilters } from '../../redux/actions/catalogActions'; 

@connect((store) => { 
    return { 
     catalog: store.catalog 
    }; 
}) 
export default class GridHeader extends React.Component { 
    constructor(props) { 
     super(props); 
     this.handleChange = this.handleChange.bind(this); 
     this.handleSubmit = this.handleSubmit.bind(this); 
    } 

    handleChange(e) { 
     const name = e.target.name; 
     let filters = { 
      [name]: e.target.value 
     } 
     this.props.dispatch(setFilters(filters)) 
    } 

    handleSubmit(e) { 
     if (e.which == 13){ 
      e.target.blur(); 
      //console.log('submit', this.props.catalog.filters) 
      this.props.dispatch(filterCatalog(this.props.catalog.filters)) 
     } 
    } 

    render() { 
     const headerItem = this.props.headers.map((x) => { 
      return (
       <th class={x.class} key={x.name}> 
       <div class="input-field"> 
        <input type={x.type} id={x.id} name={x.name} placeholder={x.placeholder} class={x.class} disabled={x.disabled} onChange={this.handleChange} onKeyPress={this.handleSubmit}/> 
        <label for={x.name}>{x.label}</label> 
       </div> 
       <a class="filter-button hidden"> 
        <i class="material-icons">backspace</i> 
       </a> 
      </th> 
      ) 
     }); 

     return (
      <thead> 
       <tr> 
        {headerItem} 
       </tr> 
      </thead> 
     ); 
    } 
} 
+0

あなたの質問は完全にはわかりません。変数をより一般的な名前にする必要がありますか? 'store =>({item:store.catalog})'と 'updateItem'をアクションとして使用しますか? – azium

+0

また、あなたの一般的な質問に答えるために、「ダム」のようなものはありません。それはより一般的なコンポーネントを記述するための言葉なので、どのコンポーネントからでも関数を呼び出すことができます。これらの関数はディスパッチコールをトリガーできます – azium

+0

これは良い結果ですが、1ページに2つのグリッドがあり、両方とも悪い同じストアオブジェクトに接続します:/ – Hovadko

答えて

0

あなたはラッパーコンポーネントを作成することができますGridHeaderのデータを提供します。たとえば:

まず、使用

@connect((store) => { 
    return { 
     catalog: store.catalog 
    }; 
}) 
export default class FirstWrapperGridHeader extends React.Component { 
    render() { 
    <GridHeader {...props} /> 
    } 
} 

第2の使用:

@connect((store) => { 
    return { 
     catalog: store.anotherData 
    }; 
}) 
export default class SecondWrapperGridHeader extends React.Component { 
    render() { 
    <GridHeader {...props} /> 
    } 
} 

あなたGridHeaderはReduxのストアに接続されていないする必要があり、ちょうどダムでなければなりません。

+0

しかし、私はGridHeaderから親(または私の場合は祖父母)にデータを取得したかったので、あなたのソリューションはGridHeaderにストアからデータを与えます – Hovadko

+0

したがって、あなたの状態を変更する子コンポーネントのコールバック関数への親とパス。私の別のアンサーをここでチェックしてくださいhttps://stackoverflow.com/questions/41638032/how-to-pass-data-between-child-and-parent-in-react-native/41638190#41638190 –

+0

しかしreduxですべての州はレフィックスによって処理されます。少なくとも私はどこかでそれを読んだ – Hovadko

関連する問題