React V6实现父子组件双向绑定传值

news2024/12/22 19:54:11

功能背景

之前在写vue的时候用到一个很好用的东西,比如控制一个dialog的显示隐藏,那么可以由父组件控制它显示,子组件(即这个dialog)自己可以关闭自己,那么他们之间只维护一个visible的状态,就需要响应式的操作。

vue中

子组件

//vue2.x
props:['dialogVisible','desc'],
 computed:{
        "_dialogVisible":{
            get(){
                return this.dialogVisible
            },
            set(val){
                this.$emit('update:dialogVisible',val)
            }
        },
}

//vue3.x
props: {
    dialogVisible: {
      type: Boolean,
    },
  },
const _dialogVisible = computed({
      get(){
        return props.dialogVisible
      },
      set(val){
        emit('update:dialogVisible',false)
      }
    })

父组件

父组件引入子组件,并双向传值,写法为sync

//vue2.x
<mydialog :dialogVisible.sync="dialogVisibleCropper"  :desc="desc"/>
//vue3.x
<mydialog 
    v-model:dialogVisible="dialogVisibleCropper" />


react中

效果如图
在这里插入图片描述
在这里插入图片描述

子组件

import { Button } from 'antd';
import React from 'react';
import { useEffect, useState,useRef } from 'react'
import eventBus from '@/utils/eventBus';

const SonComponent = ({ dialogVisible, updateVisible }) => {
  const _visible = {
    get() {
      return dialogVisible;
    },
    set(val) {
      //广播子组件的状态改变
      updateVisible && updateVisible(val);
    },
  };

  const ctrlChoosen = (event) => {
    _visible.set(event.target.checked);
  };
  const closeVisible = () => {
    _visible.set(false);
  };

  //这里实现eventBus的监听,监听父组件的传参
  useEffect(() => {
    eventBus.on('buttonClick', (val) => {
      //do some thing
      console.log('监听到',val)
    });
    return () => {
      eventBus.off('buttonClick');
    };
  }, []);

  return (
    <div>
      <Button onClick={closeVisible}>子组件控制关闭</Button>
      <br></br>
      <input type="checkbox" checked={_visible.get()} onChange={ctrlChoosen} />
      <label>子组件状态{_visible.get()?'开':'关'}</label>
    </div>
  );
};

export default SonComponent;

父组件

//父子组件响应式交互
  const [dialogVisible, setDialogVisible] = useState(false);
  //订阅子组件的状态改变
  const subscribeVisible = (newDialogVisible) => {
    // 将逻辑层的状态设置为新的计算属性值
    setDialogVisible(newDialogVisible);
  };

//然后父组件同时使用监听 监听这个状态 还可以做一些其他的事,当时也可以在上面的subScribe里面做,这里重在使用这个功能
  useEffect(() => {
    //这是watch或者说是updated
    const watchVisible = ()=>{
      // console.log(`Visible has changed: ${dialogVisible}`);
      if(dialogVisible){
        console.log(`Visible has changed: ${dialogVisible}`);
      }
    }
    watchVisible()
    
  }, [dialogVisible]);


<h1>父子组件响应式交互</h1>
      <div>
        <Button onClick={()=>{setDialogVisible(true)}}>父组件控制打开</Button>
        <SonComponent dialogVisible={dialogVisible} updateVisible={subscribeVisible} />
        {/* <p>{`dialogVisible state is ${dialogVisible}`}</p> */}
      </div>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/699074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

预约时间列表 带标签 上午下午 今天明天

