Для реакции, immutablity означает более или менее:
После того, как вы прошли объект среагировать в качестве реквизита или в состоянии, вы никогда не должны изменить тот же объект. Сделайте копию в новый объект и измените копию.
Реакт не имеет методов жизненного цикла, вызванных «изменением реквизита». Функции жизненного цикла React будут выполняться всякий раз, когда более высокий компонент переходит в новый набор реквизитов. Даже если новые реквизиты совпадают с старыми реквизитами, реакция будет по-прежнему работать на всех его жизненных циклах.
Есть 2 причины, почему неизменность важна:
- Всякий раз, когда вы определяете новые подпорки, реагирует сравнивает новый реквизит со старым реквизитом, и решает, нужно ли обновить DOM. Если они совпадают, реакция не будет обновлять DOM (даже если все жизненные циклы выполнялись).
- Иногда вам нужен собственный код для сравнения новых реквизитов со старыми реквизитами (например, для изменения цвета или любого другого). Некоторые методы жизненного цикла предоставляют вам доступ к новым и старым реквизитам.Чтобы ваш код был надежным, вы должны убедиться, что реквизит не изменится после того, как вы передадите им ответ.
Упрощенный пример, когда дела идут прямо:
oldUser = { name: "Bill" } // points to object with name Bill
<Component user={oldUser}/>
newUser = Object.assign(oldUser, { name: "Dave" }) // new object
<Component user={newUser}/>
// newUser != oldUser (different objects):
// react will run render function + update DOM
пример, где дела идут плохо:
oldUser = { name: "Bill" } // points to object with name Bill
<Component user={oldUser}/>
newUser = oldUser // newUser points to the same object as oldUser
newUser.name = "Dave" // Now also oldUser.name == "Dave"
<Component user={newUser}/>
// newUser == oldUser (same objects + both have name "Dave"):
// react will run render function, but will NOT update DOM