React 组件通信-全面解析

这篇具有很好参考价值的文章主要介绍了React 组件通信-全面解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

父子组件通信

// 导入
import { useState } from "react";

import "./App.scss";
import { defaultTodos } from "./components/module/contentData";

// 子组件
const Module = ({ id, done, text, onToggle, onDelData }) => {
  return (
    <div>
      <span className={done ? "" : "text"} onClick={() => onToggle(id)}>
        -- {text} --
      </span>
      {/* 点击后子组件调用父组件函数,将 id 回传给父组件 */}
      <button onClick={() => onDelData(id)}>删除</button>
    </div>
  );
};

// 父组件
const App = () => {
  // 状态
  const [defaultTodo, setDefaultTodo] = useState(defaultTodos);

  // 修改文字状态
  const onToggle = (id) => {
    setDefaultTodo(
      defaultTodo.map((item) => {
        if (item.id === id) return { ...item, done: !item.done };
        return item;
      })
    );
    console.log(defaultTodo);
  };

  // 删除
  const onDelData = (xId) => {
    const dataId = defaultTodo.filter((item) => item.id !== parseInt(xId));
    console.log(xId, "点击了删除", dataId);
    setDefaultTodo(dataId);
  };

  return (
    <div>
      <p>xxx </p>
      {defaultTodo.map((item) => {
        // key 可以直接用
        // return <Module key={item.id} done={item.done} text={item.text}></Module>;

        // {...item} 解构写法,简化开发
        // onToggle 给子组件调用的函数
        return (
          <Module
            key={item.id}
            {...item}
            onToggle={onToggle}
            onDelData={onDelData}
          ></Module>
        );
      })}
    </div>
  );
};

export default App;

这段代码包括一个父组件App和一个子组件Module,实现了父子组件之间的通信。

在父组件App中,使用useState来定义了一个状态defaultTodo,并初始化为defaultTodosdefaultTodos是从./components/module/contentData文件中导入的一个默认的待办事项列表。

App组件中定义了两个回调函数onToggleonDelData,分别用于切换待办事项的状态和删除待办事项。

子组件Module接收父组件传递的参数iddonetextonToggleonDelData。在子组件中,使用这些参数来展示待办事项的内容和状态,并通过点击事件调用父组件传递的回调函数来修改状态或删除待办事项。

App组件中,通过defaultTodo.map遍历defaultTodo数组,并将每个待办事项的数据作为子组件Module的属性进行渲染。

父组件和子组件之间通过回调函数的方式进行通信,子组件通过调用父组件传递的回调函数来传递数据或状态的更新。同时,父组件通过useState来管理状态的变化,并通过调用setDefaultTodo函数来更新状态。

在CSS样式方面,通过import "./App.scss"导入了App.scss文件,并在子组件的span元素中通过条件渲染添加了不同的样式效果。

总的来说,这段代码演示了React中父子组件之间通过props和回调函数进行通信,实现待办事项列表的展示、状态切换和删除功能。

兄弟组件之间的传值

import { useState } from "react";
import "./App.scss";
import From from "./components/ContentData";
import List from "./components/TitleData";

// 利用转态提升来让兄弟组件之间可以传值
function App() {
  const [data, setData] = useState([
    { id: 1, name: "李白", age: 19 },
    { id: 2, name: "杜甫", age: 29 },
    { id: 3, name: "白居易", age: 30 },
  ]);

  const addListData = (newData) => {
    console.log("执行了");
    setData([...data, { id: Date.now(), name: newData, age: 119 }]);
  };

  return (
    <div>
      <From data={data}></From>
      <hr />
      <List addListData={addListData}></List>
    </div>
  );
}

export default App;

List 子组件代码:

import { List } from "antd";
const ListData = ({ data }) => {
  return (
    <div>
      <List
        size="large"
        header={<div></div>}
        footer={<div></div>}
        bordered
        dataSource={data}
        renderItem={(item) => <List.Item>{item.name}</List.Item>}
      />
    </div>
  );
};

export default ListData;

From 子组件代码:


import { ProForm, ProFormText } from "@ant-design/pro-components";
import "./index.css";

