首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Immer使用指南

使用Immer时,只需要对 draft对象进行更改,draft对象会先记录用户的修改, 然后仅创建有变更的必要的属性副本,不会影响原始对象。...3.在使用Immer时,您不需要额外学习专用的api或数据结构, 使用普通的JavaScript数据结构并使用常规方式修改数据即可,操作简单且安全。 为什么使用Immer?...,这需要我们非常小心 nextState.push({ title: 'Tweet about it' }); 使用 Immer 使用 Immer,能让这个过程更直接。...为什么不直接使用深拷贝? 上面说了,draft 既然可以看做是 baseState 的深拷贝对象,为什么不直接使用深拷贝?...这是为什么? 原因就在于 Immer draft 的实现: draft 是个 Proxy 代理对象,对它的读写操作会走到内部定义的 getter/setter 里。

1.6K20
您找到你想要的搜索结果了吗?
是的
没有找到

为什么AlertDialog要使用Builder来构建

为什么 AlertDialog 使用Builder 模式?...首先说句废话,因为 AlertDialog 太过复杂,内部参数太多,然后不使用构建者模式那么 AlertDialog 的构造方法就可能是: AlertDialog(String title); AlertDialog...假如里面的参数还要多? 有的同学就说了,那可以只有一个默认的构造方法,通过这个构造方法生成对象后,然后再调用对象的各种 set 方法来调整。这么做的确是达到了最终的效果了。...你的这种做法是,先把孩子养大了,其实这个孩子不爱读书,身体不好,审美也不怎么样,然后你再强行的改变孩子。 而使用 Builder 是提前培养孩子,提前告诉孩子要怎么样,最后孩子长大了就是这个样的。...使用 Builder 你可以提前把你想要的属性通过 Builder 的 set 方法设置好,然后再去构建 AlertDialog 对象。 而不是构造出 AlertDialog 对象后再去修改属性。

50620

简单通俗的理解Vue3.0中的Proxy

文章首发于个人博客 目录 Proxy Vue 2.0 使用 Object.defineProperty()实现数据响应 Vue 3.0 中的Proxy Proxy的其他应用 Proxy 什么是代理,可以理解为在对象之前设置一个...ES6 原生提供 Proxy 构造函数,MDN上的解释为:Proxy 对象用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等)。 我们先来看看怎么使用。...为什么使用 Proxy 可以解决上面的问题?主要是因为Proxy是拦截对象,对对象进行一个"拦截",外界对该对象的访问,都必须先通过这层拦截。...让Object操作都变成函数行为。具体内容查看MDN Proxy的其他应用 除了即将发布的 vue 3.0 之外,还有哪些库使用了Proxy?...vue2.x使用 Object.defineProperty()实现数据的响应式,但是由于 Object.defineProperty()是对对象属性的操作,所以需要对对象进行深度遍历去对属性进行操作。

1.4K30

奇怪,免费版 IDEA 为什么不能使用 Tomcat

然而社区版却并不支持web开发,那该怎么办? 这里就教大家怎么使用。 首先打开settings ? 搜索plugins,在右边搜索tomcat, ?...这里选择smart tomcat插件,这个插件可以使用,选中这个插件,然后点击install进行安装 当插件装好后,他会让你重启idea,重启就可以,如果要是install失败, 出现如图类似的下载失败...,可以找到那个下载地址,在浏览器中打开这个链接就能下载了 ?...下载好后,解压这个文件,将这个解压后的这个jar包放入到idea plugins目录下。这里最好建一个smart tomcat目录,然后将jar包放入 ?...至于这个打包的话,还是加入maven插件来打包吧,这个插件未找到打包的方式,毕竟是免费的。

2.3K20

redux你用对了吗?

redux 的三大原则 redux 的开发和使用必须要遵循三大原则,即: 单一数据源:整个应用的 state 被储存在一棵 object tree 中,并且这个 object tree 只存在于唯一一个...什么是纯函数? 前面我们介绍 redux 三大原则的时候提到过,修改 state 要编写 reducer,且 reducer 必须是一个纯函数,那么问题来了,什么是纯函数?...简单总结一下,如果一个函数的返回结果只依赖他的参数,并且在执行过程中没有副作用,我们就把这个函数定义为纯函数。...如果你的工程使用的是dva,那么可以直接开启 dva-immer,就可以简化 state 的写法。...immer 库来改进我们的 reducer 写法: 安装: yarn add immer 使用: import produce from "immer"; const reducer = (state

54930

为什么String中hashCode方法里使用神奇因子 31

原因 2: 31 是一个质数:质数是只能被 1 和自身整除的数,使用质数作为乘法因子获得的散列值,在将来进行取模时,得到相同 index 的概率会降低,即降低了哈希冲突的概率。...但这里需要注意一个问题,为什么要是质数?。我觉得就是质数能很好的对只进行散列分布和减少哈希冲突--这感觉像一个传统。...意思是: 正如 Goodrich 和 Tamassia 指出的那样,如果你对超过 50,000 个英文单词(由两个不同版本的 Unix 字典合并而成)进行 hash code 运算,并使用常数 31,...ps:1就没算了,因为用1和没用是一样的--1乘以任何数都等于数本身,还算个啥 从上图可以看出,使用较小的质数做为乘子时,冲突率会很高。尤其是质数2,冲突率达到了 55.14%。...但为什选择了31? 先来说,为什么不是101?我们知道,这个质数是要参与到哈希值的计算的。String字符串的字符数有个三五七八个很常见。

8940

Java为什么不建议使用Executors来创建线程池

Java创建线程池方式 在Java中,创建线程池主要使用java.util.concurrent包下的Executors类。这个类提供了几种静态工厂方法,用于创建和管理不同类型的线程池。...LinkedBlockingQueue 的主要特点就几个 容量可选 阻塞操作 非阻塞操作 线程安全 高效的并发性能 为什么说容量可选?...因为我们如果单独使用这个LinkedBlockingQueue 那么你可以在创建 LinkedBlockingQueue 时指定一个容量,这将限制队列中可以存储的元素数量。...} } 说到这里感觉说多了,我们回归正题,如果我们使用标准的 newCachedThreadPool 方法,如果线程数设置和任务数不能够配合起来,就比如说设置的线程数是一定的,这个时候,任务数量越多...所以我们不推荐直接使用 Executors 来创建线程池,但是我们更推荐使用 ThreadpoolExecutor创建线程池。

