state 和 props 有什么区别?
一、是什么
1.1 Props
Props(Properties 的缩写)是组件的外部输入,由父组件传递给子组件。对于接收 props 的组件而言,props 是只读的——子组件不能直接修改自己的 props。
Props 可以传递任何 JavaScript 值:字符串、数字、布尔值、对象、数组、函数,甚至 JSX:
1.2 State
State 是组件的内部状态,由组件自身管理。状态的变化会触发组件重新渲染:
在类组件中,state 是一个对象,通过 this.setState 更新:
二、核心区别
2.1 所有权(Ownership)
同一份数据,在拥有它的组件中是 state,传递给子组件后就是 props。这体现了 React 单向数据流的核心理念。
2.2 可变性(Mutability)
Props 是只读的:
State 通过特定方法更新:
2.3 数据流向
数据从父组件流向子组件(自上而下),子组件通过回调函数通知父组件更新(自下而上的事件流)。
2.4 完整对比表
三、常见使用模式
3.1 状态提升(Lifting State Up)
当两个兄弟组件需要共享数据时,将状态提升到共同的父组件:
3.2 Props Drilling 问题
当深层嵌套的组件需要顶层数据时,props 需要一层层传递,即使中间组件不使用这些数据:
解决方案包括 Context、状态管理库(Zustand、Jotai)或组件组合模式:
3.3 默认 Props 与类型校验
四、什么时候用 State,什么时候用 Props?
判断标准:
- 这个数据会随时间变化吗? 如果不会,可能连 state 都不需要,用常量即可
- 这个数据可以从 props 或其他 state 计算得出吗? 如果可以,不要存为 state,直接计算
- 这个数据属于谁? 只有当前组件需要 → state;需要传递给子组件 → 在当前组件是 state,传下去是 props
五、总结
Props 和 State 是 React 数据管理的两大基石。Props 实现组件间的数据传递,State 实现组件内部的状态管理。理解两者的区别和配合方式,是掌握 React 单向数据流的关键。
面试要点:能清晰阐述 props 是只读的外部输入、state 是可变的内部数据;理解状态提升和 props drilling 问题及解决方案;知道什么数据应该作为 state,什么应该通过计算派生。