ПРИМЕЧАНИЕ, ЧТО ЭТО РЕШЕНО
Я не ожидаю, что кто-то решит проблему, потому что отсутствует много кода, но, возможно, я что-то здесь упускаю.
Я создаю замыкание в mergeProps для использования в качестве действия удаления. Он получает selectedItems
из состояния или данных с сервера, если форма еще не затронута. Пользователь может удалять или добавлять элементы из списка, но когда я добавляю 2, а затем удаляю верхний элемент, происходит что-то странное.
Согласно журналам, замыкание не воссоздается, но длина selectedItems равна 1 (он отсутствует без повторного создания замыкания).
Это происходит как в Chrome, так и в Firefox, код:
const mergeProps = (
stateProps,
dispatchProps,
ownProps,
) => {
//make a copy of selected items to be used for the closure of
// onDelete in case but is caused by other code mutating it
const copy = JSON.parse(
JSON.stringify(stateProps.selectedItems || []),
);
console.log(
new Date().getTime(),
'creating closure, length is:',
copy.length,
);
return {
...stateProps,
...ownProps,
onDelete: ({ id: entityId, entityType }) =>
console.log(
'in the closure, length is now:',
copy.length,
) ||
onDeleteDataFilter(
entityId,
entityType,
ownProps.onChange,
copy,
),
};
};
Когда я добавляю 2 элемента и удаляю верхний элемент, вывод консоли будет таким:
1553159774414 creating closure, length is: 2
in the closure, length is now: 1
1553159785005 creating closure, length is: 0
Мне кажется невозможным, что copy
можно изменить без повторного вызова close, но это то, что я получаю.
selectedItems были обработаны таблицей начальной реакции, и, похоже, это имеет свое собственное состояние, поэтому каждая строка получает свою onDelete
функцию.
Изменение переменных замыкания может произойти только тогда, когда вы изменяете переменную, и в этом случае я просто записал неправильную вещь, думая, что массив был изменен, но вместо этого каждая строка в таблице начальной загрузки получила свою собственную функцию замыкания (см. Ответ).