2016-05-26 16 views
0

動作しない反応で、私のテーブルをフィルタリングします。フィルタリングされた行は状態オブジェクトに依存し、初期リストは「小道具」を通過しています。私はcomponentWillMountの状態を初期化するが、私は値があるのrender()メソッドではconsole.logを行う際小道具内のリストは、しかし、常に空です。私は間違って何をしていますか?私はコンポーネントのフィルタ機能を実装しようとしています

componentDidMount() { 
    this.setState({ 
     data: this.props.possibleValues, 
     filteredValues: this.props.possibleValues 
    }); 
    console.log(this.props.possibleValues) //empty 
    console.log(this.state.filteredValues) //empty 
    } 
+0

三素早く物事を作成する前に完了するまで待機しますレンダリング。 1.私たちが遊ぶことができるjsbinに最小の例を投稿できますか? 2.データが小道具を介して入ってくる場合、それをなぜ州に割り当てるのですか? 3.ステートが小道具に基づいており、同期している場合、それを初期化することは 'componentDidMount'ではなくコンストラクターに属します。 –

+0

あなたはそれをせずにあなたの例を投稿することができます、それは助けが困難です。私はまた、あなたが状態を使用しようとしている場合、これはコンストラクタで行うべきだと思います。 – ALM

+0

私はコンポーネント階層に深いので、最小限の例を作成するのは難しいようです。私は非同期的にデータをロードしていますが、それは問題でしょうか?もしそうなら、私は状態をどこで初期化すべきですか? – Akhil

答えて

1

そのハードは、あなたの説明に基づいていますが、props経由initial valueを通過した後、あなたのstate内に保持された値を持つようにしようとしている場合は、ここでの例であると言うこと。あなたのfiltered valuesの値は、あなたのonChangeがあなたのレンダリングやselected内に格納して呼ばれることになるたびに更新されます。

これは、あなたの状態は子コンポーネントをレンダリングすることを許可する前に、親オブジェクトに設定されるまで、あなたは待つレンダリングで、ansychronous通話のために動作します。

someAsyncSetup() { 
... doing something 
     this.setState({ 
      possibleValues : possibleValues 
     }); 
} 

componentDidMount()の内部では、同期可能な値の状態を設定します。値を取得したらsetState()を呼び出します。その後、インクルードは、それが子コンポーネント

{this.state.possibleValues != null &&... 
    <ExampleChild... 

親コンプの例

constructor(props) { 
    super(props); 
    this.state = {possibleValues: null}; 
    this.onChange = this.onChange.bind(this); 
    this.someAsyncSetup = this.someAsyncSetup.bind(this); 
} 

onChange(selected) { 
    this.props.onChange({ selected }); // you may need to call your parent props again 
} 

someAsyncSetup() { 
... doing something 
      this.setState({ 
       possibleValues : possibleValues 
      }); 
} 

componentDidMount() { 
    this.someAsyncSetup(); // inside here you set your state for possible values. Then the render will wait until it is completed before creating the child component 
} 

{this.state.possibleValues != null && 
       <ExampleChild 
        onChange={this.onChange} 
        possibleValues={this.state.possibleValues} 
      } 

子COMPの例

class ExampleChild extends React.Component { 
    constructor(props) { 
     super(props); 
     this.state = { selected: this.props.filteredValues }; 
     this.onChange = this.onChange.bind(this); 
    } 

    // onChange we want to set the list of selected values 
    onChange(selected) { 
     this.setState({ selected }); 
     // call the parent component's onChange so that we set the values 
     // within the parents component state 
     this.props.onChange(selected); 
    } 

    render() { 
     return (
      <someComp 
      options={this.props.possibleValues} 
      selected={this.state.selected} 
      defaultValue={this.props.filteredValues} 
      onChange={this.onChange} /> 
     ) 
    } 
} 
+0

私たちは親コンポーネントの状態の値をイキたい場合は、なぜ私たちは子コンポーネントの状態を必要としますか?また、非同期にデータをロードしています。コンストラクタで初期化しようとすると、小道具は空です。 – Akhil

+0

@Akhil私はこれを前にして助けを求めなければなりませんでした。親に状態を取得させるためには、親からの関数を介して状態を渡す必要があります。あなたはonChangeでthis.props.onChange(選択)コールを見ることができます。選択した詳細が親コンポーネントに渡されます。この親コンポーネントは、それを使って状態を設定する必要があります。それはあなたが細部を親に戻す方法です。 コンポーネントをレンダリングする前に必ず待つ必要があります。 – ALM

+0

あなたの答えをありがとう、私はこれを試してみましょう。 – Akhil

関連する問題