Immer.js怎么用

发布时间:2022-03-14 15:25:19 作者:iii
来源:亿速云 阅读:172

这篇文章主要讲解了“Immer.js怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Immer.js怎么用”吧!

简介

React的Reconciliation解决了虚拟DOM更新的问题,但没有对在什么场景下优化更新给出解决方案,它不像Reactive那样能自动跟踪状态变化,而是把这个难题通过shouldComponentUpdate这个口子留给了开发者。于是开发者需要针对前后状态的变化进行对比,以决定要不要继续渲染更新DOM。如果状态对象的层次很深很复杂,那么这个对比必然会很痛苦。

但是话说回来,如果比较得很痛苦,那很有可能状态对象设计的有问题

于是Immutable诞生了,简单的可以把Immutable看做是一个黑盒,输入是对象A,输出是一个对象A‘。

用公式表示就是

假如输入对象A1和A2完全一样(但仍然不是同一个实例),那么输出的A1'和A2’能方便地比较出是否相等(提供了API直接调用来比较),同时也能从A1'或A2'里拿出A1或A2的原始数据(但A1'和A2‘仍然是两个不同的实例)。后续更新的操作也都是要通过A'的API来进行了,也就是说原始对象已经离你远去。

如果真没任何变化,那也称不上是后浪了。它基于copy-on-write机制——在当前的状态数据上复制出一份临时的草稿,然后对这份草稿涂涂改改,最后生成新的状态数据。借力于ES6的Proxy,只需要直接修改对象即可,不需要调用复杂的API(几乎只用到一个produce函数!!!),跟响应式的自动跟踪是一样的。

官网文档将其比喻成你的小秘(不是小蜜),这个小秘复制一份你的信给你涂改,然后根据涂改能帮你打印出一份新的修改后的信件。

 import produce from "immer"

 const baseState = [

     {

         todo: "Learn typescript",

         done: true

     },

     {

         todo: "Try immer",

         done: false

     }

 ]

 const nextState = produce(baseState, draftState => {

     draftState.push({todo: "Tweet about it"})

     draftState[1].done = true

 })

如果了解响应式的话,会发现

在React里,setState就变成了

 this.setState(

     produce(draft => {

         draft.user.age += 1

     })

 )

在Redux里,Reducer就变成了

 const byId = produce((draft, action) => {

     switch (action.type) {

         case RECEIVE_PRODUCTS:

             action.products.forEach(product => {

                 draft[product.id] = product

             })

     }

 })

default分支也可以省略,因为produce方法默认返回原始对象实例。

也有个例外,就是如果要返回undefined还不能直接干,得要返回nothing

 import produce, {nothing} from "immer"

 const state = {

     hello: "world"

 }

 produce(state, draft => {})

 produce(state, draft => undefined)

 // Both return the original state: { hello: "world"}

 produce(state, draft => nothing)

 // Produces a new state, 'undefined'

感谢各位的阅读,以上就是“Immer.js怎么用”的内容了,经过本文的学习后,相信大家对Immer.js怎么用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. WITH语句怎么用
  2. 怎么用vuex

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

immer.js

上一篇:js如何计算时间差

下一篇:js六种数组去重的方法是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》