Props 与 State 区别、props 只读原则

12 阅读2分钟

一、Props 是什么?

Props(properties)是:

父组件传递给子组件的数据。

特点:

  • 外部传入
  • 子组件只能使用
  • 不能修改
  • 用于组件之间通信

示例:

function Child(props) {
  return <h1>{props.name}</h1>;
}

function App() {
  return <Child name="张三" />;
}

这里:

name="张三"

就是父组件传给子组件的 props。

子组件通过:

props.name

接收。


二、State 是什么?

State 是:

组件自己内部维护的数据。

特点:

  • 组件内部管理
  • 可以修改
  • 数据变化会触发重新渲染
  • 用于组件自身状态管理

示例:

import { useState } from "react";

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <button onClick={() => setCount(count + 1)}>
      {count}
    </button>
  );
}

这里:

count

就是 state。

setCount

用于修改 state。


三、Props 与 State 的区别

对比项PropsState
数据来源父组件传入组件内部
是否可修改❌ 只读✅ 可修改
谁管理父组件当前组件
作用组件通信状态管理
数据变化是否刷新页面

四、Props 只读原则(非常重要)

React 有一个核心原则:

Props 是只读的(Read Only)

意思:

props.xxx = 新值

是不允许的。


❌ 错误示例

function Child(props) {
  props.name = "李四"; // 错误!
  return <h1>{props.name}</h1>;
}

为什么不允许?

因为:

  • props 是父组件的数据
  • 子组件不能随便改父组件数据
  • 会导致数据流混乱

React 的数据流是:

父组件 → 子组件

叫:

单向数据流(One Way Data Flow)


五、如果子组件想修改数据怎么办?

正确做法:

父组件传函数给子组件。

示例:

function Child({ count, setCount }) {
  return (
    <button onClick={() => setCount(count + 1)}>
      +1
    </button>
  );
}

function App() {
  const [count, setCount] = useState(0);

  return (
    <Child count={count} setCount={setCount} />
  );
}

这里:

  • 数据在父组件
  • 子组件通过调用函数修改
  • 符合 React 单向数据流

六、一个非常经典的理解

你可以这样记:

Props

像:

函数参数

例如:

function add(a, b) {}

React:

function Child(props) {}

State

像:

组件自己的变量

但它是:

  • 响应式的
  • 更新后会重新渲染页面

七、实际开发中的使用场景

Props 适合:

  • 父子传值
  • 组件复用
  • 配置组件

例如:

<Button type="primary" />
<Card title="文章标题" />

State 适合:

  • 输入框内容
  • 开关状态
  • 登录状态
  • loading
  • 表格数据
  • 计数器

八、React 官方思想(很重要)

React 推崇:

UI = f(state)

即:

UI 是 state 的映射。

state 改变:

→ UI 自动更新。


九、面试高频总结(建议记住)

Props

  • 父组件传递的数据
  • 只读
  • 不能修改
  • 用于组件通信

State

  • 组件内部状态
  • 可修改
  • 修改后触发重新渲染
  • 用于动态数据管理

React 数据流

单向数据流
父 → 子

子组件修改父组件数据

父组件传函数
子组件调用函数