Я думаю, это может быть классифицировано как ошибка пользователя с моей стороны.Я привык к неизменности в языках, где это первоклассный гражданин, и он не отображал волю на JS с ImmutableJS.Мои ошибки (по крайней мере) заключались в следующем.
Во-первых, .equals()
по своему замыслу глубоко равен, и это не то, на что вы должны полагаться при реализации проверок на равенство в чем-то вроде shouldComponentUpdate
позвоните в React.
Во-вторых, чтобы получить максимальную отдачу от ImmutableJS, вам нужно правильно использовать его API.Вот пример.
const Foo = Immutable.Record({a:1})
const foo1 = Foo({a:2})
const foo2 = Foo({a:2})
const cache = Immutable.Map({'key': foo1})
// Doing it this way will force you to either use .equals() or .hashCode()
// to check for changes later
const wrongWay = cache.set('key', foo2)
console.log('This is false', wrongWay === cache)
console.log('This is true', wrongWay.hashCode() === cache.hashCode())
console.log('This is true and slow', wrongWay.equals(cache))
// Doing it this way will let you rely in reference equality
const rightWay = cache.mergeDeep({'key': foo2})
console.log('This is true', rightWay === cache)
console.log('This is true, but not needed', rightWay.hashCode() === cache.hashCode())
console.log('This is true and slow, but not needed', rightWay.equals(cache))
В-третьих, при использовании этого с React с намерением использовать PureComponent, который выполняет поверхностную проверку на равенство ссылок, вам нужно убедиться, что вы в конечном итоге получитеравенство ссылок (как в примере выше).
Наконец, иногда вам нужно выполнять дорогостоящие функции для состояния вашего приложения в React, чтобы иметь возможность получить реквизиты для вашего компонента.Чтобы избежать этого без всякой причины, вы можете использовать что-то вроде памятки Лодаша в сочетании с равенством ссылок на неизменяемых объектах, как в следующем надуманном примере.
const myFunction = _.memoize((immutableAppState) => {
return immutableAppState.immutableList.map(/* really expensive stuff returning new immutable objects based on other selectors */)
}, (immutableAppState) => immutableAppState.specificRecordThatChanges )
Если кто-то обнаружит здесь некоторые ошибки (или пропущенные ошибки)), пожалуйста, укажите их, и я обновлю объяснение.