react 状态提升的总结

  • React在DOM原生组件<input>上调用指定的onChange函数。在本例中,指的是TemperatureInput组件上的handleChange函数。
  • TemperatureInput组件的handleChange函数会在值发生变化时调用this.props.onTemperatureChange()函数。这些props属性,像onTemperatureChange都是由父组件Calculator提供的。
  • 当最开始渲染时,Calculator组件把内部的handleCelsiusChange方法指定给摄氏输入组件TemperatureInputonTemperatureChange方法,并且把handleFahrenheitChange方法指定给华氏输入组件TemperatureInputonTemperatureChange。两个Calculator内部的方法都会在相应输入框被编辑时被调用。
  • 在这些方法内部,Calculator组件会让React使用编辑输入的新值和当前输入框的温标来调用this.setState()方法来重渲染自身。
  • React会调用Calculator组件的render方法来识别UI界面的样子。基于当前温度和温标,两个输入框的值会被重新计算。温度转换就是在这里被执行的。
  • 接着React会使用Calculator指定的新props来分别调用TemperatureInput组件.React也会识别出子组件的UI界面。
  • React DOM 会更新DOM来匹配对应的值。我们编辑的输入框获取新值,而另一个输入框则更新经过转换的温度值。

一切更新都是经过同样的步骤,因而输入框能保持同步的。

在React应用中,对应任何可变数据理应只有一个单一“数据源”。通常,状态都是首先添加在需要渲染数据的组件中。此时,如果另一个组件也需要这些数据,你可以将数据提升至离它们最近的父组件中。你应该在应用中保持 自上而下的数据流,而不是尝试在不同组件中同步状态。

状态提升比双向绑定方式要写更多的“模版代码”,但带来的好处是,你也可以更快地寻找和定位bug的工作。因为哪个组件保有状态数据,也只有它自己能够操作这些数据,发生bug的范围就被大大地减小了。此外,你也可以使用自定义逻辑来拒绝或者更改用户的输入。

如果某些数据可以由props或者state提供,那么它很有可能不应该在state中出现。举个例子,我们仅仅保存最新的编辑过的temperaturescale值,而不是同时保存 celsiusValue 和 fahrenheitValue 。另一个输入框中的值总是可以在 render() 函数中由这些保存的数据计算出来。这样我们可以根据同一个用户输入精准计算出两个需要使用的数据。

当你在开发UI界面遇到问题时,你可以使用 React 开发者工具来检查props属性,并且可以点击查看组件树,直到你找到负责目前状态更新的组件。这能让你到追踪到产生 bug 的源头。

猜你喜欢

转载自blog.csdn.net/gwdgwd123/article/details/81988332
今日推荐