关于最佳实践的问题:不可变性和 React Native 的重新渲染

Question on Best practices: Immutability and re-rendering with React Native

我创建了一个不可变映射,目前正在将其与 redux 一起使用,我有一些关于不可变性的一般性问题。据我了解,当将道具传递给组件时,道具会进行初始渲染。如果 prop 的值被更改,它不会重新渲染,因为 Javascript 正在执行 === 操作来检查内存地址而不是检查该内存的值。不变性的作用是更改内存中的地址以触发重新渲染。我现在担心的是:如果我计划永远不使用存储在内存中旧地址中的地图,我们不是在浪费内存资源吗?此外,如果用户在不可变地图上重复单击,从而越来越多地扩展其内存使用量,这是否会导致性能问题?有没有办法在创建新地址后删除内存中的旧地址? 这是我的一些 Redux 代码,如果我做错了什么,你可以给我指点:

import {Map} from 'immutable'
const likesAndSaved = new Map()

function likesAndSavedReducer(state = likesAndSaved, action) {
  switch (action.type) {
    case 'updateObj':
      return state.set(action.payloadId, action.payloadData)
  
  default:
    return state;
 }
}

垃圾收集器从内存中删除未引用的对象。这也适用于 Immutable.js 地图中的“旧值”。

引用immutable-js.com的介绍页:

These data structures are highly efficient on modern JavaScript VMs by using structural sharing via hash maps tries and vector tries as popularized by Clojure and Scala, minimizing the need to copy or cache data.

当您构建一个包含 1000 个条目的 Map,然后更改单个条目时,这种类型的数据结构不必复制所有这些引用 and/or 值。相反,它只需要扩展 trie 的一小部分。因此,即使您保留对旧状态和新状态的引用,内存使用量的增加也将是最小的。当您清除对一个(例如旧的)状态的引用时,javascript 虚拟机可以随时清除该内存。

您甚至可能会提高性能,因为使用 === 浅层检查属性现在足以确定更改。您现在可以安全地使用 use PureComponent。无需深入分析对象以确定数据是否实际发生了变化。

免责声明:我是 Immutable.js 维护团队的一员,也在大型应用程序中大量使用它。