在 React 中,父子组件之间的通信(传参和传方法)

✅ 一、什么是父子组件传参和传方法?

在 React 的组件树中:

  • 父组件:调用并包含子组件的组件
  • 子组件:被父组件调用、渲染的组件

传参(传递数据)​ ​:父组件把自己的 ​数据(如字符串、数字、对象、数组等)​​ 传递给子组件,子组件接收并使用这些数据来渲染 UI。

传方法(传递函数)​ ​:父组件把自己的 ​函数(方法)​ ​ 传递给子组件,子组件在合适的时机(比如用户点击按钮)​调用这个方法 ,从而实现 ​子组件向父组件通信 / 通知父组件做某些事情


🧩 二、React 数据流动是单向的(父 → 子)

React 的核心原则之一是:​数据流向是单向的,通常是从父组件流向子组件

父组件通过 ​props(属性)​ ​ 向子组件传递 ​数据 或 方法,子组件通过接收 props 来使用它们。


✅ 三、1. 父组件向子组件传参(传递数据)

📌 场景:父组件有一份数据(比如用户名、列表、配置等),要传给子组件去展示

✅ 示例代码:

1)父组件(ParentComponent.jsx)
复制代码
import React from 'react';
import ChildComponent from './ChildComponent';

function ParentComponent() {
  const message = 'Hello from Parent!';
  const user = { name: 'Alice', age: 25 };

  return (
    <div>
      <h1>这是父组件</h1>
      {/* 向子组件传递数据:message 和 user */}
      <ChildComponent msg={message} userInfo={user} />
    </div>
  );
}

export default ParentComponent;
2)子组件(ChildComponent.jsx)
复制代码
import React from 'react';

function ChildComponent(props) {
  // props 是一个对象,包含父组件传递过来的所有属性
  return (
    <div>
      <h2>这是子组件</h2>
      <p>父组件对我说:{props.msg}</p>
      <p>用户信息:{props.userInfo.name},年龄:{props.userInfo.age}</p>
    </div>
  );
}

export default ChildComponent;

✅ 说明:

  • 父组件通过 <ChildComponent msg={message} userInfo={user} /> 的方式,把数据以 属性(props)​ 的形式传给子组件
  • 子组件通过 props.msgprops.userInfo 来接收并使用这些数据
  • 你可以传递任意类型的数据:字符串、数字、对象、数组、布尔值等

✅ 更优雅的写法(使用解构):

子组件中可以这样写,更简洁:

复制代码
function ChildComponent({ msg, userInfo }) {
  return (
    <div>
      <p>{msg}</p>
      <p>{userInfo.name} ({userInfo.age}岁)</p>
    </div>
  );
}

✅ 四、2. 父组件向子组件传方法(传递函数,实现子 → 父通信)

📌 场景:子组件需要在某个时机(比如点击按钮、输入内容)​通知父组件做某事,比如保存数据、触发事件、更新状态等。

实现方式就是:​父组件把一个函数以 props 形式传给子组件,子组件在合适的时机调用这个函数,并可传回一些参数。​


✅ 示例代码:

1)父组件(ParentComponent.jsx)
复制代码
import React, { useState } from 'react';
import ChildComponent from './ChildComponent';

function ParentComponent() {
  const [messageFromChild, setMessageFromChild] = useState('');

  // 1. 定义一个方法,用于接收子组件传来的数据
  const handleChildData = (data) => {
    setMessageFromChild(data);
  };

  return (
    <div>
      <h1>父组件</h1>
      <p>子组件对我说:{messageFromChild}</p>

      {/* 2. 把方法以 prop 的形式传给子组件 */}
      <ChildComponent onSendMessage={handleChildData} />
    </div>
  );
}

export default ParentComponent;
2)子组件(ChildComponent.jsx)
复制代码
import React from 'react';

function ChildComponent({ onSendMessage }) {
  const handleClick = () => {
    // 3. 子组件调用从父组件传来的方法,并传参数
    onSendMessage('你好,我是子组件发来的消息!');
  };

  return (
    <div>
      <h2>子组件</h2>
      <button onClick={handleClick}>给父组件发送消息</button>
    </div>
  );
}

export default ChildComponent;

✅ 说明:

步骤 说明
父组件定义了一个函数 handleChildData,用于接收子组件传来的信息
父组件通过 prop onSendMessage={handleChildData} 把这个函数传给子组件
子组件通过 props.onSendMessage(或解构为 onSendMessage)接收到这个函数,并在按钮点击时调用它,同时传参 '你好...'
父组件从而接收到子组件传来的数据,并更新自己的状态,实现 ​子 → 父通信

