亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

React系列之 Immutable

cc17 / 1422人閱讀

摘要:原文地址什么是是指一旦被創(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

相關(guān)文章

  • 少婦白潔系列React StateUp Pattern, Explained

    摘要:本文用于闡述模式的算法和數(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)部看,存在兩種不同的...

    20171112 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.16 - 淺入淺出 JavaScript 函數(shù)式編程

    摘要:函數(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),一...

    csRyan 評(píng)論0 收藏0
  • React-redux進(jìn)階Immutable.js

    摘要:的優(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...

    孫淑建 評(píng)論0 收藏0
  • 2017-09-23 前端日?qǐng)?bào)

    摘要:知乎專(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...

    BingqiChen 評(píng)論0 收藏0
  • 一個(gè)基于React整套技術(shù)棧+Node.js的前端頁(yè)面制作工具

    摘要:是一個(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...

    ermaoL 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<