当前位置: 首页 > web >正文

react中父子数据流动和事件互相调用(和vue做比较)

前言:

        react中父子数据流动和事件互相调用,父组件给子组件数据,父组件调用子组件的事件,同理,子也可以调用父的数据和传值。

react是单向数据流,具体使用跟vue是不同的。

1、父组件的数据传给子组件,使用props,也就是{}

可以看到vue的数据绑定是v-bind,简写{{}}

react的数据也是props传值接收,简写就是{}

//引入子组件
import { Line as LineEchart } from "@/components/echarts";//定义变量,一种是hook的useState,另一种是直接定义变量
const [dealOpt, setDeal] = useState({});
const echartStyle = {height: 50,
};// option绑定我们的变量,用{}绑定变量
<LineEchart option={dealOpt} style={echartStyle} />
//子组件内部定义方法的时候,参数直接写在方法上面function Line({ theme = "light", style = {}, option = {} }) {....
}// memo是提高性能的hook函数
export default memo(Line, (prev, next) => prev.option === next.option);

2、父组件调用子组件内部的函数方法

通过ref来调用,具体要用到useRef + forwardRef + useImperativeHandle

vue的也是ref,不过直接用refs调用子级方法

父级组件内部,用ref来调用
import { useRef } from 'react'; //useRef 是ref的方法
import Child from './Child'; //引入子组件// 函数内部
// 默认定义ref,然后绑定到dom元素const childRef = useRef();const triggerChildMethod = () => {childRef.current.childMethod(); // 调用子组件方法,childRef.current
};return (<div><button onClick={triggerChildMethod}>点我触发事件</button><Child ref={childRef} /></div>
);
对应的子组件内部,forwardRef+useImperativeHandle 
import { forwardRef, useImperativeHandle } from 'react';const Child = forwardRef((props, ref) => {useImperativeHandle(ref, () => ({childMethod: () => {console.log("Child method called!");},}));return <div>Child Component</div>;
});

3、子给父传事件

vue的话,就是用$emit/defindEmit的方法

react的话,用回调函数,也是用{}来绑定

父级内部接收
import { useState } from 'react';
//用hook里面的useState定义变量childData
const [childData, setChildData] = useState('');// 定义父的事件
const handleDataFromChild = (data) => {setChildData(data); // 接收子组件的数据
};//onSendData是子给父的方法名return (<Child onSendData={handleDataFromChild} />});
子级发送
const sendData = () => {onSendData("Hello from Child"); // 调用父组件的回调函数,onSendData
};return <button onClick={sendData}>点击</button>;

4、跨层调用,父给子孙任意一级传值,或孙改父的数据,

vue的话,vuex或者eventBus

react用hook里面的createContext

父组件:
// 1. 创建 Context
import { createContext, useContext, useState } from 'react';const DataContext = createContext();// 2. 父组件提供数据
function Parent() {const [data, setData] = useState("我是默认数据");return (<DataContext.Provider value={{ data, setData }}>//Child 代表子组件,至于子嵌孙不用DataContext.Provider<Child /></DataContext.Provider>);
}
孙组件:
//data是我们的默认值,setData 可以修改这个默认值的事件
const { data, setData } = useContext(DataContext);return (<button onClick={() => setData("Updated Data")}>更改父内容: {data}</button>
);

5、redux来调用不同层级组件的事件与数据

http://www.xdnf.cn/news/17659.html

相关文章:

  • GO学习记录三
  • 基于MongoDB/HBase的知识共享平台的设计与实现
  • 【Dv3Admin】菜单转换选项卡平铺到页面
  • Excel 连接阿里云 RDS MySQL
  • 5G 非地面网络(NTN)最专业的方案
  • 高并发场景下分布式ID生成方案对比与实践指南
  • 在 .NET Core 5.0 中启用 Gzip 压缩
  • 从ELF到进程间通信:剖析Linux程序的加载与交互机制
  • 玩转Docker | 使用Docker部署Trilium Notes知识库工具
  • 5G NTN 卫星测试产品
  • word格式设置-论文写作,样式,字号等
  • WPF之绑定!
  • LeetCode——241.为运算表达式设计优先级
  • 在 RHEL9 上搭建企业级 Web 服务(Tomcat)
  • Android Audio实战——获取活跃音频类型(十五)
  • 深度学习与遥感入门(五)|GAT 构图消融 + 分块全图预测:更稳更快的高光谱图分类(PyTorch Geometric 实战)
  • 【数据可视化-86】中国育儿成本深度可视化分析(基于《中国统计年鉴2023》数据):用Python和pyecharts打造炫酷可视化大屏
  • 论文阅读 arxiv 2024 MemGPT: Towards LLMs as Operating Systems
  • Apache IoTDB 全场景部署:基于 Apache IoTDB 的跨「端-边-云」的时序数据库 DB+AI
  • Java 之抽象类和接口
  • SSH远程连接TRAE时显示权限被拒绝检查方案
  • 可视化程序设计(4) - 第一个图形窗口程序
  • Java进阶之单列集合Set接口下的通用方法
  • Linux下的软件编程——标准IO
  • ECharts Y轴5等分终极解决方案 - 动态适配缩放场景
  • 后量子密码学的迁移与安全保障:迎接量子时代的挑战
  • NLP---IF-IDF案例分析
  • FreeRTOS学习:优化系统
  • LeetCode_哈希表
  • 论文阅读:Aircraft Trajectory Prediction Based on Residual Recurrent Neural Networks