什么是状态提升?
官网是这样解释的:
通常,多个组件需要反映相同的变化数据,这时我们建议将共享状态提升到最近的共同父组件中去。
我对“状态提升”的理解是,子组件A和子组件B需要进行数据交换/共享,则需要把他们俩需要交换数据的变量temp,放在他们最近的共同父组件内创建。这样,这两个子组件都可以访问到temp变量,并且还可以对temp变量进行修改。
说人话,“状态提升”可以帮你解决不同组件之间的赋值问题。
详细代码执行流程
1.首先React先挂载Calculator
组件。而Calculator
组件会调用render()
渲染页面UI
2. Calculator
组件的render()
内定义一些变量接收数据。其中用到了三元表达式来调用温度单位换算或者赋值
1 | // 页面初始值 |
3.在Calculator
组件的render()
内的**return()
**有三个组件。
A. 两个输入框组件:TemperatureInput
1. TemperatureInput
输入框组件需要接收3个参数:scale
温度符号、temperature
温度数值、onTemperatureChange
调用哪个温度单位转换函数
1 | return ( |
2. 在render()
内接受父组件Calculator
的值,例如温度temperature
,以及onChange
事件执行函数
1 | render() { |
3. 该组件的render()
会渲染出一个输入框
1 | render() { |
4. 上面的input框有一个onChange
事件,调用了handleChange()
方法,代码如下:
1 | handleChange(e) { |
在input输入框里输入数字的时候,会实时把value传入到 this.props.onTemperatureChange(e.target.value)
并调用。而onTemperatureChange()
实际上在调用handleCelsiusChange()
来保存用户输入的数据到state内。
1 | // 保存 摄氏度 数据 |
例如在handleCelsiusChange(temperature)
的temperature
就是
B. 一个提供沸腾信息显示的BoilingVerdict
,判断celsius
是否大于等于100
1 | // 是否是开水 |
总结
React挂载组件
<Calculator />
<Calculator />
里,定义了初始值温度、温度单位、温度转换函数,以及渲染了2个输入框,1个文本提示。初始值均为空字符串给输入框组件
<TemperatureInput />
传递了三个参数:scale、temperature、onTemperatureChange。这三个参数初始值默认为空scale: 温度的单位;初始值为空,后续根据用户在哪个输入框里输入,来赋值。
temperature: 已经计算好温度;初始值空字符串,后续根据用户的输入框来赋值。
onTemperatureChange: 调用父组件的
handleCelsiusChange
方法。而handleCelsiusChange
方法是由父组件内的this.handleCelsiusChange
提供的。而this.handleCelsiusChange
是保存数据的作用,最终该数据会被tryConvert()
方法调用,用来做温度单位转换。其中这个参数重中之重,因为该参数准确的作用是将父组件的方法传递给子组件调用,从而实现了子组件向父组件赋值的功能,也就是所谓的状态提升
完整代码
完整注释:https://gist.github.com/shanlanCoding/725bc0b068f359e29f6e1bf31a1019cc
在线演示: https://codepen.io/gaearon/pen/WZpxpz