vue3 常用的几种组件通讯方式

news/2024/11/15 12:46:57/文章来源:https://www.cnblogs.com/bky419/p/18380088

vue3 常用的几种组件通讯方式,大致如下

  • Props/Emit
  • Pinia
  • 事件总线(mitt)
  • Provide/Inject
  • 浏览器本地存储

 

1. Props / Emit

注释:prop属性名称 / 方法名称的格式,采用 camelCase 与 kebab-case。

 

1.1 props

(1)上游组件设置 prop 值(通过 v-bind 或 冒号)

 或者

 

(2)下游组件接收 prop 值 (通过 defineProps 方法)

import { defineProps } from 'vue' 

更多详见:https://cn.vuejs.org/guide/components/props.html

 

1.2 Emit 

(1)上游组件:接收来自下游组件的方法触发

 

(2)下游组件:主动触发上游组件的方法 

或者

import { defineEmits } from 'vue' 

 

  

2. Pinia

  详见 vue3的 状态管理库

 

3. 事件总线(第三方库mitt)

   第一步:安装 mitt    npm install mitt -save

 

  第二步:初始化 mitt,即 新建一个 mitt.js 文件,然后写入如下内容

    import mitt from 'mitt'

    const emitter = new mitt()

    export default emitter


  第三步:触发 mitt

import emitter from '@/utils/mitt'

function handleClick() {

  emitter.emit('on-button-click', true);
}


  第四步:接收 mitt
    import { onMounted, onUnmounted } from 'vue';
    import emitter from '@/utils/mitt'

    function onFoo(e) {  console.log(' 触发了!');  }

    // 监听
    onMounted(() => {
      emitter.on('on-button-click', onFoo);
    });

    // 移除
    onUnmounted(() => {
      emitter.off('on-button-click',  onFoo);
    });

 

4. Provide/Inject

  跨组件通讯的情况中,有时不需要临近组件的数据,而是想要直接获取更远的祖级或孙级组件的数据。

  采用 props 的逐级数据传递显然比较麻烦,还需要注意中间组件的传递问题,如下图:

  provide-inject 的依赖注入方式,(就是在希望尽量避免 props逐级传递 可能出现问题的情况下而产生的),它无论层级有多深,都可以注入由祖组件提供给整条链路的依赖。

   以下是 provide-inject 的使用方式:

  (1)提供数据 provide()

注释:一个组件可以多次调用 provide(), provide() 函数接收两个参数。

      • 第一个参数是注入名,可以是一个字符串或是一个 Symbol
      • 第二个参数是提供的值,值可以是任意类型,包括响应式的状态

     特殊情况下,还可以在整个应用层面提供依赖,如下

 

  (2)注入数据 inject()

 

     注释:inject() 函数有三个参数

      • 第一个参数是注入的 key,与provide()函数的第一个参数对应
      • 第二个参数是可选的默认值,即在没有匹配到 key 时使用的默认值
      • 第三个参数是可选的 boolean 值,表示第二个参数是否被当作一个工厂函数,如果是,则第二个参数必须是工厂函数

 

 

5. 浏览器本地存储

采用 localstorage/sessionstorage 等存储在浏览器本地,然后通过 pinia 或 侦听器 来进一步处理,实现实时更新

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

巧手打字通-在线打字网站,终于来啦

儿子开信息课了,要练习电脑打字了 上个学期,上小学的孩子回家跟他妈妈说:“妈妈,我要学习打字,我们学校上信息课了。” 孩子妈妈听了这诉求,就把笔记本电脑拿了出来,打开了一个word文档,把电脑推到孩子面前,来,好好练习吧,加油! 过了十分钟,我来到孩子面前,看到了…

CentOS安装MySQL8教程

官方地址: https://dev.mysql.com/downloads/mysql/ 选择版本前需先看一下服务器的 glibc 版本 ldd --version上传 将下载好的 tar 包上传到服务器上,这里演示上传到了 /usr/local/ 文件夹下 (也可以自定义位置)解压 tar -Jxvf mysql-8.0.39-linux-glibc2.17-x86_64.t…

jQuery CSS 浏览器滚动到顶部固定左侧栏

<script>$(document).ready(function() {var div = $(#leftNav_2024925); // 替换为你的 div 的 IDvar divTop = div.offset().top; // 获取 div 顶部的位置$(window).scroll(function() {var scrollTop = $(this).scrollTop(); // 获取当前滚动条的位置if (scrollTop &g…

ProComponents——ProForm,设置初始值后,点击【重置】按钮,值已清除但页面未更新

我的问题 umi+antd,使用ProComponents的QueryFilter表单进行列表筛选,首页有个进入列表的快捷跳转,会筛选列表状态(在线1/离线0)。 设置筛选状态初始值为1后,点击【重置】按钮: 1.打印初始值1已清除,但页面上未更新,仍显示筛选在线状态 2.点击2次【重置】按钮,页面才…

Rust 中的关键字以及示例

Rust 中的关键字、保留字以及对应的示例1. 常见关键字as: 用于类型转换,例如将一个值从一种类型转换为另一种类型。let x: i32 = 42; let y: u8 = x as u8;break: 用于提前退出循环。for i in 0..10 {if i == 5 {break;} }const: 定义一个常量,常量的值在编译时就确定,不会在…

跨域——应对浏览器同源策略的一种方案

理解跨域,首先需要理解同源策略 (Same origin policy)。 何为源origin

LigerUI 中的 Grid (ligerGrid) 合并单元格

在网上搜索了很都都没有正确的方法实现 合并单元格, LigerGrid 不像 EasyUI 中的 Grid 可以直接 合并单元格。 我化了点时间,解决了, 就分享给大家, 我就不做详细的注释, 只有有一定基础的都可以看懂, 菜鸟就自己去补习吧。<div id="maingrid" style="…

linux系统下各种日志文件的介绍,查看,及日志服务配置

转载于https://zhuanlan.zhihu.com/p/298335887 ,侵权删! linux系统日志文件的详细介绍 日志文件的作用 日志文件用于记录linux系统的各种运行信息的文件,相当于linux主机的日记,不同的日志文件记载了不同类型的信息,如Linux内核消息、用户登录事件、程序错误等。. 日志文件…

金融保险行业ITSM案例分析报告

一、 项目背景 随着金融保险行业竞争的日益激烈以及信息技术的快速发展,数字化转型已成为企业发展的必由之路。然而,许多金融机构的信息中心仍然面临“重建设轻运维”的问题,即在信息化基础设施建设投入巨大之后,后续的运维管理却未能跟上步伐,导致信息化支撑力量薄弱。这…

maven项目中引入本地jar包配置

服务在本地可以正常运行,打包后放在服务器就无法运行,原来是引入的本地jar包maven没有打包上去 首先jar包是放在资源目录下的lib里pom文件在引入时指定jar包的路径,maven引入不会报错,但是打包后没有这个jar包<dependency><groupId>com.sun.jna.examples</g…

在stable diffussion中控制生成图片的光线Kj

合集 - AIGC(27)1.轻松复现一张AI图片04-222.Stable Diffusion中的常用术语解析04-233.Stable diffusion中这些重要的参数你一定要会用04-244.Stable Diffusion中的embedding04-255.怎么使用Stable diffusion中的models05-286.Stable Diffusion WebUI详细使用指南05-297.Stable…