Angular 学习笔记 immer 使用
https://github.com/immerjs/immer#supported-object-types
immer 是用来做 immutable 的.
angular 的 change detech 机制, 有时候为了要性能好一些,我们需要用 onPush 然后得配合 immutable 来让 input 触发.
但是呢, immuable.js 写起来很丑, 原生 es6 得写法也不好看. 于是就有了 immer.
早前 immer 完全不支持 class 所以我就没有用,最近看了一下发现部分支持了. 所以开始用了.
import { produce, immerable } from "immer";
class Product {
constructor(data?: Partial<Product>) {
Object.assign(this, data);
}
[immerable] = true;
date: Date;
colors: Color[];
private _price : number;
public get price() : number {
return this._price;
}
public set price(v : number) {
this._price = v;
}
}
class Color {
constructor(data? : Partial<Color>) {
Object.assign(this, data);
}
[immerable] = true;
text: string
}
const product = new Product({ date: new Date(), price: 50, colors : [new Color({ text : 'dada' })] });
const newProduct = produce(product, next => {
next.price = 10;
});
console.log('instanceof Product', newProduct instanceof Product);
console.log('is new', newProduct !== product);
console.log('new value', newProduct.price === 10);
用法很简单. 调用, produce, 然后把对象传进去, next 是一个 proxy 对象, 我们像一般得操作方式就可以了, 最后会返回新得对象.
它并不是 clone 整个子孙对象哦,而是你有修改才会 clone.
如果是 class 要加上一个 symbol [immerable] = true
不支持的地方很多要特别注意哦 :
1. 如果要修改 Date 的, 必须自己 clone 一个新的.
2. array 只可以修改 length 不可以自己添加额外的属性.
3. prototype 是不会 clone 的, 保留原本指针
4. Built-in classes like Map and Set 不支持 (官网给了 workaround, 我也没用, 所以暂时不管)
5. 不支持 computed property (如果是一般写 getter setter 是可以的, 因为 getter setter 其实是 define 到了 prototype 上而不是对象上面, 如果你要 define 到对象上, 那 immer 就支持不到了)
Angular 学习笔记 immer 使用的更多相关文章
- angular学习笔记(三十一)-$location(2)
之前已经介绍了$location服务的基本用法:angular学习笔记(三十一)-$location(1). 这篇是上一篇的进阶,介绍$location的配置,兼容各版本浏览器,等. *注意,这里介绍 ...
- angular学习笔记(三十一)-$location(1)
本篇介绍angular中的$location服务的基本用法,下一篇介绍它的复杂的用法. $location服务的主要作用是用于获取当前url以及改变当前的url,并且存入历史记录. 一. 获取url的 ...
- angular学习笔记(三十)-指令(10)-require和controller
本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐direct ...
- angular学习笔记(三十)-指令(7)-compile和link(2)
继续上一篇:angular学习笔记(三十)-指令(7)-compile和link(1) 上一篇讲了compile函数的基本概念,接下来详细讲解compile和link的执行顺序. 看一段三个指令嵌套的 ...
- angular学习笔记(三十)-指令(7)-compile和link(1)
这篇主要讲解指令中的compile,以及它和link的微妙的关系. link函数在之前已经讲过了,而compile函数,它和link函数是不能共存的,如果定义了compile属性又定义link属性,那 ...
- angular学习笔记(三十)-指令(6)-transclude()方法(又称linker()方法)-模拟ng-repeat指令
在angular学习笔记(三十)-指令(4)-transclude文章的末尾提到了,如果在指令中需要反复使用被嵌套的那一坨,需要使用transclude()方法. 在angular学习笔记(三十)-指 ...
- angular学习笔记(三十)-指令(5)-link
这篇主要介绍angular指令中的link属性: link:function(scope,iEle,iAttrs,ctrl,linker){ .... } link属性值为一个函数,这个函数有五个参数 ...
- angular学习笔记(三十)-指令(2)-restrice,replace,template
本篇主要讲解指令中的 restrict属性, replace属性, template属性 这三个属性 一. restrict: 字符串.定义指令在视图中的使用方式,一共有四种使用方式: 1. 元素: ...
- angular学习笔记(三十)-指令(1)-概述
之前在 angular学习笔记(十九)-指令修改dom 里面已经简单的提到了angular中的指令,现在来详细的介绍 '指令' 一.指令的创建: dirAppModule.directive('dir ...
随机推荐
- idea 如何新建一个Maven项目并且写第一个servlet
使用idea已经有段时间了,但是一直没有自己亲自新建一个项目,从头开始写一个Servlet,今天就来学习一下,并且记一个笔记. 一. 1.首先,打开idea new-->Project 2.选择 ...
- 从内核3.7版本开始,Linux就开始支持VXLAN 到了内核3.12版本,Linux对VXLAN的支持已经完备,支持单播和组播,IPv4和IPv6。
一.关于VXLAN VXLAN 是 Virtual eXtensible LANs 的缩写,它是对 VLAN 的一个扩展,是非常新的一个 tunnel 技术,在Open vSwitch中应用也非常多. ...
- 如何禁用Chrome浏览器的Flash
使用Chrome浏览器时,经常会因为Flash而导致CPU占用过多,系统变慢.如果你常访问的网站很少用到的Flash或者页面上的Flash不是网站的核心功能,那么建议禁用Flash.禁用Flash的步 ...
- 在调用self对象时,本类调用用Win32Info().collect()
import platform class Test: def test(self): func = getattr(self,'windows') func() @staticmethod def ...
- 如何解决Access操作或事件已被禁用模式阻止
操作或事件已被禁用模式阻止.本来是Access安全设置的一部分,可以防止一些危险性的宏自动运行损坏数据,但是如果是自己在设计或是修改Access数据库的时候,这个就比较烦人了,一次次的提示,每次都需要 ...
- Java8的时间日期API
原先的时间 api 大部分已经过时了 Date构造器 需要传入年月日 但是对时间的加减操作比较麻烦 Calenda 加减比较方便 使用 LocalDate. LocalTime. LocalDa ...
- LDFLAGS 与 LDLIBS
今天下载了开源程序“贪吃蛇” (github地址 : https://github.com/taylorconor/tinytetris.git) 在编译时,出现如下错 linux:~/code/ot ...
- g++编译时遇到问题undefined reference to
文件目录结构体为: src 和include 分别用来存放.cpp文件和 .hpp文件 其中:src文件夹下有需要的文件 simulator_client.cpp crc32.cpp : includ ...
- VMware Workstation 将虚拟机挂起后,电脑会很卡,SCSI转换成IDE就可以了
摘自:http://www.360doc.com/content/15/0405/09/10098873_460727712.shtml 用过 VMware Workstation 的人,不知道有没有 ...
- Java Sound : audio inputstream from pcm amplitude array
转载自:http://ganeshtiwaridotcomdotnp.blogspot.com/2011/12/java-sound-making-audio-input-stream.html In ...