Задача
В ConnectedList
, state.listItems
не было пустым, поэтому List
отображает экземпляр ConnectedListItem
.
Однако, state.listItems
был очищен действием CLEAR_LIST_ITEMS
прямо перед тем, как ConnectedListItem
смог получить его из хранилища, из-за чего он не нашел совпадений у опустошенного state.listItems
.
Эта ошибка требует очень точного времени для воспроизведения, что может объяснить, почему изменение вещи исправляет ее (например, если рендеринг ConnectedListItem
завершается до CLEAR_LIST_ITEMS
).
Решение
Если вы укажете значение по умолчанию listItem
(например, const ListItem = ({ listItem = {} })
), это предотвратит сбой, и ConnectedList
правильно выполнит повторную визуализацию с обновленным state.listItems
.
Я бы порекомендовал не делать state.listItems.map(listItem => listItem.id)
в connect
, так как это вызывает постоянную повторную визуализацию компонента, поскольку создается другой массив, даже если state.listItems
не изменился. Сопоставление должно быть сделано в компоненте или с помощью перевыбрать .
Более чистым подходом является передача всего элемента на ListItem
, что устраняет необходимость подключения ListItem
к магазину:
const ListItem = ({ item }) => <li>{item.text}</li>;
const List = ({ listItems }) => (
<div style={{ backgroundColor: 'lightgreen' }} className="border">
I'm List and I get a list of ids from the store. I pass each id to a ListItem.
<ul>{listItems.map(item => <ListItem key={item.id} item={item} />)}</ul>
</div>
);
const ConnectedList = connect(state => ({
listItems: state.listItems,
}))(List);