在 React 里,"单向数据流(One-Way Data Flow) " 是最核心的思想之一。
简单理解:
数据只能从父组件流向子组件,不能反过来直接修改。
一、先用一句话理解
React 中:
rust
父组件 state -> 子组件 props -> 页面UI
数据像水流一样:
Parent
↓ props
Child
↓ props
GrandChild
只能从上往下。
二、为什么叫"单向"?
因为:
- 父组件可以把数据传给子组件
- 子组件不能直接修改父组件的数据
例如:
javascript
function Parent() {
const [count, setCount] = React.useState(0);
return <Child count={count} />;
}
function Child(props) {
return <h1>{props.count}</h1>;
}
这里:
count在 Parent 中- Parent 通过
props传给 Child - Child 只能"使用"
- 不能:
ini
props.count = 100; // ❌ 错误
因为 props 是只读的。
三、React 为什么这样设计?
因为:
1. 数据变化更容易追踪
你知道:
谁的数据变了
↓
谁重新渲染
不会乱。
2. 组件更稳定
如果子组件可以随便改父组件数据:
css
A 改一下
B 改一下
C 再改一下
整个应用会非常难维护。
3. 更符合函数式思想
React 组件本质像:
ini
UI = f(state)
即:
输入数据
↓
输出页面
四、单向数据流完整示例
父组件
javascript
import React, { useState } from "react";
function App() {
const [msg, setMsg] = useState("你好");
return (
<div>
<Child message={msg} />
</div>
);
}
function Child(props) {
return <h1>{props.message}</h1>;
}
export default App;
流程:
perl
App state
↓
props.message
↓
Child UI
五、子组件想修改怎么办?
虽然不能直接改:
ini
props.message = "新值"; // ❌
但可以:
父组件把"修改方法"传下去。
正确方式
javascript
function App() {
const [count, setCount] = useState(0);
return (
<Child
count={count}
setCount={setCount}
/>
);
}
function Child({ count, setCount }) {
return (
<button onClick={() => setCount(count + 1)}>
{count}
</button>
);
}
这里本质还是:
父组件管理数据
子组件通知父组件修改
所以:
数据仍然是单向流动的。
六、非常重要的理解
很多初学者误以为:
ini
子组件调用了 setCount
=
子组件修改了父组件
其实不是。
真正发生的是:
perl
子组件触发事件
↓
调用父组件传来的函数
↓
父组件自己修改 state
↓
重新向下传递 props
所以数据方向始终没变:
rust
父 -> 子
七、React 单向数据流 vs Vue 双向绑定
Vue 常见:
v-model
看起来:
数据 ↔ UI
而 React 更强调:
perl
state -> UI
React 更偏:
- 可预测
- 易维护
- 数据透明
大型项目优势非常明显。
八、面试标准回答(很重要)
可以这样回答:
React 的单向数据流指的是:
数据只能从父组件通过 props 向子组件传递,子组件不能直接修改父组件的数据。
React 中:
- state 通常由父组件管理
- 子组件通过 props 接收数据
- 如果子组件需要修改数据,需要调用父组件传递的回调函数
这样可以让:
- 数据变化可追踪
- 应用状态更稳定
- 组件职责更清晰
- 更容易维护大型项目
九、你必须真正理解的本质
React 核心哲学:
状态驱动视图
即:
perl
state 改变
↓
组件重新渲染
↓
UI 更新
而不是:
直接操作DOM
所以:
React 更关注:
数据怎么流动
而不是:
页面怎么改
十、进阶理解(真正高手)
React 单向数据流最终会形成:
sql
State
↓
View
↓
Action
↓
State
这其实就是:
- Redux
- Flux
- Zustand
- Mobx(部分)
- Vuex
等状态管理的核心思想。
也叫:
Flux 架构思想
数据单向循环
十一、最经典一句话
记住:
React 中,谁拥有 state,谁才有资格修改 state。