✅ 函数命名惯例(推荐):

虽然你可以随意命名这个函数 prop,但推荐使用清晰的、语义化的命名,比如:

用途 推荐 prop 名称
子组件通知父组件 onSubmitonSaveonButtonClickonMessageSend
父组件传给子组件的回调 onChangeonClickonSelect

例如:

复制代码
<ChildComponent onSubmit={handleSubmit} />

✅ 五、3. 传参 + 传方法 综合示例

场景:子组件是一个输入框,用户输入内容后点击按钮,把输入的内容传给父组件并显示


父组件:

复制代码
import React, { useState } from 'react';
import ChildInput from './ChildInput';

function ParentComponent() {
  const [inputValue, setInputValue] = useState('');

  const handleInputChange = (value) => {
    setInputValue(value);
  };

  return (
    <div>
      <h1>父组件</h1>
      <p>你输入的内容是:{inputValue}</p>
      <ChildInput onInputSubmit={handleInputChange} />
    </div>
  );
}

export default ParentComponent;

子组件:

复制代码
import React, { useState } from 'react';

function ChildInput({ onInputSubmit }) {
  const [text, setText] = useState('');

  const handleSubmit = () => {
    onInputSubmit(text); // 调用父组件方法,传入输入框的值
  };

  return (
    <div>
      <input
        type="text"
        value={text}
        onChange={(e) => setText(e.target.value)}
        placeholder="请输入内容"
      />
      <button onClick={handleSubmit}>提交给父组件</button>
    </div>
  );
}

export default ChildInput;

✅ 六、总结:父子组件传参与传方法

功能 说明 传递方式 代码体现
父 → 子:传参(数据)​ 父组件向子组件传递数据(字符串、对象等)用于渲染或逻辑 通过 props 传给子组件 <Child data={value} />,子组件通过 props.data 使用
父 → 子:传方法(函数)​ 父组件向子组件传递一个函数,子组件在某个时机调用它,实现子向父通信 通过 props 传函数 <Child onClick={handler} />,子组件调用 props.onClick()
子 → 父:通信 子组件通过调用父组件传来的函数,并传参,通知父组件做事情 本质是父传方法,子调用 子组件调用 props.onEvent(data),父组件接收并处理
传参 + 传方法 综合 既传数据,又传回调,实现灵活交互 props 传参 + 传函数 最常见的业务场景写法

✅ 七、补充:TypeScript 中的类型定义(推荐)

如果你使用 TypeScript,可以为 props 定义明确的类型,提高代码可靠性,比如:

复制代码
interface ChildProps {
  msg: string;
  userInfo: { name: string; age: number };
  onSendMessage: (data: string) => void;
}

✅ 八、总结一句话:

在 React 中,​父组件通过 props 向子组件传递数据和方法,实现数据的展示与交互控制;子组件通过调用父组件传来的方法,将自己的状态或用户行为反馈给父组件,从而实现双向通信。这是 React 组件通信最基础、最核心的机制。

相关推荐
anyup1 分钟前
🔥 🔥 为什么我建议你使用 uView Pro 来开发 uni-app 项目?
前端·vue.js·uni-app
Skelanimals1 分钟前
Elpis全栈框架开发总结
前端
蓝胖子的小叮当5 分钟前
JavaScript基础(十三)函数柯里化curry
前端·javascript
孪创启航营9 分钟前
数字孪生二维热力图制作,看这篇文章就够了!
前端·three.js·cesium
宫水三叶的刷题日记12 分钟前
真的会玩,钉钉前脚辟谣高管凌晨巡查工位,小编随后深夜发文
前端·后端·面试
zzywxc78721 分钟前
AI 行业应用:金融、医疗、教育、制造业领域的落地案例与技术实现
android·前端·人工智能·chrome·金融·rxjava
Juchecar28 分钟前
Vue 3 + Naive UI 调用useMessage的方法(在Naive UI 2.42.0实测有效)
前端
前端Hardy39 分钟前
HTML&CSS:有趣的SVG路径动画效果
javascript·css
前端Hardy43 分钟前
HTML&CSS:超酷炫的3D动态卡片
前端·javascript·css
RaidenLiu1 小时前
从 Provider 迈向 Riverpod 3:核心架构与迁移指南
前端·flutter