摘要:原文地址什么是是指一旦被創(chuàng)建就不可以被改變的數(shù)據(jù),通過(guò)使用不可變數(shù)據(jù)可以讓我們很方便的去處理數(shù)據(jù)的狀態(tài)變化檢測(cè)等問(wèn)題,而且讓我們的程序變得更加的可預(yù)見(jiàn)怎么用大體使用深度轉(zhuǎn)換和為和淺轉(zhuǎn)換給倒數(shù)第一個(gè)賦值更多可以查看這里為什么要用其實(shí)從上面
原文地址:https://gmiam.com/post/react-...
什么是 Immutable Data ?Immutable Data 是指一旦被創(chuàng)建就不可以被改變的數(shù)據(jù),通過(guò)使用不可變數(shù)據(jù)可以讓我們很方便的去處理數(shù)據(jù)的狀態(tài)、變化檢測(cè)等問(wèn)題,而且讓我們的程序變得更加的可預(yù)見(jiàn)
怎么用?npm install immutable
var Immutable = require("immutable"); var map1 = Immutable.Map({a:1, b:2, c:3}); var map2 = map1.set("b", 50); map1.get("b"); // 2 map2.get("b"); // 50
大體使用 API
// 深度轉(zhuǎn)換 JS Object 和 Array 為 Immutable Map 和 List Immutable.fromJS({a: {b: [10, 20, 30]}, c: 40}) // Immutable.List 淺轉(zhuǎn)換 const $arr1 = Immutable.List([1, 2, 3]); $arr1.size // => 3 // 給倒數(shù)第一個(gè)賦值 const $arr2 = $arr1.set(-1, 0); // => List [ 1, 2, 0 ] const $arr3 = $arr1.insert(1, 1.5); // => List [ 1, 1.5, 2, 3 ] const $arr4 = $arr1.clear() // => List [] const $arr5 = $arr1.get(0) // => 1 // Immutable Map const $map1 = Immutable.fromJS({ a: {b: 1} ,c:2}); $map1.size // => 2 const $map2 = $map1.update("c",()=>3) // => Map { "a": Map { "b": 1 }, "c": 3 } const $map3 = $map1.updateIn("a.b",()=>3) // => Map { "a": Map { "b": 3 }, "c": 2 } const $map4 = $map1.merge({d:4}) // => Map { "a": Map { "b": 1 }, "c": 2, "d": 4 }
更多可以查看 這里
為什么要用 Immutable其實(shí)從上面的簡(jiǎn)單例子可以看出來(lái)對(duì)原數(shù)據(jù)的操作我們重新生成一個(gè)新的而不影響原來(lái)的就好了
JQ 有提供 $.extend 可以實(shí)現(xiàn)淺拷貝與深拷貝,另外 ES6 也提供原生的方法 Object. assign (淺拷貝),但其實(shí)我們大多數(shù)情況我們的數(shù)據(jù)都很復(fù)雜,淺拷貝滿(mǎn)足不了,然而對(duì)于深拷貝 Immutable 的性能很高
這是因?yàn)橐话闵羁截惗际前阉怨?jié)點(diǎn)全都復(fù)制一遍,而 Immutable 使用結(jié)構(gòu)共享,及對(duì)象樹(shù)中的一個(gè)節(jié)點(diǎn)變化則只會(huì)修改這個(gè)節(jié)點(diǎn)和受她影響的父節(jié)點(diǎn),其他節(jié)進(jìn)行共享,可以看下下面這個(gè)圖感受下
配合 React 使用來(lái)看一下上一章留下的問(wèn)題
import React from "react" import PureRenderMixin from "react-addons-pure-render-mixin" import { Map } from "immutable" var Test = React.createClass( { mixins: [ PureRenderMixin ], getInitialState: function () { return { value: { foo: "bar" } } }, onClick: function () { this.setState( { value: { foo: "bar" } }) }, render: function () { console.log( "re-render" ) return ( click ) } })
由于對(duì)比的是倆個(gè)引用不同的對(duì)象,所以每次都會(huì)觸發(fā) re-render,使用 Immutable 后
var Test = React.createClass( { mixins: [ PureRenderMixin ], getInitialState: function () { return { value: Map( { foo: "bar" }) } }, onClick: function () { this.setState(( {value}) => ( { value: value.set( "foo", "bar" ) }) ) }, render: function () { console.log( "re-render" ) return ( click ) } })
值相同時(shí) Immutable 會(huì)返回同一個(gè)引用,所以比對(duì)后,不會(huì)觸發(fā) re-render
對(duì)于父組件
React.createClass({ getInitialState: function() { return { value: { foo: "bar" } }; }, onClick: function() { var value = this.state.value; value.foo += "bar"; // ANTI-PATTERN! this.setState({ value: value }); }, render: function() { return ( ); } });
改造后
var Test = React.createClass( { getInitialState: function () { return { value: Map( { foo: "bar" }) }; }, onClick: function () { this.setState(( {value}) => ( { value: value.update( "foo", v => v + "bar" ) }) ); }, render: function () { return ( ); } });
可以預(yù)見(jiàn)的是組件一定會(huì)更新,因?yàn)槊看?Immutable Data 更改都會(huì)返回一個(gè)新對(duì)象,而不影響原來(lái)對(duì)象~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/80443.html
摘要:本文用于闡述模式的算法和數(shù)學(xué)背景,以及解釋了它為什么是里最完美的狀態(tài)管理實(shí)現(xiàn)。歡迎大家討論和發(fā)表意見(jiàn)。 本文用于闡述StateUp模式的算法和數(shù)學(xué)背景,以及解釋了它為什么是React里最完美的狀態(tài)管理實(shí)現(xiàn)。 關(guān)于StateUp模式請(qǐng)參閱:https://segmentfault.com/a/11... P-State, V-State 如果要做組件的態(tài)封裝,從組件內(nèi)部看,存在兩種不同的...
摘要:函數(shù)式編程,一看這個(gè)詞,簡(jiǎn)直就是學(xué)院派的典范。所以這期周刊,我們就重點(diǎn)引入的函數(shù)式編程,淺入淺出,一窺函數(shù)式編程的思想,可能讓你對(duì)編程語(yǔ)言的理解更加融會(huì)貫通一些。但從根本上來(lái)說(shuō),函數(shù)式編程就是關(guān)于如使用通用的可復(fù)用函數(shù)進(jìn)行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數(shù)式編程(Functional Programming),一...
摘要:的優(yōu)勢(shì)保證不可變每次通過(guò)操作的對(duì)象都會(huì)返回一個(gè)新的對(duì)象豐富的性能好通過(guò)字典樹(shù)對(duì)數(shù)據(jù)結(jié)構(gòu)的共享的問(wèn)題與原生交互不友好通過(guò)生成的對(duì)象在操作上與原生不同,如訪問(wèn)屬性,。 Immutable.js Immutable的優(yōu)勢(shì) 1. 保證不可變(每次通過(guò)Immutable.js操作的對(duì)象都會(huì)返回一個(gè)新的對(duì)象) 2. 豐富的API 3. 性能好 (通過(guò)字典樹(shù)對(duì)數(shù)據(jù)結(jié)構(gòu)的共享) Immutab...
摘要:知乎專(zhuān)欄前端給不了解前端的同學(xué)講前端掘金前端夠得到安全跨站請(qǐng)求偽造掘金前端面試問(wèn)題持續(xù)更新掘金向核心貢獻(xiàn)代碼的六個(gè)步驟基于的仿音樂(lè)移動(dòng)端個(gè)人文章用構(gòu)建組件網(wǎng)易嚴(yán)選感受開(kāi)發(fā)已完結(jié)掘金英文 2017-09-23 前端日?qǐng)?bào) 精選 [譯] 網(wǎng)絡(luò)現(xiàn)狀:性能提升指南前端夠得到Web安全3--點(diǎn)擊劫持/UI-覆蓋攻擊React, Jest, Flow, Immutable.js將改用MIT開(kāi)源協(xié)議N...
摘要:是一個(gè)前端頁(yè)面制作工具,方便產(chǎn)品,運(yùn)營(yíng)和視覺(jué)的同學(xué)迅速開(kāi)發(fā)簡(jiǎn)單的前端頁(yè)面,從而可以解放前端同學(xué)的工作量。支持恢復(fù)現(xiàn)場(chǎng)功能關(guān)閉頁(yè)面配置不丟失支持操作。提供了一個(gè)方法,用于的拆分。就是發(fā)出的通知,表示應(yīng)該要發(fā)生變化了。 pagemaker是一個(gè)前端頁(yè)面制作工具,方便產(chǎn)品,運(yùn)營(yíng)和視覺(jué)的同學(xué)迅速開(kāi)發(fā)簡(jiǎn)單的前端頁(yè)面,從而可以解放前端同學(xué)的工作量。此項(xiàng)目創(chuàng)意來(lái)自網(wǎng)易樂(lè)得內(nèi)部項(xiàng)目nfop中的page...
閱讀 1051·2021-11-24 09:39
閱讀 2283·2021-11-16 11:54
閱讀 2198·2021-11-11 17:22
閱讀 2454·2021-09-30 09:55
閱讀 3682·2021-08-12 13:22
閱讀 1693·2019-08-30 15:44
閱讀 1241·2019-08-29 12:12
閱讀 3321·2019-08-27 10:58