【Vue3】组件通信的的各种方式和tsx风格

news2025/2/27 1:43:18

组件通信

      • Vue2组件通信方式
          • 全局事件总线bus,可以实现组件通信
      • Vue3组件通信方式
          • props
          • provide与inject依赖注入
      • 全局APi
      • Vue3其他改变
          • 组件通信之自定义事件
          • 组件通信之事件总线
          • 组件通信之v-model
          • 多个v-model传值
      • TSX风格
          • 使用风格一
          • 使用tsx风格,使用optionsApi模式
          • 使用tsx风格,使用setup函数模式
          • 使用tsx风格,使用数组比较麻烦
          • 使用tsx风格,来父子组件传值
          • 使用tsx风格,插槽

Vue2组件通信方式

  • props可以实现父子组件,子父组件,甚至是兄弟组件
  • 自定义事件,可以实现子父组件通信
全局事件总线bus,可以实现组件通信
  • pubsub,发布订阅模式实现任意组件通信
  • Vuex,集中式状态管理容量,可以实现任意组件通信
  • ref,父组件获取子组件实例vc
  • slot, 插槽,实现父子组件通信

Vue3组件通信方式

props
  • 需要使用到defineProps方法去接受父组件传递过来的数据
  • 页面中props可以省略前面的名字
  • props的数据是只读的
  • 父组件
<Child info="我是祖先" :money="money"></Child>
  • 子组件
<template>
  <div class="son">
       <h1>我是子组件</h1>
       <p>{{props.info}}</p>
       <p>{{props.money}}</p>
      <!--props可以省略前面的名字--->
       <p>{{info}}</p>
       <p>{{money}}</p>
       <button @click="updateProps">修改props数据</button>
  </div>
</template>

<script setup lang="ts">
//需要使用到defineProps方法去接受父组件传递过来的数据
//defineProps是Vue3提供方法,不需要引入直接使用
let props = defineProps(['info','money']); //数组|对象写法都可以
//按钮点击的回调
const updateProps = ()=>{
  // props.money+=10;  props:只读的
  console.log(props.info)
}
</script>
provide与inject依赖注入
  • 实现祖孙组件之间的通信
  • 当在深度嵌套的组件中,深层的子组件想要需要父组件的部分内容
  • 沿着prop方法传递,很麻烦
  • 采用依赖注入:
  • 祖先组件有一个provide选项来指定我们想要提供给后代组件的数据或方法
  • 子组件有一个inject来接收provide提供的数据或方法
  • 实现的效果图片
    在这里插入图片描述
  • 祖先存
    在这里插入图片描述
  • 后代取
    在这里插入图片描述

全局APi

  • 在Vue3中,不支持Vue.xxx,将它调整到应用实例app上
    在这里插入图片描述

Vue3其他改变

  • 移除keyCode作为v-on的修饰符,同时不再支持config.keycodes
  • 移除v-on.native修饰符,这个的作用就是当父组件点击子组件上的@click,不当原生click,当成了自定义事件,加了@click.native,就会变成原生click点击事件
  • 移除过滤器(filter)
组件通信之自定义事件
  • vue框架中事件分为两种,一种是原生的Dom事件,另外一种自定义事件

  • 原生dom事件可以让用户与网页进行交互,比如click这些

  • 自定义事件可以实现子组件给父组件传递数据

  • 子组件

  • 方式一

 <button @click="handler">点击我触发自定义事件xxx</button>
 //按钮点击回调
 <script setup lang="ts">
  const handler = () => {
  //第一个参数:事件类型 第二个|三个|N参数即为注入数据
    $emit('xxx','乞力马扎罗','18');
  };
 </script>
  • 方式二
<button @click="$emit('xxx','乞力马扎罗','18')">点击我触发自定义事件xxx</button>
<script setup lang="ts">
	//利用defineEmits方法返回函数触发多个自定义事件,defineEmits方法不需要引入直接使用
	let $emit = defineEmits(['xxx','click']);
</script>
  • 父组件
  <!-- 绑定自定义事件xxx:实现子组件给父组件传递数据 -->
  <Event2 @xxx="handler3" @click="handler4"></Event2>
  
  //事件回调---4
	const handler3 = (param1,param2)=>{
	    console.log(param1,param2);
	}
	//事件回调--5
	const handler4 = (param1,param2)=>{
     	console.log(param1,param2);
	}
