ReactJS: повторный рендеринг не работает после изменения свойства компонента

#javascript #reactjs

#javascript #reactjs

Вопрос:

У меня проблема с реактом, и я не вижу, в чем может быть проблема. Для приведенного ниже кода: я создал компонент accordion, который будет отображаться и скрываться в зависимости от значения переменной состояния, называемой displayForm.

Когда кто-то нажимает внутреннюю кнопку InlineListComponent, это должно привести к появлению формы внутри InlineListComponent. Я передаю this.displayTireAccessories в свойство displayAction. Я сбрасываю переменную состояния для displayForm с false на true, что, как я думал, затем вызовет повторный рендеринг InlineListComponent, поскольку значение свойства displayForm изменилось. Похоже, что это не так. Я добавил консоль.регистрируйте инструкции для displayAction и метод рендеринга для InlineListComponent. Я могу видеть, где значение обновляется в displayForm, однако я не получаю никакой консоли.войдите для печати из InlineListComponent.

Чего мне не хватает в правилах повторного рендеринга, из-за чего это не сработало бы?

 <InlineListComponent
    orientation="Vertical"
    options={[{name: 'Tires', value: '1'},
        {name: 'Rims', value: '2'},
        {name: 'Hubcaps', value: '3'}]}
    text="name"
    label="Tire accessories (you must enter at least one)"
    key="tireAccessories"
    action={async (item, e) => {
        await this.displayTireAccessories(item);
    }}
    displayAction={async (e) => {
        await this.displayTireAccessories({});
    }}
    displayForm={this.state.displayForm}>
      <TireAccessories addAccessory={this.addAccessory}/>
</InlineListComponent>

this.displayTireAccessories = async (item) => {
  const {dispatch} = this.props;
  await this.setState({displayForm: true});
}

constructor(props){
    super(props);
    this.state = {
        displayForm: true
    }
}
  

Комментарии:

1. displayForm никогда не является ложным. Установите для него значение false в конструкторе.

2. Я установил для него значение false в целях тестирования. Это обычно верно.

3. Ах, я думаю, я не вижу, где это значение когда-либо меняется.

Ответ №1:

Вы не можете использовать await a setState напрямую, это ничего не возвращает. НО вы можете использовать его аргумент обратного вызова, чтобы дать обещание, что вы сможете await :

 new Promise((resolve) => {
  this.setState(state, resolve)
});
  

Кстати, каждый раз, когда у вас есть асинхронная функция, которая ожидает только одно обещание в конце функции, вы можете отбросить async await ключевые слова и просто вернуть обещание.

Итак :

 async (e) => {
    await this.displayTireAccessories({});
}
  

становится :

 (e) => this.displayTireAccessories({})