immutable.js笔记

Immutable.js原理分析

Immutable Data 就是一旦创建,就不能再被更改的数据。对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对象。Immutable 实现的原理是 Persistent Data Structure(持久化数据结构),也就是使用旧数据创建新数据时,要保证旧数据同时可用且不变。同时为了避免 deepCopy 把所有节点都复制一遍带来的性能损耗,Immutable 使用了 Structural Sharing(结构共享),即如果对象树中一个节点发生变化,只修改这个节点和受它影响的父节点,其它节点则进行共享。

Immutable.js的使用

安装

cnpm i immutable --save

Map的操作

import React from 'react';
import ReactDOM from 'react-dom';
import {Map} from 'immutable';//声明一个对象,这个对象要设置为不可被修改的对象
const state = {value: 'hello',list: ['html','css','js']
}//将要设置不可更改的对象,传入到Map()方法中,会返回一个新的state对象
const imState = Map(state)//将state对象设置为不可被修改的对象后,使用 get('key') 方法取值
console.log(imState.get('value'))//使用set()方法修改值,修改后会返回一个新的对象,原来的对象数据没有变化
const newImState = imState.set('value','world')console.log(imState.get('value'))
console.log(newImState.get('value'))ReactDOM.render(<div>hello</div>,document.getElementById('root'));

List的操作

import React from 'react';
import ReactDOM from 'react-dom';
import {List} from 'immutable';//声明一个数据,要将该数组设置为不可更改的数组
const arry = [1,2,3]//将数组传入 List() 中即可设置不可更改的数组对象
const imList = List(arry)//对imList做追加操作,不会对原数组做修改,会返回一个新的数组对象
const newImList = imList.push(4)console.log(imList.size,newImList.size)ReactDOM.render(<div>hello</div>,document.getElementById('root'));

fromJS的操作

import React from 'react';
import ReactDOM from 'react-dom';
import {fromJS} from 'immutable';//声明一个不可更改的对象
const state = {value: 'hello',list: ['html','css','js'],obj: {x: 1,y: {z: 2}}
}//把state传入的fromJS()中
const imState = fromJS(state)//获取imState中的值
console.log(imState.get('value'))//修改imState中的值,修改对象中的第一层属性的值,可以使用 set() 方法
const newState = imState.set('value','world')
console.log(newState.get('value'))//修改imState中更深层次的数据,需要使用 setIn() 或 updateIn() 方法
//setIn() 可以直接赋值,参数1为对象属性的层级结构,按照层级顺序编写到数组中;参数2为要赋的值
const newState1 = imState.setIn(['obj','y','z'],100)
//updateIn() 可以对原始值做修改后再返回新的值,参数1同上,参数2为修改值时用的回调函数,回调函数的参数为对象原始值
const newState2 = imState.updateIn(['obj','y','z'], val => val + 1)//获取深层对象结构的值,使用 getIn() 方法
console.log(newState1.getIn(['obj','y','z']))
console.log(newState2.getIn(['obj','y','z']))ReactDOM.render(<div>hello</div>,document.getElementById('root'));

在redux中使用immutable

使用Map操作

第1步:创建store

import {createStore} from 'redux'
import reducer from './reducer'const store = createStore(reducer)export default store

第2步:创建reducer

import {Map} from 'immutable'//使用Map()来创建原始对象,创建的原始对象为不可更改的对象
const defaultState = Map({value: ''
})const reducer = (state = defaultState, action)=>{//在执行修改state的代码中,使用 set() 方法完成修改操作,返回一个新的对象if(action.type === 'change_value'){return state.set('value',action.value)}return state
}export default reducer

第3步:创建App.js文件,用于修改redux中的数据

import React, { Component } from 'react'
import store from './store'
import Son from './Son'export default class App extends Component {constructor() {super()this.state = store.getState()store.subscribe(()=>{this.setState(store.getState())})}//文本框输入事件handleInput(e){let action = {type: 'change_value',value: e.target.value}store.dispatch(action)}render() {return (<div><input value={this.state.value} onChange={this.handleInput.bind(this)}></input><Son></Son></div>)}
}