组件通信之事件总线
  • 引入mitt插件:mitt一个方法,方法执行会返回bus对象
  • mitt方法身上带着一on方法和emit方法
  • 导入npm install – save mitt
  • impirt mitt from ‘ mitt’
    var mitt =require(‘mitt’)
  • 你也可以新建一个bus文件,创建index.ts
//引入mitt插件:mitt一个方法,方法执行会返回bus对象
import mitt from 'mitt';
const $bus = mitt();
export default $bus;
  • 子组件1
<button @click="handler">点击我给兄弟传值</button>
<script setup lang="ts">
//引入$bus对象
import $bus from '../../bus';
//点击按钮回调
const handler = ()=>{
  $bus.emit('xxx',{car:"我给你送"});
}
</script>
  • 子组件2
<script setup lang="ts">
import $bus from "../../bus";
//组合式API函数
import { onMounted } from "vue";
//组件挂载完毕的时候,当前组件绑定一个事件,接受将来兄弟组件传递的数据
onMounted(() => {
  //第一个参数:即为事件类型  第二个参数:即为事件回调
  $bus.on("xxx", (car) => {
    console.log(car);
  });
});
</script>
组件通信之v-model

父传子

  • 父组件
 <Child v-model="money"></Child>
  • 子组件
  • 接收的值modelValue是固定的
<h3>钱数:{{ modelValue }}</h3>

let props = defineProps(["modelValue"]);

子传父

  • 子组件
  • 同步更新父组件的@update事件
<button @click="handler">父子组件数据同步</button>

//方法一
//<button @click="handler" @update:modelValue=""handler>父子组件数据同步</button>

//方法2
//子组件内部按钮的点击回调
const handler = ()=>{
   //触发自定义事件
   $emit('update:modelValue',props.modelValue+1000);
}
  • 父组件
  • 自定义事件接收
let money = ref(10000);
//自定义事件的回调
const handler = (num) => {
  //将来接受子组件传递过来的数据
  money.value = num;
};

– 这样就形成闭环实现父子组件同步更新

多个v-model传值
  • 父组件
 <Child1 v-model:pageNo="pageNo" v-model:pageSize="pageSize"></Child1>
  • 子组件
<script setup lang="ts">
let props = defineProps(["name", "age"]);
let $emit = defineEmits(["update:name", "update:age"]);
//第一个按钮的事件回调
const handler = () => {
  $emit("update:name", props.name + 3);
};
</script>

TSX风格

  • 原先使用的是Template风格,现在可以扩展另一种风格TSX风格
  • 安装: npm install @vitejs/plugin-vue-jsx -D
  • 在vite.config.ts注册使用
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
//导入jsx
import vuejsx from "@vitejs/plugin-vue-jsx";
//在plugins下注册vuejsx
export default defineConfig({
  plugins: [vue(),vuejsx()],
})
使用风格一
  • 新建app.tsx
    在这里插入图片描述
  • 页面使用(接下来父级页面都是这个)
    在这里插入图片描述
使用tsx风格,使用optionsApi模式
  • defineComponent是Vue 3中高阶组件工厂函数,主要用于类型推导和提供一个统一的API,以创建Vue组件
  • 当你使用defineComponent时,它会接受一个对象或者一个包含setup函数和其他可选配置的函数,然后返回一个组件对象。这个组件对象可以直接被Vue实例化,并且会包含所有的生命周期钩子、响应式数据、计算属性、侦听器等
  • 使用变量是单括号
    在这里插入图片描述
使用tsx风格,使用setup函数模式

在这里插入图片描述

使用tsx风格,使用数组比较麻烦
  • v-if 也不支持,需要用三元表达式
    在这里插入图片描述
使用tsx风格,来父子组件传值
  • 子组件,的tsx风格
import { defineComponent } from 'vue';
//ref的值,在template中自动解包,在tsx不会,得使用.value
export default defineComponent({
  props: {
    name: String,
  },
  emits: ['on-getfdetail'],
  setup(props, { emit }) {
    const list = [{ name: '花花1' }, { name: '花花2' }, { name: '花花3' }];
    const fun = (item) => {
      console.log('回传', item);
      emit('on-getfdetail', item);
    };
    return () => (
      <>
        <div>props:{props?.name}</div>
        <hr />
        {list.map((v) => {
          //有问题,一上来就直接调用了
          // return <div onClick={fun()}>{v.name}</div>;
          // 函数柯里化解决
          return <div onClick={() => fun(v)}>{v.name}</div>;
        })}
      </>
    );
  },
});

  • App.vue页面父组件
