当前位置:嗨网首页>书籍在线阅读

07-React中的不可变状态_属性

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

3.2.2 React中的不可变状态:属性

我们已经讨论了React如何通过状态和 setState 以可变的方式处理数据,但React中的不可变数据怎么样呢?React中,属性(props)是传递不可变数据的主要方式,所有组件都能接收属性(不只是继承自 React.Component 的组件)并能在其构造函数、 render 和生命周期方法中使用它们。

React中的属性或多或少是不可变的。使用库和其他工具能够模拟组件中的不可变数据结构,但React的props API本身是半不可变的。如果JavaScript原生的 Object.freeze 方法可用的话,React会使用它防止添加新属性或移除现有属性。 Object.freeze 也能防止现有属性(或其可枚举性、可配置性和可写性)被修改并防止原型被修改。这很大程度上防止修改 props 对象,但它在技术上并不是真正的不可变对象(尽管可以这样想)。

属性是传递给React组件的数据,要么来自父组件要么来自组件自身的 defaultProps 静态方法。然而组件状态只限于单个组件,属性通常由父组件传递。如果开发人员想:“我是否能用父组件的状态将属性传递给子组件?”,那么你算想到些事了。一个组件的状态可以是另一个组件的属性。

属性通常在JSX中作为属性进行传递,但如果使用 React.createElement 的话,则可以通过该接口直接将它们传递给子组件。可以将任何有效的JavaScript数据作为一个属性传递给其他组件,甚至可以传递组件(它们毕竟只是类而已)。一旦属性被传递给组件使用,就不能在组件内部改变它们。尽可以尝试,但可能会得到一个像 Uncaught TypeError: Cannot assign to read-only property'<myProperty>'ofobject'#<Object>' 这样的错误,或者更糟,React应用将无法如预期一样工作,因为违反了预期的使用方式。

下一节中的代码清单3-4展示了访问属性的方式以及如何不给它们赋值。如前所述,属性可以随时间改变,但不是从组建内部改变。这是单项数据流的一部分,后续章节会涵盖这个主题。简而言之,单向意味着从父组件到子组件一路向下改变数据流。一个使用状态的父组件(继承自 React.Component )可以改变自己的状态,这个改变的状态可以作为属性传递给子组件,从而改变属性。

练习3-2 在render方法中调用setState

我们已经明确, setState 是更新组件状态的方法。可以在哪里调用 setState ?我们将在下一章了解组件生命周期的哪个点可以调用 setState ,但现在让我们先将注意力只放在render方法上。当在组件的 render 方法中调用 setState 会发生什么?去https://codesandbox.io/s/48zv2nwqww做些试验。