Open jtwang7 opened 3 years ago
在之前阅读的文章中,许多地方在讲述 state 时都提到了 state 用于跟踪组件渲染信息的这一特点。当时没有特别注意,在项目实际开发时有所感悟,记录如下。
ReactJS: Props vs. State原话:When a component needs to keep track of information between renderings the component itself can create, update, and use state. 翻译过来意思就是:state 是用来操作 React 组件渲染结果的,因此当组件需要跟踪渲染之间的信息时,就需要创建,更新并使用 state。 我反复提及这句话的原因就在于,它很全面地概括了我们为何要使用 state,何时使用 state。
为了更好地理解 state 在 React 组件中的用途,我们需要了解一些 React 组件的渲染机制。
注意:
- state 需要通过
setState()
来更新。- state 只能作用于当前组件,即受限于函数作用域。
学习心得:如果在 React 组件中,我们期望组件”状态“能在每次更新时触发重新渲染,并且重新渲染后值能够被组件追踪并保留, 那么 state 就是我们的选择之一。React 中很多设计本质上都涉及了对组件状态或行为的跟踪,同时选择性地执行一些额外操作。
有人会问:如果一个函数内部变量在重复调用时被重复声明,那么我们将其作为参数传入不就可以了? 答:理论上,利用函数的闭包特性是可行的,但是我们知道 React 组件实际最终会渲染成一个 DOM 树结构,我们无法判断重新渲染时,会渲染哪一部分(因为我们要保证变量只存在于不被渲染的部分)。因此,最稳妥的方法就是将所有状态定义到顶层,很显然这是不可取的。
React - props vs state
参考文章: ReactJS: Props vs. State
Props
props 在某种意义上,你可以将它理解为 React 组件所接受的参数,类似于函数形参。
分析
React 组件有两种写法:
props 在 class 组件下的写法:
props 在函数组件下的写法:
比较这两种写法中的 props,可以发现,其充当的都是函数(或构造函数)形参的角色。
defaultProps
我们用形参的概念来理解 props,可知 props 一般是从外界传入的,在ReactJS: Props vs. State原话中说的是”props ’come from above.‘“。此外,我们知道函数形参(ES6)中是可以赋予默认值的,props 也可以赋予默认值,虽然不常用,但一个 React 组件可以在创建时赋予默认值。
Welcome.defaultProps = { name: "world", };
★ props should not change !!!
props 在 React 组件中需要重点关注的特点 —— 不可变性 (immutable)。我们不能够在一个生命周期内对传入 React 组件的 props 做任何的改动,包括对其赋值或替换原有值等,但我们可以利用 props 计算并返回新的值。即 props 可被看作是一个只读属性。
State
state 在某种意义上,你可以将它理解为 React 组件内部定义的变量,由该组件私有管理,只能作用于组件内部。 在官方文档中,将 state 类比为一个在函数内声明的变量。个人认为这样类比仍有点欠妥,在学习和实践的基础上,我认为:
由于 state 是用来操作 React 组件渲染结果的,因此当组件需要跟踪渲染之间的信息时,就需要创建,更新并使用 state。
State vs Props
setState()
更新,setState()
为 state 提供了监听功能,只有通过setState()
才能监听到 state 的变化并触发重新渲染,不能直接修改 state 值,这样是无法触发组件重渲染的。