白话聊React为何采用函数式编程的不可变数据
前言
大家好,今天来聊一下React
采用函数式编程的理念:不可变数据。
看到标题的你不用担心,你可能在顾虑需要函数式编程的知识,完全不需要,今天我们就0基础聊聊什么是不可变数据?React
采用这种方式有什么好处?
例子
React
采用函数式编程的不可变数据特性。
而在React
中不可变值的意思就是:始终保持state
的原值不变。
不要直接修改state
,遇到数组或者对象,采用copy
一份出去做改变。
举个简单的例子:
基本类型
错误的做法:
this.state.count++
this.setState({
count:this.state.count
})
正确的做法:
this.setState({
count:this.state.count + 1
})
引用类型
错误的做法:
this.state.obj1.a = 100
this.state.obj2.a = 100
this.setState({
obj1: this.state.obj1,
obj2: this.state.obj2
})
正确的做法:
this.setState({
obj1: Object.assign({}, this.state.obj1, {a: 100}),
obj2: {...this.state.obj2, a: 100}
})
函数式编程不可变值的优势
我们先聊聊函数式编程中不可变值的好处。
减少bug
好比我们用const
定义一个变量,如果你要改变这个变量,你需要把变量copy
出去修改。
这样的做法,可以让你的代码少非常多的bug
。
生成简单的状态管理便于维护
因为,程序中的状态是非常不好维护的,特别是在并发的情况下更不好维护。
试想一下:如果你的代码有一个复杂的状态,当以后别人改你代码的时候,是很容易出bug
的。
React中采用函数式编程的不可变值
我们再来看看React
中采用函数式编程
性能优化
在生命周期 shouldComponentUpdate
中,React
会对新旧state
进行比较,如果直接修改state去用于其他变量的计算,而实际上state
并不需要修改,则会导致怪异的更新以及没必要的更新,因此采用这种方式是非常巧妙,且效率非常的高。
可追踪修改痕迹,便于排错
使用this.setState
的方式进行修改state
的值,相当于开了一个改变值的口子,所有的修改都会走这样的口子,相比于直接修改,这样的控制力更强,能够有效地记录与追踪每个state
的改变,对排查bug十分有帮助。
结尾
关于React
与函数式编程
你有什么观点或者想法,欢迎在评论区告诉我。
链接:https://juejin.cn/post/6992919744165150751