为什么 React 需要 Immutable?
趣谈前端
共 4446字,需浏览 9分钟
· 2021-05-24
关注并将「趣谈前端」设为星标
每天早 08 : 30 按时推送技术干货/优秀开源/技术思维
对⼀个问题的研究,尝试⽤⻩⾦圈法则来分析。
Why 为什么 React 需要 immutable How 如何在使⽤ React 使⽤ immutable What 带来的收益和结果
为什么要在React 使⽤ immutable
⼀句话概况: React
使⽤了 shallowCompare
来决定是否应该重新渲染⼀个组件。
要理解 shallowCompare
,我们⾸先需要知道 JavaScript
是如何处理对象引⽤的。让我们来看 ⼀个例⼦:
const people = [{ name: "mary", age: 20 }, { name: "john", age: 30 }];
const john = people[1];
const jonhClone = { name: "john", age: 30 };
console.log(john === people[1]) // true
console.log(john === jonhClone) // false
people[1].age = 31;
console.log(john) // { name: "john", age: 31 }
console.log(jonhClone) // { name: "john", age: 30 }
johnClone
的 name
和 age
与 john
相同,但他们不是同⼀个⼈。当我们声明 john = people[1]
, 我们没有拷⻉ people[1]
的 name
和 age
给 john
,两个变量都指向同⼀个对象作为引⽤。
ShallowCompare
现在我们来看⼀个 shallowCompare
的例⼦:
let oldProps = null;
function shallowCompare (props){
if(props !== oldProps) console.log(props);
oldProps = props;
}
const mary = { name: "mary", age: 20 };
const john = { name: "john", age: 30 };
shallowCompare(mary) // prints -> { name: "mary", age: 20 }
shallowCompare(john) // prints -> { name: "john", age: 30 }
john.age = 31;
shallowCompare(john) // will not print!
如果我们想打印 john
的更新,我们需要浅拷⻉它。这样⼀来,shallowCompare
就会知道道具发⽣了变化。
let oldProps = null;
function shallowCompare (props){
if(props !== oldProps) console.log(props);
}
const john = { name: "john", age: 30 };
shallowCompare(john) // prints -> { name: "john", age: 30 }
const johnClone = {...john};
johnClone.age=31;
shallowCompare(johnClone) // prints -> { name: "john", age: 31 }
React 中的例⼦
React
使⽤同样的原则来避免不必要的组件重渲染。
class People extends Component {
constructor(props) {
super(props);
this.state = {
people:[{ name: "mary", age: 25 }, { name: "john", age: 30 }]
};
}
updateJohnAge = ()=>{
const people = [...this.state.people];
people[1].age=31;
this.setState({people});
//This will not work.
//People is a new array, but john is the same object
}
render() {
return (
<div>
<Person person={this.state.people[1]}></Person>
<button onClick={this.updateJohnAge}>Set john age to 31</button>
</div>
);
}
}
class Person extends Component {
render() {
const { person } = this.props;
return (
<div>
<p>name: {person.name}</p>
<p>age: {person.age}</p>
</div>
);
}
}
如果我们点击按钮,组件将不会呈现 john
的更新,因为 people[1]
是上次的同⼀个引⽤。为此,没有改变 john
。我们需要在之前克隆 john
,然后更新数组。
updateJohnAge = () =>{
const people = [...this.state.people];
const johnClone = {...people[1]};
johnClone.age = 31;
people[1] = johnClone;
this.setState({people});
//This will work.
}
要知道,我们并没有拷⻉ people[0] (mary)
。Immutable
并不意味着我们要详尽地克隆所有对象的 ramifications
。这将不会很有效率。我们只需要通过我们改变的路径来创建新的引⽤。
END
评论
BigDecimal 为什么可以保证精度不丢失?
来源:juejin.cn/post/7348709938023940136👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接
小哈学Java
0
为什么我们公司还在用 Python 开发项目?
作者:哇哒嘻哇https://www.zhihu.com/question/278798145/answer/3416549119最近几年里,经常看到某些曾重度使用 Python 的大公司迁移成其它语言技术栈,但是,那些小公司/小团队的情况如何呢?一直很想了解那些仍在坚持使用 Python,且支撑业
机器学习算法与Python实战
0
知乎高问:程序员有必要知道为什么做某个功能吗?
将Python客栈设为“星标⭐”第一时间收到最新资讯前言知乎上有一个提问:程序员有必要知道为什么做某个功能吗?↓↓↓今天,我们就这个话题一起来做个讨论。不知道程序员的你,在接到产品经理提的一个需求后,是习惯马上动手开始撸代码呢?还是会先暂停一下,认真思考一会如下一些问题,比如这个需求产生的背景是什么
Python客栈
0
React正在杀死Angular吗?
点击上方 前端Q,关注公众号回复加群,加入前端Q技术交流群作者 |Hassan Trabelsi
策划 & 翻译 |张卫滨这是一个老生常谈的争论(在技术时代,这是在所难免的):Angular 对战 React。这就像“先有鸡还是先有蛋”的难题,不过这个问题是针对 Web 开发
前端Q
0
PyPy为什么能让Python比C还快?一文了解内在机制
我的小册:(小白零基础用Python量化股票分析小册) ,原价299,限时特价2杯咖啡,满100人涨10元。来源:机器之心「如果想让代码运行得更快,您应该使用 PyPy。」—— Python 之父 Guido van Rossum对于研究人员来说,迅速把想法代码化并查看其是否行得通至关重要。Pyth
菜鸟学Python
0
盱眙城区一辆解放牌五小车辆对外转让,有需要的老板跟车主联系。
解放牌五小车辆原厂自卸车,年审及保险最新。无任何事故及违章,正常干活车辆,无毛病,手续齐全,车况良好,价格不高,需要的欢迎看车购买。买好车加满油让你开回家。车辆地址:盱眙天鹅湖附近。车主电话:13770461668潘先生
盱眙老妹
0