<template>
  <div>
    <tsx @on-getfdetail="getname" name="乞力马扎罗"></tsx>
  </div>
</template>
<script setup lang="ts">
import tsx from './App';
const getname = (item) => {
  console.log(item, '子组件传的值');
};
</script>

<style scoped></style>

在这里插入图片描述

使用tsx风格,插槽
import { defineComponent } from 'vue';
//ref的值,在template中自动解包,在tsx不会,得使用.value

//留下插槽位置
const A = (_, { slots }) => (
  <>
    <div>{slots.default ? slots.default() : '默认值'}</div>
    <div>{slots.foo?.()}</div>
  </>
);
export default defineComponent({
  setup() {
    //定义插槽要展示的内容
    const slotName = {
      default: () => (<div>展示默认插槽</div>),
      foo: () => (<div>插槽</div>)
    };
    return () => (
      <>
        {/* 父组件展示内容 */}
        <A v-slots={slotName}></A>
      </>
    );
  },
});
  • 效果展示
    在这里插入图片描述

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

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

相关文章

V-JEPA模型,非LLM另外的选择,AGI的未来:迈向Yann LeCun先进机器智能(AMI)愿景的下一步

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Flink源码解析(1)job启动,从JM到TM过程详解

网络传输模型 首先在看之前,回顾一下akka模型: Flink通讯模型—Akka与Actor模型-CSDN博客 注:ActorRef就是actor的引用,封装好了actor 下面是jm和tm在通讯上的概念图: RpcGateway 不理解网关的作用,可以先移步看这里:网关_百度百科 (baidu.com) 用于定义RPC协议,是…

JS11-scroll相关属性和缓动动画

scroll 相关属性 window.onscroll() 方法 当我们用鼠标滚轮&#xff0c;滚动网页的时候&#xff0c;会触发 window.onscroll() 方法。效果如下&#xff1a;&#xff08;注意看控制台的打印结果&#xff09; 如果你需要做滚动监听&#xff0c;可以使用这个方法。 我们来看看和…

用C语言打造自己的Unix风格ls命令

在Unix或类Unix操作系统中&#xff0c;ls是一个非常基础且实用的命令&#xff0c;它用于列出当前目录或指定目录下的文件和子目录。下面&#xff0c;我们将通过C语言编写一个简化的ls命令&#xff0c;展示如何利用dirent.h头文件提供的函数接口实现这一功能。 #include "…

开始喜欢上了runnergo,JMeter out了?

RunnerGo是一款基于Go语言、国产自研的测试平台。它支持高并发、分布式性能测试。和JMeter不一样的是&#xff0c;它采用了B/S架构&#xff0c;更灵活、更方便。而且&#xff0c;除了API测试和性能测试&#xff0c;RunnerGo还加上了UI测试和项目管理等实用功能&#xff0c;让测…

Jenkins Pipeline中when的用法

目录 概述内置条件branchbuildingTagchangesetchangeRequestequalsexpressiontriggeredBytagenvironmentnotallOfanyOf 在进入 stage 的 agent 前评估 whenbeforeAgentbeforeInputbeforeOptions 示例单一条件、声明性流水线多条件、声明式管道嵌套条件&#xff08;与前面的示例…

综合实验---Web---进阶版

目录 实验配置&#xff1a; 1.PHP调整主配置文件时&#xff0c;修改文件内容 1.原内容调整(在编译安装的情况下) 2.调整如下 3.没有调整的&#xff0c;根据之前配置就行 2.配置Nginx支持PHP解析 1.原内容如下 2.调整如下 3.验证PHP测试页 1.原内容如下 2.调整如下 4…

U盘安装Linux系统报dracut-initqueue错误,解决方案

U盘安装Linux系统报dracut-initqueue错误&#xff0c;是因为系统所在U盘路径不对&#xff0c;需要修改 解决方法&#xff1a; dracut:/# cd dev >dracut:/# ls |grep sdb 查看你的u盘是哪个一般是sdbX,X是一个数字&#xff0c;也有可能是sda等&#xff0c;如果上边都不对…

C语言数据结构基础——二叉树学习笔记(二)topk问题

1.top-k问题 1.1思路分析 TOP-K 问题&#xff1a;即求数据结合中前 K 个最大的元素或者最小的元素&#xff0c;一般情况下数据量都比较大 。 比如&#xff1a;专业前 10 名、世界 500 强、富豪榜、游戏中前 100 的活跃玩家等。 对于 Top-K 问题&#xff0c;能想到的最简单直…

