当前位置:网站首页>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 immutable2.导入
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~
边栏推荐
- UCLA | 用于黑盒优化的生成式预训练
- PostgreSQL数据库WAL——RM_HEAP_ID日志记录动作
- GBASE 8s存储过程流程控制
- CTF_ Web: advanced problem WP (5-8) of attack and defense world expert zone
- Record small knowledge points
- Multithreading structure of gbase 8s
- Laravel document sorting 8. Middleware
- BSC smart contract dividend mainstream currency | including marketing wallet | deflation | reflow | dividend free token | available for direct deployment
- cnpm : 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本。
- Numpy NP tips: squeeze and other processing of numpy arrays
猜你喜欢

【esp32学习之路6——flash加密】

PHP extracts and analyzes table contents, and collects bidding information

CTF_ Web: Advanced questions of attack and defense world expert zone WP (1-4)

A detailed summary of TCP connection triple handshake

CTF_ Web:php weak type bypass and MD5 collision

CTF_ Web: Advanced questions of attack and defense world expert zone WP (9-14)

Error 1062 is reported during MySQL insertion, but I do not have this field.

1. Phase II of the project - user registration and login

CTF_ Web: basic 12 questions WP of attack and defense world novice zone

Shutter fittedbox component
随机推荐
kenlm
ThinkPHP is integrated with esaywechat. What's wrong with wechat payment callback without callback?
CTF_ Web: Advanced questions of attack and defense world expert zone WP (1-4)
【esp32学习之路6——flash加密】
GBASE 8s存储过程语法结构
cnpm : 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本。
Openmmlab environment configuration
GBASE 8s的级联删除功能
@Requestbody solution get parameter is null
SQL注入详解
1. Phase II of the project - user registration and login
[kubernetes series] installation and use of Helm
Win10 environment phpstudy2016 startup failure record
CTF_ Web: deserialization learning notes (I) classes and objects in PHP
Unit test coverage
冰冰学习笔记:循环队列的实现
GBASE 8s存儲過程語法結構
MySQL order by
Introduction to the isolation level of gbase 8s
What is data persistence?