0

0

React组件间通信:从子组件向父组件传递数据实践

DDD

DDD

发布时间:2025-10-16 11:30:01

|

493人浏览过

|

来源于php中文网

原创

react组件间通信:从子组件向父组件传递数据实践

本教程详细讲解如何在React中实现子组件向父组件传递数据。通过在父组件定义回调函数并作为props传递给子组件,子组件在事件触发时调用该回调,将数据回传。父组件使用状态管理接收数据,并可利用`useEffect`响应数据变化,实现动态数据请求,避免直接调用组件函数。

在React应用开发中,组件之间的数据流通常是单向的,即数据从父组件流向子组件(通过props)。然而,在许多场景下,我们需要子组件将数据或事件通知给父组件。例如,一个表单输入组件(子组件)在用户提交数据后,需要将输入值传递给其父组件进行处理。本文将以一个具体的示例,详细阐述如何实现这种“子组件向父组件传递数据”的通信模式。

理解React数据流与组件通信

React的核心思想是单向数据流。父组件通过props将数据传递给子组件。当子组件需要与父组件通信时,它不能直接修改父组件的状态。正确的做法是,父组件传递一个回调函数给子组件作为prop,子组件在需要通信时调用这个回调函数,并将数据作为参数传递给它。这样,父组件就能在其回调函数中接收到子组件传来的数据,并更新自己的状态。

示例场景:从输入框组件获取数据到应用主组件

假设我们有一个InputField组件用于用户输入地址,并有一个App组件作为主应用,需要在InputField提交数据后,使用该地址进行API请求。

1. 修改子组件:InputField.js

首先,我们需要修改InputField组件,使其能够接收一个回调函数作为prop。当用户提交表单时,InputField会调用这个回调函数,并将输入值传递出去。

// InputField.js
import React from 'react';

export default function InputField({ onSubmit }) { // 接收一个名为 onSubmit 的 prop
  function handleSubmit(e) {
    e.preventDefault(); // 阻止浏览器默认的表单提交行为

    const form = e.target;
    const inputVal = form.myInput.value; // 获取输入框的值

    console.log("子组件获取到的输入值:", inputVal);

    // 调用父组件传递进来的回调函数,并将输入值作为参数传递
    if (onSubmit && typeof onSubmit === 'function') {
      onSubmit(inputVal); 
    }
  }

  return (
    
); }

关键点:

  • InputField组件现在接受一个名为onSubmit的prop。
  • 在handleSubmit函数中,获取到inputVal后,我们调用了onSubmit(inputVal)。这意味着当表单提交时,InputField会将inputVal“回传”给父组件。
  • 添加了类型检查if (onSubmit && typeof onSubmit === 'function')以增强健壮性。

2. 修改父组件:App.js

接下来,我们需要在App组件中定义一个状态来存储从InputField接收到的数据,并创建一个回调函数传递给InputField。

// App.js
import './App.css';
import AccountNumber from "./components/AccountNumber";
import InputField from "./components/InputField";
import { useEffect, useState } from "react";

