这篇文章主要给大家分享react中不可变值,对大家学习什么是不可变值和理解为何要用不可变值有一定的帮助,感兴趣的朋友可以参考一下,希望大家阅读完这篇文章能有所收获,下面我们一起来学习一下吧。
函数式编程是指程序里面的函数和表达式都能像数学中的函数一样,给定了输入值,输出是确定的。比如
let a = 1; let b = a + 1; => a = 1 b = 2;
变量b出现,虽然使用了变量a的值,但是没有修改a的值。
再看我们熟悉的react中的代码,假如初始化了this.state = { count: 1 }
componentDidMount() { const newState = { ...state, count: 2 }; // { count: 2 } this.setState(newState); }
虽然我们使用了this.state,但是没有修改this.state的引用地址和直接修改count的值,对待this.props也一样。
React官网中给出三点好处:
不可变性使得复杂的特性更容易实现。
如果直接修改数据,那么就很难跟踪到数据的改变。跟踪数据的改变需要可变对象可以与改变之前的版本进行对比,这样整个对象树都需要被遍历一次。
跟踪不可变数据的变化相对来说就容易多了。如果发现对象变成了一个新对象,那么我们就可以说对象发生改变了。
不可变性最主要的优势在于它可以帮助我们在 React 中创建 pure components。我们可以很轻松的确定不可变数据是否发生了改变,从而确定何时对组件进行重新渲染。
class CounterButton extends React.Component { constructor(props) { super(props); this.state = {count: 1}; } shouldComponentUpdate(nextProps, nextState) { if (this.props.color !== nextProps.color) { return true; } if (this.state.count !== nextState.count) { return true; } return false; } render() { return ( <button color={this.props.color} onClick={() => this.setState(state => ({count: state.count + 1}))}> Count: {this.state.count} </button> ); } }
我们知道JS中的变量类型分为基本类型(number、string、boolean、undefined、null、symbol)和引用类型(function、object、function),基本类型的值保存在栈内存当中,引用类型的值保存在堆内存当中,栈内存中只保存指向堆内存的引用。而浅比较就是只对栈内存中的数据进行比较。
class App extends PureComponent { state = { items: [1, 2, 3] } handleClick = () => { const { items } = this.state; items.pop(); this.setState({ items }); } render() { return ( <div> <ul> {this.state.items.map(i => <li key={i}>{i}</li>)} </ul> <button onClick={this.handleClick}>delete</button> </div> ) } }
上边这个例子使用了PureComponent,而且只改变了数组items里的值,而没改变items的引用地址,所以认为items没有发生变化,不会触发render函数,不会触发组件的渲染。
如果想实现组件更新,可以按如下的方式,创建一个新的数组,将新数组的地址赋给items。
handleClick = () => { const { items } = this.state; items.pop(); var newItem = [...items]; this.setState({ item: newItem }); }
(1) Immutable是一旦创建,就不能被更改的数据。(2) 对Immutable对象的任何修改或添加删除操作都会返回一个新的Immutable对象。(3)Immutable实现的原理是Persistent Data Structure(持久化数据结构),也就是是永久数据创建新数据时,要保证旧数据同时可用且不变。(4)同时为了避免deepCopy把所有节点都复制一遍带来的性能损耗,Immutable使用了Structural Sharing(结构共享),即如果对象树结点发生变化,只修改这个结点和受它影响的父节点,其他结点进行共享。
最后,如果想要在组件层面进行浅比较,可以使用React.memo()函数
其实还是官网说的不可变性的第三条优势,也是最主要的优势,就是不可变性可以帮助我们在React中使用PureComponent。我们可以很轻松的确定数据是否发生了改变,组件何时需要发生重新渲染。
如果我们改变了state的值,shouldComponentUpdate获取到当前state和nextState,或者props和nextProps比较出来的值都是完全一样的,都会返回false,即使我们做了setState的操作,UI也不会发生更新。
PureComponent最好是搭配Immutable.js进行使用,来达到性能优化的目的。结合React.memo来避免没必要的组件的更新渲染。
关于react不可变值就介绍到这,上文有详细的介绍以及实例,大家可以参考,希望能对大家有帮助,想要了解更多react不可变值的内容,请关注群英网络其它相关文章。
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
长按识别二维码并关注微信
更方便到期提醒、手机管理