Обновление состояния не переопределяет дочерний процесс с помощью props реагировать на редукцию - PullRequest
0 голосов
/ 22 ноября 2018

Я только начал использовать React Redux, так что я просто возился с ним над некоторыми из моих старых вещей.У меня есть компонент, который принимает реквизиты:

 <DataTable dataType = {this.state.dataType} 
        drinkArray = {this.state.drinkArray} 
        foodArray = {this.state.foodArray} 
        sort = {this.sort}/>

Все, что делает DataTable, это сопоставление с любым массивом, выбранным dataType, и отображение некоторой информации в таблице.

<div sytle = {{textAlign: 'center'}}>
  {(this.props.dataType === 'food' &&
    <table className = 'foodTable'>
      <tbody>
        <tr>
          <th>Name</th>
          <th  id = 'price' onClick = {(e) => {this.props.sort(e,'food')}}>Price</th>
          <th  id = 'stock' onClick = {(e) => {this.props.sort(e,'food')}}>Stock</th>
        </tr>
        {this.props.foodArray.map((x,i) => {
          return (
            <tr key ={i}>
              <td>{x.name}</td>
              <td>{x.price}</td
              <td>{x.stock}</td>
            </tr>
            )
          })
        }
      </tbody>
    </table>
  )}
//etc.

В основном проблема заключается в том, что я добавляю соединение с компонентом DataTable:

export default connect()(DataTable)

В этом случае я просто возился и не собирался ничего делать, но это вызывает странное поведение.не мог объяснить.Функция сортировки, которую я передал через реквизиты, больше не приводила к повторной визуализации DataTable.Тем не менее, если я изменю dataType родительского элемента нажатием кнопки, DataTable выполнит повторную визуализацию.И функция сортировки, и изменение dataType используют setState (), и я знаю, что функция сортировки вызывается и работает правильно, регистрируя ее на консоли.Родитель также перерисовывается при вызове функции сортировки.Если я удаляю соединение из компонента DataTable, функция сортировки снова перерисовывает DataTable.

Так что на самом деле мой вопрос заключается в том, почему смена одного из реквизитов через setState вызывает повторный рендеринг дочернего элемента, а изменение другого реквизита через setState - нет?Это всего лишь вопрос общего любопытства.

1 Ответ

0 голосов
/ 22 ноября 2018

connect() делает поверхностное сравнение (как оптимизация) - вероятно, sort только изменяет существующий массив, он должен создать новый объект (новый ref).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...