2016-05-26 2 views
0

Я пытаюсь реализовать функциональность фильтра в компоненте. Отфильтрованные строки зависят от объекта состояния, а исходный список проходит через «реквизит». Я инициализирую состояние в компонентеWillMount, но список в реквизитах всегда пуст, однако, когда я делаю console.log в методе render(), значения есть. Что я делаю не так ?Фильтрация моей таблицы в реакции не работает

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

Сложно сказать основываясь на описании, но если вы пытаетесь пройти через initial valueprops, а затем имеют значения, которые в вашем state вот пример. Значения для вашего filtered values обновляются каждый раз, когда ваш onChange будет вызываться в вашем рендере и сохраняется в пределах selected.

Это будет работать для безысходных вызовов, в вашем рендере вы ждете, пока состояние не будет установлено на родительском объекте, прежде чем разрешить рендеринг дочернего компонента.

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

Внутри компонентаDidMount() вы устанавливаете свое состояние для возможных значений, которые являются синхронными. Когда вы получите свои значения, вызовите 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} 
      } 

Пример детской компе

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

@ Ахил, я прошел через это раньше и должен был получить помощь. Чтобы позволить вам получить состояние в родительском, вам необходимо передать его через функцию из родителя. Вы можете увидеть вызов this.props.onChange (selected) в onChange. Это передаст выбранные детали родительскому компоненту. Затем этот родительский компонент должен использовать это, чтобы установить его состояние. Вот как вы можете передать данные обратно родителям. Вам нужно обязательно подождать, прежде чем рендерить свой компонент. – ALM

+0

Спасибо за ваш ответ, я бы попробовал это. – Akhil

Смежные вопросы