第4步:创建Son.js用于实时显示redux中的数据

import React, { Component } from 'react'
import store from './store'export default class Son extends Component {constructor(){super()//此时使用store.getState()获取的数据为immutable处理后的对象,要使用get()方法获取具体值this.state = {value:  store.getState().get('value')}store.subscribe(()=>{this.setState({value: store.getState().get('value')})})}render() {return (<div>Son组件:{this.state.value}</div>)}
}

使用fromJS操作

App.js代码

import React, { Component } from 'react'
import store from './store'
import Son from './Son'export default class App extends Component {constructor() {super()this.state = {value: '',name: '',age: 0,h1: ''}}//提交事件handleSubmit(){let action = {type: 'reg_user',value: this.state.value,name: this.state.name,age: this.state.age,h1: this.state.h1}store.dispatch(action)}render() {return (<div><div>普通值:<input value={this.state.value} onChange={(e)=>{this.setState({value: e.target.value})}}></input></div><div>姓名:<input value={this.state.name} onChange={(e)=>{this.setState({name: e.target.value})}}></input></div><div>年龄:<input value={this.state.age} onChange={(e)=>{this.setState({age: e.target.value})}}></input></div><div>爱好:<input value={this.state.h1} onChange={(e)=>{this.setState({h1: e.target.value})}}></input></div><button onClick={this.handleSubmit.bind(this)}>提交</button><hr /><Son></Son></div>)}
}

store.js代码

import {createStore} from 'redux'
import reducer from './reducer'const store = createStore(reducer)export default store

reducer.js代码

import {fromJS} from 'immutable'//使用Map()来创建原始对象,创建的原始对象为不可更改的对象
const defaultState = fromJS({value: '',user: {name: '',age: 0,hobby: {h1: ''}}
})const reducer = (state = defaultState, action)=>{//使用fromJS中的 setIn() 方法修改数据if(action.type === 'reg_user'){return  state.setIn(['user','name'],action.name).setIn(['user','age'],action.age).setIn(['user','hobby','h1'],action.h1).set('value',action.value)}return state
}export default reducer

Son.js代码

import React, { Component } from 'react'
import store from './store'export default class Son extends Component {constructor(){super()//此时store.getState()获取到数据为复杂类型,要使用getIn()方法const storeState = store.getState();this.state = {value:  storeState.get('value'),user: {name: storeState.getIn(['user','name']),age: storeState.getIn(['user','age']),hobby: {h1: storeState.getIn(['user','hobby','h1'])}}}//监听store中的数据更新store.subscribe(()=>{const storeState2 = store.getState();this.setState({value:  storeState2.get('value'),user: {name: storeState2.getIn(['user','name']),age: storeState2.getIn(['user','age']),hobby: {h1: storeState2.getIn(['user','hobby','h1'])}}})})}render() {let {value,user} = this.statereturn (<div>Son组件:{value}<p>姓名:{user.name}</p><p>年龄:{user.age}</p><p>爱好:{user.hobby.h1}</p></div>)}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭秘高德地图如何利用MaxCompute管理海量数据

摘要&#xff1a;随着自媒体的发展&#xff0c;传统媒体面临着巨大的压力和挑战&#xff0c;新华智云运用大数据和人工智能技术&#xff0c;致力于为媒体行业赋能。通过媒体大数据开放平台&#xff0c;将媒体行业全网数据汇总起来&#xff0c;借助平台数据处理能力和算法能力&a…

Elasticsearch7.15.2 mysql8.0.26 logstash-input-jdbc 数据增量索引构建

文章目录一、基础软件安装1. 安装mysql2. Elasticsearch7.15.2 安装部署3. kibana 安装部署4. logstash-input-jdbc 安装部署二、数据库准备2.1. 创建数据库2.2. 表结构初始化2.3. 数据初始化三、logstash 配置mysql3.1. 创建目录3.2. 上传mysql驱动3.3. 创建jdbc.conf3.4. 创建…

为什么说下一个十年的主战场在Serverless?

作者 | 不瞋&#xff0c;阿里云 Serverless 负责人"唯有超越&#xff0c;才能让我们走下去。"这是不瞋在阿里的第十年。从2010 年加入阿里云&#xff0c;不瞋参与了阿里云飞天分布式系统的研发&#xff0c;历任批量计算的架构师、表格存储&#xff08;NoSQL&#xff…

解密淘宝推荐实战,打造 “比你还懂你” 的个性化APP

如今&#xff0c;推荐系统已经成为各大电商平台的重要流量入口&#xff0c;谁才能够做到比用户更懂用户&#xff0c;谁占据了新零售时代的主动权。手机淘宝的推荐更是淘宝最大的流量入口和最大的成交渠道之一&#xff0c;其背后是最为复杂的业务形态和最复杂的场景技术&#xf…

mobx笔记

入门案例 1、环境搭建 创建项目 mkdir my-app cd my-app npm init -y安装依赖 cnpm i webpack webpack-cli -D cnpm i html-webpack-plugin -D cnpm i babel-loader babel/core babel/preset-env -D cnpm i babel/plugin-proposal-decorators babel/plugin-proposal-class-…

Flink 作为现代数据仓库的统一引擎:Hive 集成生产就绪!

在2020年&#xff0c;你的数据仓库和基础设施需要满足哪些需求&#xff1f; 我们总结了几下几点&#xff1a; 首先&#xff0c;当下的企业正快速转向更实时化的模式&#xff0c;这要求企业具备对线上流式数据进行低延迟处理的能力&#xff0c;以满足实时&#xff08;real-tim…

Elasticsearch7.15.2 基础概念和基础语法

文章目录一、基础概念1. ES是什么&#xff1f;2. 名词定义3. 对应关系4. 索引5. 分词二、基础概念2.1. 索引创建2.2. 索引/文档删除2.3. 索引修改三、ES 查询3.1. 简单查询3.2. 分页查询3.3. 复杂查询四、利用analyze api搜索4.1. 索引创建4.2. 索引查询4.3. 分词结果4.4. 索引…

技术重塑未来工作方式

作者&#xff1a; Nutanix亚太及日本地区高级副总裁兼销售负责人 Matt Young 新冠肺炎被宣布为“大流行病”之后&#xff0c;几乎在一夜之间&#xff0c;业务连续性的概念发生了根本性变化。在此之前&#xff0c;业务连续性通常指的是企业在某一办公地点遭遇像洪灾等恶劣天气或…

node环境搭建流程

1、前期准备 要把C盘下的与node和npm相关的目录删除&#xff0c;卸载安装不规范的node环境。 2、Node下载与安装 去node官网下载&#xff1a;https://nodejs.org/zh-cn/download/ 安装参考教程&#xff1a;https://www.runoob.com/nodejs/nodejs-install-setup.html node安…

Elasticsearch7.15.2 ik中文分词器 定制化分词器之扩展词库(本地)

背景&#xff1a; IK分词提供的两个分词器&#xff0c;并不支持一些新的词汇&#xff0c;有时候也不能满足实际业务需要&#xff0c;这时候&#xff0c;我们可以定义自定义词库来完成目标。 目标&#xff1a; 定制化中文分词器&#xff0c;使得我们的中文分词器支持扩展的词汇 …

多点在线构建Noxmobi全球化精准营销系统

摘要&#xff1a;大数据计算服务(MaxCompute&#xff0c;原名ODPS)是一种快速、完全托管的TB/PB级数据仓库解决方案。MaxCompute向用户提供了完善的数据导入方案以及多种经典的分布式计算模型&#xff0c;能够更快速的解决用户海量数据计算问题&#xff0c;有效降低企业成本&am…

云原生安全厂商小佑科技获达泰资本千万级投资

近日&#xff0c;云原生安全领导厂商小佑科技宣布&#xff0c;获得千万级人民币的天使轮融资。该轮融资由达泰资本独家投资&#xff0c;将主要用于加强云原生安全产品核心技术研发、销售网络拓展和生态伙伴建设等关键目标&#xff0c;进而为用户提供更加高效的云原生安全解决方…

Elasticsearch7.15.2 ik中文分词器 定制化分词器之扩展词库(远程)

IK分词提供的两个分词器&#xff0c;并不支持一些新的词汇&#xff0c;有时候也不能满足实际业务需要&#xff0c;这时候&#xff0c;我们可以定义自定义词库来完成目标。 文章目录一、静态web搭建1. 安装nginx2. 创建es目录3. 创建分词文件4. 存放静态5. 验证二、配置远程分词…

万博智云上云 单机软件升级多并发SaaS平台

云栖号案例库&#xff1a;【点击查看更多上云案例】 不知道怎么上云&#xff1f;看云栖号案例库&#xff0c;了解不同行业不同发展阶段的上云方案&#xff0c;助力你上云决策&#xff01; 业务痛点 自2016年开发迁移工具主要面向私有云环境&#xff0c;但是随着公有云用户越来…

学会这10大高性能开发技术,轻松躲过裁员名单!

来源 | 编程技术宇宙责编 | Carol封图 | CSDN 下载自视觉中国程序员经常要面临的一个问题就是&#xff1a;如何提高程序性能&#xff1f;这篇文章&#xff0c;我们循序渐进&#xff0c;从内存、磁盘I/O、网络I/O、CPU、缓存、架构、算法等多层次递进&#xff0c;串联起高性能开…

修改npm默认全局安装路径

修改NPM全局安装的默认路径&#xff08;不要轻易操作&#xff09; 查看当前的全局安装路径 npm config ls安装指定的目录安装node.js&#xff0c;例如&#xff1a; c:\nodejs。 node.js安装完成之后&#xff0c;需要在 c:\node.js 目录下创建两个文件夹&#xff1a; c:\nod…

开放搜索助力提升趣店商城20%转化率

云栖号案例库&#xff1a;【点击查看更多上云案例】 不知道怎么上云&#xff1f;看云栖号案例库&#xff0c;了解不同行业不同发展阶段的上云方案&#xff0c;助力你上云决策&#xff01; 公司介绍 趣店集团&#xff0c;成立于2014年3月&#xff0c;是中国领先的金融科技企业&…

Elasticsearch7.15.2 修改IK分词器源码实现基于MySql8的词库热更新

文章目录一、源码分析1. 默认热更新2. 热更新分析3. 方法分析二、词库热更新2.1. 导入依赖2.2. 数据库2.3. JDBC 配置2.4. 打包配置2.5. 权限策略2.6. 修改 Dictionary2.7. 热更新类2.8. 编译打包2.9. 上传2.10. 修改记录三、服务器操作3.1. 分词插件目录3.2. 解压es3.3. 移动文…

母婴企业上云 实现线上线下互动营销、一体化管理服务

云栖号案例库&#xff1a;【点击查看更多上云案例】 不知道怎么上云&#xff1f;看云栖号案例库&#xff0c;了解不同行业不同发展阶段的上云方案&#xff0c;助力你上云决策&#xff01; 公司介绍 主要从事母婴产品的销售&#xff0c;拥有三家门店&#xff0c;未上云之前采用…

确认! Python再次夺冠,老码农:崩溃!

2020年转眼已过大半&#xff0c;在近一年的编程语言榜单中&#xff0c;Python已经走上卫冕的道路&#xff0c;并且与Java的差距拉得更远了一些。以往与Java常呈现你追我赶之势&#xff0c;而这一次则是直接相差由10%增加到15%&#xff01;毋庸置疑Python的火&#xff0c;有目共…