function App() {
  // 状态用于存储从 InputField 接收到的地址值
  const [searchValue, setSearchValue] = useState(null); 

  // 状态用于存储API返回的tokens数据
  const [tokens, setTokens] = useState([]);
  // 状态用于管理加载状态
  const [loading, setLoading] = useState(false);

  // 定义一个回调函数,用于接收 InputField 传递过来的值
  const handleSearchSubmit = (val) => {
    setSearchValue(val); // 更新 searchValue 状态
  };

  // useEffect 钩子用于在 searchValue 变化时触发数据请求
  useEffect(() => {
    // 只有当 searchValue 不为 null 且不为空字符串时才进行数据请求
    if (searchValue) { 
      setLoading(true);
      fetch(`https://api.multiversx.com/accounts/${searchValue}/tokens`)
        .then(response => response.json())
        .then(json => setTokens(json))
        .finally(() => {
          setLoading(false);
        });
      console.log("App组件发起请求,searchValue:", searchValue);
    }
    // 依赖数组包含 searchValue,确保当 searchValue 改变时 useEffect 重新运行
  }, [searchValue]); 

  // ... (其他辅助函数,如 round, numberWithSpaces 保持不变)

  return (
    
        

Total number of accounts

{/* 将 handleSearchSubmit 函数作为 onSubmit prop 传递给 InputField */}
{/* 可以显示当前 searchValue 进行调试 */}

当前搜索地址: {searchValue || '未输入'}

{loading ? (
Loading...
) : ( <>

Tokens

{tokens.map(token => ( ))}
Name Price Hold
@@##@@

{token.name}

Narration Box
Narration Box

Narration Box是一种语音生成服务,用户可以创建画外音、旁白、有声读物、音频页面、播客等

下载

${round(token.price, 10000000)}

{round(token.balance / Math.pow(10, token.decimals), 10000000)}

${round(token.valueUsd, 10000000)}

)}
); } // 辅助函数(保持不变) function round(nr, ten) { return Math.round(nr * ten) / ten; } function numberWithSpaces(nr) { return nr.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " "); } export default App;

关键点:

  • useState(null): App组件引入了一个新的状态变量searchValue,初始值为null,用于存储从InputField获取的地址。
  • handleSearchSubmit回调函数: 定义了一个名为handleSearchSubmit的函数。当InputField调用它时,会将传入的val更新到searchValue状态。
  • : 在渲染InputField时,将handleSearchSubmit函数作为onSubmit prop传递给它。这是实现子组件向父组件通信的关键。
  • useEffect依赖项: useEffect现在依赖于searchValue。这意味着每当searchValue状态更新时(即用户提交了新的地址),useEffect中的数据请求逻辑就会重新执行,使用新的地址发起API请求。
  • 条件请求: 在useEffect内部添加了if (searchValue)的判断,确保只有当searchValue有实际值时才发起API请求,避免在组件首次渲染时(searchValue为null)立即请求。
  • 组件渲染方式: 重要提示:在JSX中渲染React组件时,应使用标签语法,而不是像调用普通函数那样InputField()。InputField()会直接执行组件函数并返回JSX元素,而则会触发React的组件生命周期和优化机制。原始问题代码中的{InputField()}是一个常见的误区,应修正为

总结与注意事项

通过以上步骤,我们成功地实现了React中子组件向父组件传递数据的功能。这种模式是React应用中组件间通信的基石,被称为“提升状态”(Lifting State Up)。

核心概念回顾:

  1. 单向数据流: 数据从父组件流向子组件。
  2. 回调函数: 父组件定义一个回调函数,并通过props传递给子组件。
  3. 子组件调用回调: 子组件在需要传递数据时,调用父组件传递过来的回调函数,并将数据作为参数传入。
  4. 父组件更新状态: 父组件在回调函数中接收到数据后,更新自己的状态,从而触发重新渲染。
  5. useEffect与依赖项: 当父组件的状态(如searchValue)更新时,可以使用useEffect来响应这些变化,执行副作用(如API请求)。useEffect的依赖项数组确保了其在正确的时间点执行。

注意事项:

  • 避免直接调用组件函数: 始终使用JSX标签语法来渲染React组件,而不是Component()。
  • 状态管理: 在父组件中管理从子组件接收到的数据,是React数据流的推荐实践。
  • 清晰的命名: 为回调函数和props使用清晰、描述性的名称,提高代码可读性。例如,onSubmit明确表示这是一个提交事件的回调。

掌握这种通信模式对于构建复杂的、交互性强的React应用至关重要。

React组件间通信:从子组件向父组件传递数据实践

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

229

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

434

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

713

2023.08.22

java值传递和引用传递有什么区别
java值传递和引用传递有什么区别

java值传递和引用传递的区别:1、基本数据类型的传递;2、对象的传递;3、修改引用指向的情况。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

106

2024.02.23

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

508

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

241

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

248

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5219

2023.08.17

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.7万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.7万人学习

CSS教程
CSS教程

共754课时 | 17.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号