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 (<Modulekey={item.id}{...item}onToggle={onToggle}onDelData={onDelData}></Module>);})}</div>);
};export default App;
这段代码包括一个父组件App和一个子组件Module,实现了父子组件之间的通信。
在父组件App中,使用useState来定义了一个状态defaultTodo,并初始化为defaultTodos。defaultTodos是从./components/module/contentData文件中导入的一个默认的待办事项列表。
App组件中定义了两个回调函数onToggle和onDelData,分别用于切换待办事项的状态和删除待办事项。
子组件Module接收父组件传递的参数id、done、text、onToggle和onDelData。在子组件中,使用这些参数来展示待办事项的内容和状态,并通过点击事件调用父组件传递的回调函数来修改状态或删除待办事项。
在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><Listsize="large"header={<div>唐</div>}footer={<div>宋</div>}bordereddataSource={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"><ProFormonFinish={async (values) => {console.log(values);addListData(values.name);}}><ProFormText name="name" label="姓名" /></ProForm></div>);
};export default From;
这段代码包括一个父组件App和两个子组件From和List,实现了兄弟组件之间的值传递。
在父组件App中,使用useState定义了一个状态data,并初始化为一个包含三个对象的数组。父组件还定义了一个名为addListData的函数,用于向data数组中添加新的数据。
父组件通过将data状态和addListData函数作为props传递给子组件From和List。子组件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包裹的所有组件都可以访问这个共享的数据。在这个例子中,子组件ContentData和TitleData可以访问color的值。
子组件ContentData使用useContext钩子来订阅ThemeContext上下文,并使用theme变量来获取共享的数据color的值。在return语句中,展示了包含theme值的一段文字。
子组件GrandsonModule也使用了useContext钩子来获取color的值,并展示了包含theme值的一段文字。
子组件TitleData接收父组件传递的editColor函数,并在输入框的onChange事件中调用editColor函数来更新父组件的状态
相关文章:
React 组件通信-全面解析
父子组件通信 // 导入 import { useState } from "react";import "./App.scss"; import { defaultTodos } from "./components/module/contentData";// 子组件 const Module ({ id, done, text, onToggle, onDelData }) > {return (<div…...
“深入理解Spring Boot:快速构建微服务架构的利器“
标题:深入理解Spring Boot:快速构建微服务架构的利器 摘要:Spring Boot是一种基于Spring框架的开源项目,它通过自动化配置和约定优于配置的原则,使得开发者能够快速构建微服务架构。本文将深入介绍Spring Boot的特点和…...
SpringBoot超级详解
1.父工程的父工程 在父工程的父工程中的核心依赖,专门用来版本管理的 版本管理。 2.父工程 资源过滤问题,都帮解决了,什么配置文件,都已经配置好了,资源过滤问题是帮助,过滤解决让静态资源文件能够过滤到…...
手机的python怎么运行文件,python在手机上怎么运行
大家好,小编来为大家解答以下问题,手机上的python怎么运行程序,手机的python怎么运行文件,今天让我们一起来看看吧! 1、python程序怎么在手机上运行 python语言应用很广泛,自己也很喜欢使用它,其…...
RBAC三级树状菜单实现(从前端到后端)未完待续
1、表格设计 RBAC 2、前端路由 根据不同的用户id显示不同的菜单。 根据路由 3、多级菜单 展示所有权限,并且根据当前用户id展示它所属的角色的所有菜单。 前端树状展示 思路: 后端:传给前端map,map里1个是所有菜单&am…...
牛客网Verilog刷题——VL41
牛客网Verilog刷题——VL41 题目答案 题目 请设计一个可以实现任意小数分频的时钟分频器,比如说8.7分频的时钟信号,注意rst为低电平复位。提示:其实本质上是一个简单的数学问题,即如何使用最小公倍数得到时钟周期的分别频比。设小…...
大整数截取解决方法(java代码)
大整数截取解决方法(java代码) 描述输入描述输出描述输入示例输出示例前置知识:代码 解题思路来自这个博客:简单^不简单 https://blog.csdn.net/younger_china/article/details/126376374 描述 花花有一个很珍贵的数字串…...
Spring Boot使用@Async实现异步调用:自定义线程池
一、定义线程池 第一步,先在Spring Boot主类中定义一个线程池,比如: SpringBootApplication public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}EnableAsyncConfigurat…...
GFS 分布式文件系统
目录 一、GlusterFS 概述 1.2.GlusterFS特点 1.3.GlusterFS 术语 1.4GlusterFS 的工作流程 二、GlusterFS的卷类型 2.1分布式卷(Distribute volume) 2.1.1特点 2.2条带卷(Stripe volume) 2.2.1条…...
PHP-mysql学习笔记
如题 记录发送emoji数据无法正常显示的问题PHPMysql 记录 发送emoji数据无法正常显示的问题 问题描述 前端发送关于emoji的表情数据给php,php写入mysql php接收到了数据,但无法写入写入过后返回前端无法正常显示 PHP 在对应的pdd函数中设置字符集为utf8mb4 Mysql emoji数…...
AI技术快讯:清华开源ChatGLM2双语对话语言模型
ChatGLM2-6B是一个开源项目,提供了ChatGLM2-6B模型的代码和资源。根据提供的搜索结果,以下是对该项目的介绍: 论文:https://arxiv.org/pdf/2103.10360.pdf ChatGLM2-6B是一个开源的双语对话语言模型,是ChatGLM-6B模…...
网络基础知识
1、什么是链接? 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2、OSI 参考模型的层次是什么? 有 7 个 OSI 层:物理层,数据链路层,网络层,传输层,会话层,表…...
【应用层】HTTPS协议详细介绍
文章目录 前言一、什么是"加密"二、常见的加密方式三、数据摘要(数据指纹)四、证书总结 前言 HTTPS也是一个应用层协议,是在HTTP协议的基础上引入了一个加密层,由于HTTP协议内容都是按照文本的方式明文传输的ÿ…...
【Tensorboard+Pytorch】使用注意事项
安装 tensorboard/tensorboardx版本需要与tensorflow保持一致(本人使用2.2) 调用 环境变量 在终端或CMD中使用时,常见报错“tensorboard 不是内部或外部命令……”,需要添加环境变量路径path。具体为tensorboard.exe所在目录(A…...
设计模式行为型——命令模式
目录 什么是命令模式 命令模式的实现 命令模式角色 命令模式类图 命令模式举例 命令模式代码实现 命令模式的特点 优点 缺点 使用场景 注意事项 什么是命令模式 命令模式(Command Pattern)是一种数据驱动的设计模式,它属…...
13-2_Qt 5.9 C++开发指南_线程同步_QMutex+QMutexLocker(目前较为常用)
文章目录 1.线程同步的概念2. 基于互斥量的线程同步3.QMutex实现线程同步源代码3.1 qdicethread.h3.2 qdicethread.cpp3.3 dialog.h3.4 dialog.cpp 4.QMutexLocker 实现线程同步源代码4.1 qdicethread.h4.2 qdicethread.cpp4.3 dialog.h4.4 dialog.cpp 1.线程同步的概念 在多线…...
金融行业选择哪种SSL证书才安全可靠
由于金融领域等网站拥有大量客户的敏感信息,且每天都有大量交易需要进行,涉及到大量的资金问题,当这些机构提供的网络和Web应用程序没有足够的安全措施来阻止黑客窃取数据时,就会出现严重的安全问题。而且由于黑客每天都在开发越来…...
面试总结(三)
1.进程和线程的区别 根本区别:进程是操作系统分配资源的最小单位;线程是CPU调度的最小单位所属关系:一个进程包含了多个线程,至少拥有一个主线程;线程所属于进程开销不同:进程的创建,销毁&…...
青大数据结构【2016】
一、单选 二、简答 3.简述遍历二叉树的含义及常见的方法。 4.简要说明图的邻接表的构成。 按顺序将图G中的顶点数据存储在一维数组中, 每一个顶点vi分别建立一个单链表,单链表关联依附顶点vi的边(有向图为以vi为尾的弧)。 邻接…...
聊聊拉长LLaMA的一些经验
Sequence Length是指LLM能够处理的文本的最大长度,越长,自然越有优势: 更强的记忆性。更多轮的历史对话被拼接到对话中,减少出现遗忘现象 长文本场景下体验更佳。比如文档问答、小说续写等 当今开源LLM中的当红炸子鸡——LLaMA…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