词令微信小程序怎么添加到我的小程序?

微信小程序怎么添加到我的小程序&#xff1f; 1、找到并打开要添加的小程序&#xff1b; 2、打开小程序后&#xff0c;点击右上角的「…」 3、点击后底部弹窗更多选项&#xff0c;请找到并点击「添加到我的小程序」&#xff1b; 4、添加成功后&#xff0c;就可以在首页下拉我的…

代码随想录算法训练营第二十七天 |131.分割回文串,一些思考

实际上&#xff0c;分割子集问题也是组合问题 &#xff08;图源代码随想录网站&#xff09; 一个套路&#xff0c;也就是说&#xff0c;每次递归函数参数列表传入start的时候&#xff0c;选中的元素相当于是在最后面划了一条分割线 回文子串的判断剪枝操作就很简单了&#xf…

AIGC元年大模型发展现状手册

零、AIGC大模型概览 AIGC大模型在人工智能领域取得了重大突破&#xff0c;涵盖了LLM大模型、多模态大模型、图像生成大模型以及视频生成大模型等四种类型。这些模型不仅拓宽了人工智能的应用范围&#xff0c;也提升了其处理复杂任务的能力。a.) LLM大模型通过深度学习和自然语…

什么是闭包?闭包的优缺点?闭包的应用场景?

什么是闭包&#xff1f; 闭包是指有权访问另外一个函数作用域中的变量的函数。 闭包形成的必要条件&#xff1a; 函数嵌套内部函数使用外部函数的变量内部函数作为返回值 举个栗子&#xff1a;实现每隔1s递增打印数字 使用闭包实现 for(var i1; i<5; i) {(function(i) {se…

Cointelegraph 策略主管 JASON CHOI确认出席Hack.Summit() 2024区块链开发者大会

随着区块链技术的蓬勃发展和广泛应用&#xff0c;一场备受瞩目的盛会即将拉开帷幕。Hack.Summit() 2024区块链开发者大会&#xff0c;由Hack VC主办&#xff0c;AltLayer和Berachain协办&#xff0c;Solana、The Graph、Blockchain Academy、ScalingX、0G、SNZ和数码港等机构的…

Python——模块

自定义模块 module_exercise.py文件 data 100 def func01():print("func01执行喽") class Myclass:def func02(self):print("func02执行喽")classmethoddef func03(cls):print("func03执行喽") exercise.py文件 # 调用方法1&#xff1a;&quo…

Unity2D实现鼠标拖动物体移动(简单好抄)

1.新建脚本&#xff0c;并将脚本拖到你想要拖动的物体上即可 using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine;public class text : MonoBehaviour {private Vector3 offset;public int x 1;void OnMouseDown(…

入门:vue使用Echarts绘制地图的步骤

匠心接单中...8年前端开发和UI设计接单经验&#xff0c;完工项目1000&#xff0c;持续为友友们分享有价值、有见地的干货观点&#xff0c;有业务需求的老铁&#xff0c;欢迎关注发私信。 安装echarts和echarts-map插件 npm install echarts --save npm install echarts-map --…

深入理解mysql 从入门到精通

1. MySQL结构 由下图可得MySQL的体系构架划分为&#xff1a;1.网络接入层 2.服务层 3.存储引擎层 4.文件系统层 1.网络接入层 提供了应用程序接入MySQL服务的接口。客户端与服务端建立连接&#xff0c;客户端发送SQL到服务端&#xff0c;Java中通过JDBC来实现连接数据库。 …

YOLOV5 部署:基于web网页的目标检测(本地、云端均可)

1、前言 YOLOV5推理的代码很复杂,大多数都是要通过命令行传入参数进行推理,不仅麻烦而且小白不便使用。 本章介绍的web推理,仅仅需要十几行代码就能实现本地推理,并且只需要更改单个参数就可以很方便的部署云端,外网也可以随时的使用 之前文章介绍了QT的可视化推理界面,…

代码随想录day25(2)二叉树:验证二叉搜索树(leetcode98)

题目要求&#xff1a;给定一个二叉树&#xff0c;判断其是否是一个有效的二叉搜索树。 思路&#xff1a;首先对于二叉搜索树&#xff0c;它的中序遍历是有序的。最简单的想法就是将二叉搜索树转成一个数组&#xff0c;验证数组是否有序就可以&#xff08;二叉搜索树中没有重复…