当前位置: 首页 > 知识库问答 >
问题:

前端 - 为什么要使用immer?

巫欣荣
2023-05-12

我没想要改变深度隐藏的子节点的数据,我每次用扩展运算符创建一个新的obj,然后手动改子节点数据不也挺省事儿的吗?为啥非得要用immer库阿,是不是类似于redux这种库不准许在reducer里面写 let newObj = {...obj} 这样的代码阿?还是什么其他的原因阿?你无非就是要求setState的时候传一个新的obj进去麻,我的土办法也行的通阿?

案例来源: https://redux-toolkit.js.org/usage/immer-reducers

function App() {
  const [obj, setObj] = useState({
    name: "feeco",
    age: 30,
    address: {
      country: "ca",
      city: "calgray",
      area: {
        location: "north",
        direction: "west",
        code: [1, 2],
      },
    },
  })
  //自己的土办法 也可以行的通
  const changeObj = () => {
    let newObj = { ...obj }
    newObj.address.area.location = "not a location"
    newObj.address.area.code = [2, 3]
    console.log(obj)
    console.log(newObj)
    setObj(newObj)
  }

  //redux reducer要求写的方式
  const changeObj = () => {
    setObj({...obj,address:{...obj.address,area:{...obj.address.area,location:"not a location"}}})
  }
  return (
    <div>
      <ReactJson src={obj} />
      <button onClick={changeObj}>button</button>
    </div>
  )
}

共有2个答案

邵华皓
2023-05-12

There are several reasons why you must not mutate state in Redux:

It causes bugs, such as the UI not updating properly to show the latest values
It makes it harder to understand why and how the state has been updated
It makes it harder to write tests
It breaks the ability to use "time-travel debugging" correctly
It goes against the intended spirit and usage patterns for Redux

鲁英卫
2023-05-12

js的世界语法糖很多的,为的就是解放代码量,关注业务开发,手动实现immutable 是可行的,但是真的去实现一个无限深度最高效的immutable是不容易的,再附加上具体操作的数据类型,可能是对象、可能是数组,还可能是循环引用对象,实际上业务足够复杂的时候你要处理这个函数就很难了,因此产生了一套库,附带了一些快捷操作方法。

PS: 如果你系统中的immutable数据操作层级都很有限,复杂度不高,确实可以不用工具,我自己的业务就从来不用。

 类似资料:
  • 本文向大家介绍为什么要使用 kafka,为什么要使用消息队列?相关面试题,主要包含被问及为什么要使用 kafka,为什么要使用消息队列?时的应答技巧和注意事项,需要的朋友参考一下 缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。 解耦和扩展性:项目开始的

  • 问题内容: 我注意到,Oracle JDK中使用了许多Java 8方法,如果给定的对象(参数)为,则会在内部抛出该方法。 但是,如果取消引用对象,则将被抛出。那么,为什么要做这个额外的null检查并抛出 ? 一个明显的答案(或好处)是它使代码更具可读性,我同意。我很想知道在方法开始时使用的其他原因 。 问题答案: 因为您可以这样做使事情变得 明确 。喜欢: 或更短: 现在您 知道了 : 当 成功使

  • 问题内容: 我是Mockito的新手,我已经开始学习它。但是我有一些疑问。为什么我们需要使用Mockito?据我所知,它用于模拟(创建虚拟对象)并在具有实际运行代码之前编写测试用例。但是,如果我想测试已经实施的代码以检查它们是否正常运行,该怎么办。我如何使用Mockito进行测试? 例如,我有CRUD方法,我想通过使用我的Create方法在数据库中实际插入数据来测试Create是否正常运行,这与其

  • 本文向大家介绍为什么要使用RabbitMQ?相关面试题,主要包含被问及为什么要使用RabbitMQ?时的应答技巧和注意事项,需要的朋友参考一下 可靠性(Reliability) RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。 灵活的路由(Flexible Routing) 在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ 已

  • 问题内容: 为什么我们要使用方法设置参数,因为我们可以通过在中设置参数并使用来获取参数来完成同样的事情? 问题答案: 是动态的,其可以被设置和复位运行期间。 所指定的是静态的,在应用程序的生命周期内不会更改。 例: 数据库属性,例如数据库名称配置属性。它将主要配置为上下文 并且,如果要设置基于运行时更改派生的属性值,则上下文属性应为“上次登录的用户”或“失败次数”。

  • 本文向大家介绍为什么要使用 hibernate?相关面试题,主要包含被问及为什么要使用 hibernate?时的应答技巧和注意事项,需要的朋友参考一下 hibernate 是对 jdbc 的封装,大大简化了数据访问层的繁琐的重复性代码。 hibernate 是一个优秀的 ORM 实现,很多程度上简化了 DAO 层的编码功能。 可以很方便的进行数据库的移植工作。 提供了缓存机制,是程序执行更改的高效