16610

你不知道的高性能实现深拷贝的方式

深拷贝的做法一般分两种: JSON.parse(JSON.stringify(a)) 递归浅拷贝 第一种做法存在一些局限,很多情况下并不能使用,因此这里就不提了;第二种做法一般是工具库中的深拷贝函数实现方式...其实 Immer 这个库就是用了这种做法来生成不可变对象的,接下来就让我们来试着通过 Proxy 来实现高性能版的深拷贝。...如果没有修改过的话,就返回原属性,并且也不再需要对子属性对象遍历,提高了性能。...这里判断的核心是通过 value[MY_IMMER],因为只有当是 proxy 对象以后才会触发我们自定义的拦截 get 函数,在拦截函数中判断如果 key 是 MY_IMMER 的话就返回 target...没有修改过的话就直接返回原数据并且停止这个分支的遍历,如果修改过的话就从 copy 中取值,然后把整个 copy 中的属性都执行一遍 finalize 函数

1.4K30

为什么我坚持使用 JavaScript 函数声明

; 这个函数表达式体现了 ES 2015 的最大亮点——箭头函数(Arrow function),精简可爱,简直迷死人。第一次看到它时,我的内心戏是:“憋说话,吻我”!...——那么简单的函数竟然要 3 行!那些多余的字符怎么看都扎眼! 如今你们内心戏大概是: ? 我对箭头函数绝对是真爱,但要声明一个顶级函数时,我仍用“土气”的函数声明。 为什么?...maxNumberOfItemsInCart = 100; 也可能是: const maxNumberOfItemsInCart = (statusPoints) => statusPoints * 10; 如果使用函数声明就没有这个麻烦了...,稍大点儿的模块?...3 关于箭头函数 是的,箭头函数是真爱啊。 我一般会用箭头函数来通过一个小函数,将其作为更高阶函数的值。使用箭头函数时,还会使用地图、过滤器等,它们都是我的好朋友。

1.1K80

如何使用CSS创建高级动画,这个函数必须掌握

下面是官方的定义: 贝塞尔缓动函数是一种由四个实数定义的缓和函数,指定了贝塞尔曲线的两个控制点P1和P2,其端点P0和P3分别固定在(0, 0)和(1, 1)。...这个动画是由2个动画组成的,一个是沿x轴的动画,另一个是沿y轴的动画。X轴动画是一个沿X轴的普通线性动画。...x { to { left: 40vw; } 将其添加到球路径的 animation 属性中,如下所示 animation: x 4s linear forwards y轴动画是我们将使用...cubic-bezier函数的部分。...我们还介绍了贝塞尔以及如何使用它们来创建你自己的缓动函数。建议大家自己多多动手,才能更好的掌握 css 动画。 来源:https://www.smashingmagazine....

6.8K20

为什么 DNS 会使用 UDP 协议,假如使用 TCP 协议又会发生什么

今天要分析的具体问题是『为什么 DNS 使用 UDP 协议』,DNS 作为整个互联网的电话簿,它能够将可以被人理解的域名翻译成可以被机器理解的 IP 地址,使得互联网的使用者不再需要直接接触很难阅读和理解的...会使用 UDP 传输数据』以及『为什么 DNS 不止会使用 UDP 传输数据』两个问题,希望能够帮助各位读者理解 DNS 协议的全貌。...实际上,DNS 不仅使用了 UDP 协议,也使用了 TCP 协议,不过在具体介绍今天的问题之前,我们还是要对 DNS 协议进行简单的介绍:DNS 查询的类型不止包含 A 记录、CNAME 记录等常见查询...TCP 协议?』...总结 很多人认为 DNS 使用了 UDP 协议来获取域名对应的 IP 地址,这个观点虽然没错,但是还是有一些片面,更加准确的说法其实是 DNS 查询在刚设计时主要使用 UDP 协议进行通信,而 TCP

2.1K30

阿里代码规约为什么不让使用Executors包装好线程池

Executors.newCacheThreadPool 这个线程池是一个没有核心线程数的,且最大线程数是Integer.MAX_VALUE,且使用的队列是SynchronousQueue,这个队列有点反人类...这样我们就知道了因为没有核心线程数,所以刚来的任务我们都会进入到队列中,但是这个队列没有take也不会put,此时那就是说队列满了,然后就创建最大线程数。...从下面代码可以看出到最后也是使用了ThreadPoolExcutor这个类然定义了对应对参数。如设置了最大线程数的存活时间是0秒。...这个线程池虽然不会因为线程创建过多而oom但是会因为阻塞到队列而最后产生oom,因为他使用的是LinkedBlockingQueue 看源码我们可知他的最大长度也是Integer.MAX_VALUE,所以大量任務的提交也会导致...但是我们可以看到他使用的也是LinkedBlockingQueue且默认的大小为Integer.MAX_VALUE,所以也会OOM。

51520
领券