/*** 时间列表* $interval 间隔X分钟* */ function timeList($day7,$time108:00,$time222:00,$interval60){$date_list [];//日期列表$today_date strtotime(date(Y-m-d,time()));for($i0;$i<$day;$i){$date_title date(Y-m-d,$today_date($i*86400));$buff array();for…

win7下如何开启远程桌面服务?让别人连接的方法

当某台计算机开启了远程桌面连接功能后就可以在网络的另一端控制这台计算机了&#xff0c;通过远程桌面功能可以实时地操作这台计算机&#xff0c;在上面安装软件&#xff0c;运行程序&#xff0c;所有的一切都好像是直接在该计算机上操作一样。这就是远程桌面的最大功能&#…

基于Python所写的图片批量处理器设计

点击以下链接获取源码资源&#xff1a; https://download.csdn.net/download/qq_64505944/87964231 《图片批量处理器》程序使用说明 在PyCharm中运行《图片批量处理器》即可进入如图1所示的系统主界面。在该界面中&#xff0c;通过顶部的菜单栏可以选择所要进行的操作。 图…

2023上半年软考系统分析师科目一整理-06

2023上半年软考系统分析师科目一整理-06 在数据库设计的需求分析、概念结构设计、逻辑结构设计和物理结构设计的四个阶段中&#xff0c;基本E-R图是( D )。 A.需求分析阶段形成的文档&#xff0c;并作为概念结构设计阶段的设计依据 B.逻辑结构设计阶段形成的文档&#xff0c;…

python获取目标主机的MAC地址

下载插件&#xff1a;WinPcap Download 下载后直接安装&#xff08;虽然已停止更新&#xff0c;但还能正常使用&#xff09; python代码&#xff1a;安装 scapy 包 from scapy.all import Ether, ARP, srpdef get_mac_address(ip):# 创建一个ARP请求数据包arp Ether(dst"…

独家!同比增长超两倍,空气悬架前装市场「爆表」

接近20万套&#xff08;19.56万辆&#xff09;、同比增长超2倍&#xff08;222.88%&#xff09;&#xff0c;这是空气悬架系统在今年1-5月中国乘用车市场交出的答卷。同时&#xff0c;更多的供应商正在进入这个爆发式增长的细分市场。 高工智能汽车研究院监测数据显示&#xf…

第三方apple pencil哪个好?ipad第三方电容笔了解下

要知道&#xff0c;苹果原装的Pencil虽然性能很好&#xff0c;但是价格不菲&#xff0c;普通用户根本用不起。所以&#xff0c;是否有一种和Apple Pencil一样具有同样功能的电容笔吗&#xff1f;的确是这样。国内生产的平替电容笔跟苹果Pencil书写上并没有太大的区别&#xff0…

运行teb_local_planner/TebLocalPlannerROS时报错

在navigation时&#xff0c;运行pnc导航&#xff0c;报了Failed to create the teb_local_planner/TebLocalPlannerROS的错误。 解决办法&#xff1a; 在你的工作空间catkin_ws/src下进行teb源码安装 git clone https://github.com/rst-tu-dortmund/teb_local_planner完成后…

华为OD机试真题 Python 实现【数字加减游戏】【2023Q1 200分】,附详细解题思路

一、题目描述 小明在玩一个数字加减游戏&#xff0c;只使用加法或者减法&#xff0c;将一个数字s变成数字t。 每个回合&#xff0c;小明可以用当前的数字加上或减去一个数字。 现在有两种数字可以用来加减&#xff0c;分别为a&#xff0c;其中b没有使用次数限制。 请问小明…

vue-esign签字板,鼠标写名,支持PC\移动端,返回base64或者file格式的文件流vue vue-esign签字插件

开源地址: 示例DEMO vue里实现鼠标签名,支持PC\移动端,返回base64或者file格式的文件流 1 、安装插件 vue-esign npm install vue-esign --save2、在main.js引用 import vueEsign from vue-esign Vue.use(vueEsign)3、页面中使用 <template><div><el-card cla…

【有奖体验】这个 AI 智能回答,就一个字“绝”!

立即体验基于函数计算部署【文生文】一键部署 ChatYuan 模型&#xff1a; https://developer.aliyun.com/topic/aigc_fc 人工智能生成内容&#xff08;Artificial Intelligence Generated Content&#xff0c;简称 AIGC&#xff09;是当下最火的概念之一。AIGC 被认为是继专业…

iMazing 2.16官方下载使用起来安全吗?

鉴于苹果设备的封闭性与安全性&#xff0c;我们大部分情况下都需要搭配iTunes进行设备的管理。但作为一款全方位的iOS设备管理软件&#xff0c;iMazing竟然可以突破iTunes的限制&#xff0c;与设备直接连接&#xff0c;进行备份、管理等操作。 因此&#xff0c;很多人都会有疑…

Python中怎么清屏

文章目录 一、“Windows命令行窗口”下清屏二、在IDLE下清屏三、后记结语 一、“Windows命令行窗口”下清屏 “Windows命令行窗口”下清屏&#xff0c;可用下面两种方法&#xff1a; 第一种方法&#xff0c;在命令行窗口输入&#xff1a; import os ios.system("cls&qu…

【数据结构】栈和队列(栈篇)

目录 1.栈的概念及结构 2.栈的实现 2.1栈的结构体定义 2.2栈的常用接口函数 &#x1f43e;栈的初始化 &#x1f43e;插入数据 &#x1f43e;删除数据 &#x1f43e;取栈顶元素 &#x1f43e;判断栈是否为空 &#x1f43e;计算栈的大小 &#x1f43e;栈的销毁 2.3完…

【机器学习】基于t-SNE数据可视化工程

一、说明 t-SNE (t-Distributed Stochastic Neighbor Embedding)是一种常用的非线性降维技术。它可以将高维数据映射到一个低维空间(通常是2D或3D)来便于可视化。Scikit-learn API提供TSNE类,以使用T-SNE方法可视化数据。在本教程中,我们将简要学习如何在 Python 中使用 TS…

java投票管理系统小程序

投票管理系统小程序 演示视频 技术&#xff1a; 基于springbootvue小程序的投票管理系统的设计与实现 运行环境&#xff1a; JAVA版本&#xff1a;JDK1.8 IDE类型&#xff1a;IDEA、Eclipse都可运行 微信开发这工具 数据库类型&#xff1a;MySql&#xff08;8.x版本都可&am…

Spark窗口函数的原理

如下几个概念&#xff1a; 批处理时间-每个批次处理数据的时间 窗口时间间隔-窗口长度&#xff0c;是一个抽象的时间概念&#xff0c;可以表示一个窗口下有多少个批次的数据&#xff08;再次封装&#xff09;需要处理&#xff0c;故必须是批处理时间的整数倍 滑动窗口时间间…

从小白到大神之路之学习运维第48天---第三阶段----mysql数据库的主从复制和读写分离

第三阶段基础 时 间&#xff1a;2023年6月28日 参加人&#xff1a;全班人员 内 容&#xff1a; mysql主从复制和读写分离 目录 一、mysql基础 &#xff08;一&#xff09;优点&#xff1a; &#xff08;二&#xff09;类型&#xff1a; &#xff08;三&#xff09;支…

【Spring】— Spring MVC复杂数据绑定

目录 复杂数据绑定1.绑定数组2.绑定集合 复杂数据绑定 实际项目开发中&#xff0c;除了简单数据类型外&#xff0c;还会经常遇到一些比较复杂的数据绑定问题&#xff0c;比如数组的绑定、集合的绑定&#xff0c;接下来将具体讲解一下数组绑定和集合绑定的使用。 1.绑定数组 …

白嫖福利?微软推出免费AI培训计划,助内容创作者实现自动化创作

据《IT之家》报道&#xff0c;微软今日宣布推出一项全新的免费AI培训计划&#xff0c;旨在帮助工作人员快速掌握AI技术的基本概念和应用。通过在线课程和证书&#xff0c;助力内容创作者实现更简单、自动化的内容创作。 作为微软的“技能培训计划”&#xff0c;微软旗下的领英&…