React替换传统拷贝方法的Immutable使用

 更新时间:2023年02月06日 10:04:58   作者:碰磕  
Immutable.js出自Facebook,是最流行的不可变数据结构的实现之一。它实现了完全的持久化数据结构,使用结构共享。所有的更新操作都会返回新的值,但是在内部结构是共享的,来减少内存占用

immutable

它是一款代替传统拷贝方式的第三方库

优势:

  • 在新对象上操作不会影响原对象的数据
  • 性能好

安装使用

1.下载 npm i immutable

2.导入 import {Map} from 'immutable'

Map

语法:Map(对象)

赋值:set("属性名","新值")

取值:get("属性名")

toJS()转回普通对象

import React, { Component } from 'react';
/**
     * 1.下载 npm i immutable
     * 2.导入 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转回普通对象
console.log(objImmu.toJS(),newobjImmu.toJS());
/*
//写法一
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>
        );
    }
}*/
//写法二
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中对象中的对象还要套上Map

可以通过map的get方法获取值向组件传值.,从而完美的解决了组件的无效刷新

shouldComponentUpdate进行判断决定是否需要刷新

import React, { Component } from 'react';
import {Map} from 'immutable'
class Immu03 extends Component {
    state={
        info:Map({
            name:"碰磕",
            age:20,
            hobbit:Map({
                likeone:"运动",
                liketwo:"学习"
            })
        })
    }
    render() {
        return (
            <div>
                Immu03
                <button onClick={()=>{this.setState({
                    info:this.state.info.set("name","学习啊啊啊")
                })}}>修改</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

可以使用数组的属性方法

import React, { Component } from 'react';
import {List} from 'immutable'
var arr=List([1,231,1])
let arr2=arr.push(4)//不会影响原对象结构
let arr3=arr2.concat([12,323,123])
console.log(arr,arr2,arr3);
class Immu04 extends Component {
    state={
        favor:List(['吃饭','睡觉','学习','运动'])
    }
    render() {
        return (
            <div>
                Immu04
                {
                    this.state.favor.map(item=>{
                        return <li key={item}>{item}</li>
                    })
                }
            </div>
        );
    }
}
export default Immu04;

实现个人修改案例

import { List,Map } from 'immutable';
import React, { Component } from 'react';
class Immu05 extends Component {
    state={
        info:Map({
            name:"碰磕",
            location:Map({
                province:"江西",
                city:"吉安"
            }),
            hobbit:List(['睡觉','学习','敲键盘'])
        })
    }
    render() {
        return (
            <div>
                <h1>编辑个人信息</h1>
                <div>
                    <button onClick={()=>{
                        this.setState({
                            info:this.state.info.set("name","爱学习").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;

通过fromJS、setIn、updateIn进行改进

  • fromJS将普通对象转换为Immutable
  • setIn()深度赋值,参数一为数组形式填写需要修改的,参数二为修改后的值
  • updateIn()深度修改,参数一为数组形式填写需要修改的,参数二为回调函数(参数为原对象)
import { fromJS } from 'immutable';
import React, { Component } from 'react';
class Immu06 extends Component {
    state={
        info:fromJS({
            name:"碰磕",
            location:{
                province:"江西",
                city:"吉安"
            },
            hobbit:['睡觉','学习','敲键盘']
        })
    }
    render() {
        return (
            <div>
                <h1>编辑个人信息</h1>
                <div>
                    <button onClick={()=>{
                        this.setState({
                            info:this.state.info.setIn(["name"],"爱学习").setIn(["location","city"],"南昌")//setIn("参数一为数组","修改后的值")
                        })
                    }}>修改</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(需要修改的对象,回调函数(参数为原对象))
                            this.setState({
                                info:this.state.info.updateIn(["hobbit"],(list)=>list.splice(index,1))
                            })
                        }}>删除</button></li>)
                    }
                </div>
            </div>
        );
    }
}
export default Immu06;

这样就学费了Immutable~

到此这篇关于React替换传统拷贝方法的Immutable使用的文章就介绍到这了,更多相关React Immutable内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • React+echarts (echarts-for-react) 实现中国地图及省份切换功能

    React+echarts (echarts-for-react) 实现中国地图及省份切换功能

    这篇文章主要介绍了React+echarts (echarts-for-react) 画中国地图及省份切换,有足够的地图数据,可以点击到街道,示例我只出到市级,本文结合实例代码给大家介绍的非常详细需要的朋友可以参考下
    2022-11-11
  • react 源码中位运算符的使用详解

    react 源码中位运算符的使用详解

    这篇文章主要为大家详细介绍了react 位运算符,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • React反向代理与CSS模块化的使用案例

    React反向代理与CSS模块化的使用案例

    这篇文章主要介绍了React反向代理与CSS模块化的使用案例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02
  • React Hooks useReducer 逃避deps组件渲染次数增加陷阱

    React Hooks useReducer 逃避deps组件渲染次数增加陷阱

    这篇文章主要介绍了React Hooks 之 useReducer 逃避deps后增加组件渲染次数的陷阱详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • antd form表单如何处理自定义组件

    antd form表单如何处理自定义组件

    这篇文章主要介绍了antd form表单如何处理自定义组件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • React 中的 JS 报错及容错方案

    React 中的 JS 报错及容错方案

    这篇文章主要为大家介绍了React 中的 JS 报错及容错方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • mobx在react hooks中的应用方式

    mobx在react hooks中的应用方式

    这篇文章主要介绍了mobx在react hooks中的应用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • React事件绑定的方式详解

    React事件绑定的方式详解

    react事件绑定时。this并不会指向当前DOM元素。往往使用bind来改变this指向,今天通过本文给大家介绍React事件绑定的方式,感兴趣的朋友
    2021-07-07
  • react嵌套路由实现TabBar的实现

    react嵌套路由实现TabBar的实现

    本文主要介绍了react嵌套路由实现TabBar的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • React如何动态控制伪元素样式

    React如何动态控制伪元素样式

    这篇文章主要介绍了React如何动态控制伪元素样式问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论