const From = ({ addListData }) => {
  return (
    <div className="box-form">
      <ProForm
        onFinish={async (values) => {
          console.log(values);
          addListData(values.name);
        }}
      >
        <ProFormText name="name" label="姓名" />
      </ProForm>
    </div>
  );
};

export default From;

这段代码包括一个父组件App和两个子组件FromList,实现了兄弟组件之间的值传递。

在父组件App中,使用useState定义了一个状态data,并初始化为一个包含三个对象的数组。父组件还定义了一个名为addListData的函数,用于向data数组中添加新的数据。

父组件通过将data状态和addListData函数作为props传递给子组件FromList。子组件From接收addListData函数,当ProForm表单中的值发生变化且提交表单时,调用addListData函数将新的值添加到父组件的data状态中。

子组件List接收data作为props,并使用Ant Design的List组件展示data中的数据。

父组件和子组件之间的值传递通过props来完成,父组件将状态和函数传递给子组件作为props,子组件通过调用父组件传递的函数来影响父组件的状态。

整个应用的目的是让用户通过From组件中的表单输入一条数据,然后通过List组件展示已经输入的数据。父组件App作为中介,在兄弟组件之间传递数据和函数。

子组件可以根据自己的功能和需要使用父组件传递的数据或函数来实现相应的功能,实现了兄弟组件之间的值传递和交互。

跨组件传值

import { createContext, useState } from "react";
import ContentData from "./components/ContentData";
import TitleData from "./components/TitleData";

export const ThemeContext = createContext();

const App = () => {
  const [color, setcolor] = useState("#bfc");
  // 无视组件层级关系,跨组件通信
  const editColor = (e) => {
    console.log("触发");
    setcolor(e);
  };
  return (
    <div>
      {/* 共享数据 */}
      <ThemeContext.Provider value={color}>
        <p>123</p>
        <ContentData></ContentData>
        <hr />
        <TitleData editColor={editColor}></TitleData>
      </ThemeContext.Provider>
    </div>
  );
};

export default App;

TitleData 子组件:

const TitleData = ({ editColor }) => {
  const triggeredChange = (e) => {
    console.log(e.nativeEvent.srcElement.value);
    editColor(e.nativeEvent.srcElement.value);
  };
  return (
    <div className="box-form">
      子组件:<p>TitleData</p>
      <input type="color" onChange={(e) => triggeredChange(e)} />
    </div>
  );
};

export default TitleData;

ContentData 子组件:

import { useContext } from "react";
import GrandsonModule from "./components/grandsonModule";
import { ThemeContext } from "../../App";

const ContentData = ({ data }) => {
  const theme = useContext(ThemeContext);

  return (
    <div>
      子组件:<p style={{ color: theme }}>ContentData {theme}</p>
      <GrandsonModule></GrandsonModule>
    </div>
  );
};

export default ContentData;

GrandsonModule 是子孙组件:

GrandsonModule 是 ContentData 子组件的子组件

import { useContext } from "react";
import { ThemeContext } from "../../../App";
const GrandsonModule = () => {
  const theme = useContext(ThemeContext);

  return (
    <div>
      子孙组件:<p>GrandsonModule {theme}</p>
    </div>
  );
};

export default GrandsonModule;

这段代码它演示了如何使用上下文(Context)在跨组件之间共享数据。

App组件中,首先使用createContext函数创建了一个上下文对象ThemeContext。然后,使用useState来定义一个状态color,初始值为"#bfc"。通过setcolor函数来更新color的值。

editColor函数中,通过调用setcolor函数来更新color的值。该函数在子组件TitleData中被调用,用于更新父组件的状态。

return语句中,将需要共享的数据color放在<ThemeContext.Provider>中的value属性中。这样,ThemeContext.Provider包裹的所有组件都可以访问这个共享的数据。在这个例子中,子组件ContentDataTitleData可以访问color的值。

子组件ContentData使用useContext钩子来订阅ThemeContext上下文,并使用theme变量来获取共享的数据color的值。在return语句中,展示了包含theme值的一段文字。

子组件GrandsonModule也使用了useContext钩子来获取color的值,并展示了包含theme值的一段文字。

