React替換傳統(tǒng)拷貝方法的Immutable使用
immutable
它是一款代替?zhèn)鹘y(tǒng)拷貝方式的第三方庫(kù)
優(yōu)勢(shì):
- 在新對(duì)象上操作不會(huì)影響原對(duì)象的數(shù)據(jù)
- 性能好
安裝使用
1.下載 npm i immutable
2.導(dǎo)入 import {Map} from 'immutable'
Map
語(yǔ)法:Map(對(duì)象)
賦值:set("屬性名","新值")
取值:get("屬性名")
toJS()轉(zhuǎn)回普通對(duì)象
import React, { Component } from 'react';
/**
* 1.下載 npm i immutable
* 2.導(dǎo)入 import {Map} from 'immutable'
*/
import {Map} from 'immutable'
var obj={
name:"碰磕",
age:20
}
var objImmu=Map(obj);
var newobjImmu=objImmu.set("name","pengkeStudy");
// console.log(objImmu,newobjImmu)
//get('屬性')獲取值
console.log(objImmu.get("name"),newobjImmu.get("name"));
//toJS轉(zhuǎn)回普通對(duì)象
console.log(objImmu.toJS(),newobjImmu.toJS());
/*
//寫(xiě)法一
class Immu02 extends Component {
state={
info:Map({
name:"碰磕",
age:20
})
}
render() {
return (
<div>
Immu02
<button onClick={()=>{
this.setState({
info:this.state.info.set('name',"pengkeStudy").set('age',1000)
})
}}>修改它們的值</button>
{this.state.info.get("name")}----
{this.state.info.get("age")}
</div>
);
}
}*/
//寫(xiě)法二
class Immu02 extends Component {
state={
info:{
name:"碰磕",
age:20
}
}
render() {
return (
<div>
Immu02
<button onClick={()=>{
let old=Map(this.state.info)
let newImmu=old.set("name","pengkeStudy").set("age",10000)
this.setState({
info:newImmu.toJS()
})
}}>修改它們的值</button>
{this.state.info.name}----
{this.state.info.age}
</div>
);
}
}
export default Immu02;嵌套Map
Map中對(duì)象中的對(duì)象還要套上Map
可以通過(guò)map的get方法獲取值向組件傳值.,從而完美的解決了組件的無(wú)效刷新
shouldComponentUpdate進(jìn)行判斷決定是否需要刷新
import React, { Component } from 'react';
import {Map} from 'immutable'
class Immu03 extends Component {
state={
info:Map({
name:"碰磕",
age:20,
hobbit:Map({
likeone:"運(yùn)動(dòng)",
liketwo:"學(xué)習(xí)"
})
})
}
render() {
return (
<div>
Immu03
<button onClick={()=>{this.setState({
info:this.state.info.set("name","學(xué)習(xí)啊啊啊")
})}}>修改</button>
{this.state.info.get("name")}
<Child hobbit={this.state.info.get("hobbit")} ></Child>
</div>
);
}
}
class Child extends Component{
shouldComponentUpdate(nextProps,nextState){
//判斷hobbit的值是否更新
if(this.props.hobbit===nextProps.hobbit){
return false;
}
return true;
}
render(){
return(
<div>Child</div>
);
}
componentDidUpdate(){
console.log("子組件更新了");
}
}
export default Immu03;
List
可以使用數(shù)組的屬性方法
import React, { Component } from 'react';
import {List} from 'immutable'
var arr=List([1,231,1])
let arr2=arr.push(4)//不會(huì)影響原對(duì)象結(jié)構(gòu)
let arr3=arr2.concat([12,323,123])
console.log(arr,arr2,arr3);
class Immu04 extends Component {
state={
favor:List(['吃飯','睡覺(jué)','學(xué)習(xí)','運(yùn)動(dòng)'])
}
render() {
return (
<div>
Immu04
{
this.state.favor.map(item=>{
return <li key={item}>{item}</li>
})
}
</div>
);
}
}
export default Immu04;實(shí)現(xiàn)個(gè)人修改案例
import { List,Map } from 'immutable';
import React, { Component } from 'react';
class Immu05 extends Component {
state={
info:Map({
name:"碰磕",
location:Map({
province:"江西",
city:"吉安"
}),
hobbit:List(['睡覺(jué)','學(xué)習(xí)','敲鍵盤(pán)'])
})
}
render() {
return (
<div>
<h1>編輯個(gè)人信息</h1>
<div>
<button onClick={()=>{
this.setState({
info:this.state.info.set("name","愛(ài)學(xué)習(xí)").set("location",this.state.info.get("location").set("city","南昌"))
})
}}>修改</button>
{this.state.info.get("name")}
<br />
{this.state.info.get("location").get("province")}-
{this.state.info.get("location").get("city")}
{
this.state.info.get("hobbit").map((item,index)=><li key={item}>{item}<button onClick={()=>{
// console.log(index);
this.setState({
info:this.state.info.set("hobbit",this.state.info.get("hobbit").splice(index,1))
})
}}>刪除</button></li>)
}
</div>
</div>
);
}
}
export default Immu05;
通過(guò)fromJS、setIn、updateIn進(jìn)行改進(jìn)
fromJS將普通對(duì)象轉(zhuǎn)換為ImmutablesetIn()深度賦值,參數(shù)一為數(shù)組形式填寫(xiě)需要修改的,參數(shù)二為修改后的值updateIn()深度修改,參數(shù)一為數(shù)組形式填寫(xiě)需要修改的,參數(shù)二為回調(diào)函數(shù)(參數(shù)為原對(duì)象)
import { fromJS } from 'immutable';
import React, { Component } from 'react';
class Immu06 extends Component {
state={
info:fromJS({
name:"碰磕",
location:{
province:"江西",
city:"吉安"
},
hobbit:['睡覺(jué)','學(xué)習(xí)','敲鍵盤(pán)']
})
}
render() {
return (
<div>
<h1>編輯個(gè)人信息</h1>
<div>
<button onClick={()=>{
this.setState({
info:this.state.info.setIn(["name"],"愛(ài)學(xué)習(xí)").setIn(["location","city"],"南昌")//setIn("參數(shù)一為數(shù)組","修改后的值")
})
}}>修改</button>
{this.state.info.get("name")}
<br />
{this.state.info.get("location").get("province")}-
{this.state.info.get("location").get("city")}
{
this.state.info.get("hobbit").map((item,index)=><li key={item}>{item}<button onClick={()=>{
// console.log(index);
// this.setState({
// info:this.state.info.setIn(["hobbit",index],"")
// })
//updateIn(需要修改的對(duì)象,回調(diào)函數(shù)(參數(shù)為原對(duì)象))
this.setState({
info:this.state.info.updateIn(["hobbit"],(list)=>list.splice(index,1))
})
}}>刪除</button></li>)
}
</div>
</div>
);
}
}
export default Immu06;
這樣就學(xué)費(fèi)了Immutable~
到此這篇關(guān)于React替換傳統(tǒng)拷貝方法的Immutable使用的文章就介紹到這了,更多相關(guān)React Immutable內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
antd+react中upload手動(dòng)上傳單限制上傳一張
本文主要介紹了antd+react中upload手動(dòng)上傳單限制上傳一張,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
詳解前端路由實(shí)現(xiàn)與react-router使用姿勢(shì)
本篇文章主要介紹了詳解前端路由和react-router使用姿勢(shì),詳細(xì)的介紹了react-router的用法,有興趣的可以了解一下2017-08-08
如何創(chuàng)建自己的第一個(gè)React 頁(yè)面
React是用于構(gòu)建用戶(hù)界面的JavaScript庫(kù),本文主要介紹了如何創(chuàng)建自己的第一個(gè)React頁(yè)面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
React簡(jiǎn)便獲取經(jīng)緯度信息的方法詳解
在現(xiàn)代的Web應(yīng)用程序中,獲取用戶(hù)的地理位置信息是一項(xiàng)常見(jiàn)的需求,本文我們將介紹如何在React應(yīng)用程序中簡(jiǎn)便地獲取用戶(hù)的經(jīng)緯度信息,需要的可以參考下2023-11-11
用react實(shí)現(xiàn)一個(gè)簡(jiǎn)單的scrollView組件
這篇文章主要給大家介紹一下如何用 react 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 scrollView組件,文中有詳細(xì)的代碼示例,具有一定的參考價(jià)值,需要的朋友可以參考下2023-07-07
react的嚴(yán)格模式和解決react useEffect執(zhí)行兩次問(wèn)題
文章總結(jié):本文詳細(xì)探討了React中useEffect執(zhí)行兩次的問(wèn)題,主要?dú)w因于React的嚴(yán)格模式,嚴(yán)格模式在開(kāi)發(fā)模式下會(huì)故意重復(fù)調(diào)用一些生命周期方法,以幫助開(kāi)發(fā)者發(fā)現(xiàn)潛在的問(wèn)題,包括不安全的生命周期、過(guò)時(shí)的ref API、廢棄的findDOMNode方法、意外的副作用等2025-01-01
react-beautiful-dnd 實(shí)現(xiàn)組件拖拽功能
這篇文章主要介紹了react-beautiful-dnd 實(shí)現(xiàn)組件拖拽功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08

