当前位置:网站首页>Immutable学习之路----告别传统拷贝
Immutable学习之路----告别传统拷贝
2022-06-25 04:00:00 【碰磕】
首发:CSDN碰磕,学无止境
多云30°
The greatest test of courage on earth is to bear defaet without losing heart.
2022/6/24
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
将普通对象转换为ImmutablesetIn()
深度赋值,参数一为数组形式填写需要修改的,参数二为修改后的值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~
边栏推荐
- 无法安装redis接口
- 【esp32学习之路6——flash加密】
- 深度学习——几种学习类型
- What is the storage engine and the three common database storage engines for MySQL
- 第二十五周记录
- Nodejs connects to MySQL through heidisql, and ER appears_ BAD_ DB_ ERROR: Unknown database 'my_ db_ books'
- js的sort()函数
- GBASE 8s的数据导入和导出
- Can Navicat directly operate the Android database SQLite
- GBASE 8s存储过程语法结构
猜你喜欢
Office macro virus bounce shell experiment
LeetCode 剑指Offer II 091 粉刷房子[动态规划] HERODING的LeetCode之路
OBS Browser+浏览器的基本使用
Acmstreamopen return value problem
1. Phase II of the project - user registration and login
Read lsd-slam: large scale direct monolithic slam
What is the storage engine and the three common database storage engines for MySQL
CTF_ Web: Advanced questions of attack and defense world expert zone WP (19-21)
Easyrecovery15 very easy to use computer data recovery software
论文笔记: 多标签学习 ESMC (没看懂, 还没写出来, 暂时放这里占个位置)
随机推荐
Numpy NP tips: squeeze and other processing of numpy arrays
CTF_ Web: basic 12 questions WP of attack and defense world novice zone
cnpm : 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本。
@Requestbody solution get parameter is null
LeetCode 劍指Offer II 091 粉刷房子[動態規劃] HERODING的LeetCode之路
CTF_ Web: how to recognize and evaluate a regular expression
Introduction to the isolation level of gbase 8s
Detailed explanation of flex attributes in flex layout
1. Phase II of the project - user registration and login
GBASE 8s 总体架构
i. Max development board learning record
GBASE 8s 索引B+树
Gbase 8s index R tree
Retrofit source code analysis
Nodejs 通过Heidisql连接mysql出现ER_BAD_DB_ERROR: Unknown database 'my_db_books'
CTF_ Web: Advanced questions of attack and defense world expert zone WP (1-4)
Musk released humanoid robot. Why is AI significant to musk?
mysql的tinyint字段类型判断的疑惑
Laravel document sorting 10. Request life cycle
关于TCP连接四次握手(或者叫四次挥手)的详细总结