В issue 303 в репозитории Redux Дан Абрамов дает пример функции, которая может обернуть метод subscribe
магазина, чтобы передать предыдущее состояние подписчику.Сравнить предыдущее состояние
function observeStore(store, select, onChange) {
let currentState;
function handleChange() {
let nextState = select(store.getState());
if (nextState !== currentState) {
currentState = nextState;
onChange(currentState);
}
}
let unsubscribe = store.subscribe(handleChange);
handleChange();
return unsubscribe;
}
По какой-то причине это не работает для меня. В первый раз мой onChange
обработчик называется currentState
- undefined
, как и следовало ожидать. Однако при каждом последующем изменении состояния свойства currentState
эквивалентны по значению (==
) значениям nextState
. Два объекта состояния не являются одним и тем же объектом, хотя из-за того, что nextState === currentState
оценивает false
.
Скорее всего, у меня что-то действительно очевидное. Как захватить предыдущее состояние в закрытии?
'==' не является «эквивалентностью по значению». Вы можете легко проверить, что '{}! = {}'. См. Также: http://stackoverflow.com/questions/359494/does-it-matter-which-equals-operator-vs-i-use-in-javascript-comparisons – mik01aj
То, что я пытался передать, состоит в том, что два состояния являются определенно разными объектами ('! =='), но свойство, которое я изменил, равно в двух экземплярах. Это похоже на то, что наблюдатель видит две копии обновленного состояния, а не старое и новое состояние. –
Argh! Я должен делать что-то еще неправильно в моем приложении, потому что http://jsbin.com/xebomi/edit?js,console иллюстрирует, что он работает. (Ну, с одной модификацией оригинального кода Дэна.) –