子组件TitleData接收父组件传递的editColor函数,并在输入框的onChange事件中调用editColor函数来更新父组件的状态文章来源地址https://www.toymoban.com/news/detail-615101.html

到了这里,关于React 组件通信-全面解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • react 组件之间的通信(父子组件)

    React中 组件内调用其他组件不需要进行 类似于vue 声明组件(components) React 组件内调用其他组件 直接将组件导入 放置在对应的JSX 代码中 父子组件通信(传统): 1、父组件-子组件  通过属性传递 2、子组件-父组件  父组件通过将自身的函数对象传递给子组件, 子组件执行父组件

    2024年02月08日
    浏览(35)
  • React -- 组件通信

    A-B 父子通信 B-C 兄弟通信 A-E 跨层通信 **实现步骤 ** 父组件传递数据 - 在子组件标签上绑定属性 子组件接收数据 - 子组件通过props参数接收数据 props可以传递任意的合法数据 ,比如数字、字符串、布尔值、数组、对象、函数、JSX props是只读对象 子组件只能读取props中的数据,

    2024年02月19日
    浏览(33)
  • react父子组件通信

    父传子:最常见 把父组件中的数据传给子组件 子传父:子组件调用父组件传递过来的参数,并且把想要传递的数据当成函数的实参传入即可 【子组件通过调用父组件传递到子组件的方法向父组件传递数据】 对于子传父中子组件还是先调用了父组件传递过来的参数,之后再向

    2024年02月07日
    浏览(29)
  • React组件之间通信

    1-1、安装 1-2、使用 A组件 B组件 1-3、总结

    2024年02月16日
    浏览(34)
  • React 组件通信方式

    人生的游戏不在于拿了一副好牌,而在于怎样去打好坏牌,世上没有常胜将军,勇于超越自我者才能得到最后的奖杯。 直接通过属性进行传递,数据的传递可以提高组件的复用性。 通过回调函数(callback)来实现。 ref 标记: 父组件拿到子组件的引用,从而调用子组件的方法

    2024年02月05日
    浏览(31)
  • 【React】组件生命周期、组件通信、setState

    ◼ 组件化思想的应用: ​  有了组件化的思想,我们在之后的开发中就要充分的利用它。 ​  尽可能的将页面拆分成一个个小的、可复用的组件。 ​  这样让我们的代码更加方便组织和管理,并且扩展性也更强。 ◼ React的组件相对于Vue更加的灵活和多样,按照不同的

    2024年01月20日
    浏览(34)
  • React中组件之间如何通信?

    我们将组件间通信可以拆分为两个词: 组件 通信 回顾Vue系列的文章,组件是 vue 中最强大的功能之一,同样组件化是 React 的核心思想 相比 vue , React 的组件更加灵活和多样,按照不同的方式可以分成很多类型的组件 而通信指的是发送者通过某种媒体以某种格式来传递信息

    2024年02月04日
    浏览(33)
  • 【react从入门到精通】React父子组件通信方式详解(有示例)

    【分享几个国内免费可用的ChatGPT镜像】 【10几个类ChatGPT国内AI大模型】 【用《文心一言》1分钟写一篇博客简直yyds】 【用讯飞星火大模型1分钟写一个精美的PPT】 在上一篇文章《JSX详解》中我们了解了什么是jsx以及jsx的语法规则。 本文中我们将详细了解React父子组件通信方式

    2024年02月05日
    浏览(62)
  • React中组件通信有哪些方式

    React中组件间的通信有一下几种情况:         父组件向子组件通信,可以通过props方式传递数据;也可以通过ref防暑传递数据;         子组件向父组件通信,通过回调函数方式传递数据;         父组件向后代所有组件传递数据,如果组件层级过多,通过props的方式传

    2024年02月14日
    浏览(28)
  • 前端JavaScript企业框架的全面解析

    在现代Web开发中,前端JavaScript框架扮演着至关重要的角色。它们提供了丰富的功能和工具,帮助开发人员构建功能强大且易于维护的企业级应用程序。本篇博客将全面解析前端JavaScript企业框架,介绍其优势、使用场景和常见的框架选择。 前端JavaScript企业框架是一套用于构建

    2024年02月12日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包