vue3_组件间通信方式

目录

一、父子通信

1.父传子( defineProps)

2.父传子(useAttrs)

3.子传父(ref,defineExpose )

4.子传父(defineEmits)

5.子传父(v-model)

二、祖孙通信

1.祖传孙(provide/inject)

三、任意关系通信

1.mitt

2.vuex / pinia

3.浏览器缓存

四、路由跳转通信

1.query传参

2.params传参

3.state传参


一、父子通信

1.父传子( defineProps

在子元素里面使用defineProps接收父元素传过来的参数。

父组件:

<template><child :data="data"></child>
</template><script setup>
import { ref } from 'vue'
import child from './child.vue'const data= ref('传个参')
</script>

子组件:

<template><div>{{ props.data}}</div>  
</template><script setup>
import { defineProps } from 'vue'const props = defineProps({     //接收父组件传过来的参数data: {type: String,default: '',},
})
</script>

2.父传子(useAttrs)

父传给子参数,props参数(指 :data="参数")由defineProps接收,但非props参数(指 data="参数"  少了:)由useAttrs接收。

父组件:

<template><child :name="参数" data="666"/>
</template><script setup>
import child from './child.vue'
</script>

子组件:

<template><div>{{ props.name }}   // '参数'</div>
</template><script setup>
import { defineProps, useAttrs } from 'vue'
const props = defineProps({name: {type: String}
})const myattrs = useAttrs()
console.log(myattrs)   //  { "data": "666" }
</script>

3.子传父(ref,defineExpose )

此方法是通过,父组件调用子组件抛出的的方法和参数来进行传参的。

子组件:

<template><div></div>
</template><script setup>import { defineExpose } from "vue"const chileMethod = () =>{console.log("我是方法")}const name = ref('参数')defineExpose({    // 对外暴露name,chileMethod})
</script>

父组件:

<template><child ref="myref"></child><button @click="myClick">点击</button>
</template><script setup>import child from "./child.vue"import { ref } from "vue"const myref = ref(null)const myClick = () => {console.log(myref.value.name) // 直接获取到子组件的属性myref.value.chileMethod()      // 直接调用子组件的方法}
</script>

4.子传父(defineEmits)

在子元素里面使用defineEmits接收父元素里面的方法,并通过调用方法将参数传给父元素。

子组件:

<template><div ></div>
</template><script setup>
import { ref, defineEmits } from 'vue'const data = ref('传个参')
const emits = defineEmits(['addEvent']) //addEvent是父元素里面的一个函数方法,通过这个方法传参
const handleSubmit = () => {    emits('addEvent', data.value)
}
</script>

父组件:

<template><child @addEvent="handle"></child>
</template><script setup>
import { ref } from 'vue'
import child from './child.vue'const handle = value => {console.log(value); // '传个参'
}
</script>

5.子传父(v-model)

 v-model其实语法糖,如下两行代码作用是一样, 上面是下面的简写。

<chile v-model:title="title" /><chile :title="title" @update:title="title = $event" />

父组件:

<template><child v-model:name="name" v-model:num="num"></child>
</template><script setup>import child from "./child.vue"import { ref, reactive } from "vue"const name = ref("参数")const num = ref("666")
</script>

子组件:

注意:update:是固定写法。

<template><button @click="clickEvent">点击</button>
</template><script setup>import { defineEmits } from "vue"const emit = defineEmits(["name","num"])// 子组件更新参数const clickEvent = () => {emit("update:name", "孙悟空")emit("update:num", "999")}
</script>

二、祖孙通信

1.祖传孙(provide/inject)

这个祖传孙也包括了父传子。provide和inject叫依赖注入,是vue官方提供的API,它们可以实现多层组件传递数据,无论层级有多深,都可以通过这API实现。

祖组件:

<template><div></div>
</template><script setup>
import { ref, provide } from 'vue'
const name = ref('参数')// 向后代组件提供数据, 只要是后代都能接收
provide('name', name.value)
</script>

孙组件:

<template><div>{{ name }}</div>
</template><script setup>
import { inject } from 'vue'
// 接收顶层组件的通信
const name = inject('name')
</script>

三、任意关系通信

1.mitt

首先下载 npm 包

 npm install --save mitt

在main.js文件进行全局挂载, $bus是自定义属性名:

import mitt from "mitt"const app = createApp(App)app.config.globalProperties.$bus = new mitt()

传参出去的组件:

<script setup>import mitt from 'mitt'const emitter = mitt()emitter.emit('自定义的事件名称','参数')
</script>

接收参数的组件:

<script setup>import mitt from 'mitt'const emitter = mitt()emitter.on('自定义的事件名称', '参数' )
</script>

2.vuex / pinia

后续会出一个专门的文章讲解这部分。

3.浏览器缓存

  • sessionStorage(临时存储):为每一个数据源维持一个存储区域,在浏览器打开期间存在,包括页面重新加载
  • localStorage(长期存储):与 sessionStorage 一样,但是浏览器关闭后,数据依然会一直存在
// 存储数据
localStorage.setItem('key', 'value');
sessionStorage.setItem('key', 'value');// 获取数据
const valueFromLocalStorage = localStorage.getItem('key');
const valueFromSessionStorage = sessionStorage.getItem('key');// 删除数据
localStorage.removeItem('key');
sessionStorage.removeItem('key');// 清空所有数据
localStorage.clear();
sessionStorage.clear();

四、路由跳转通信

1.query传参

传递参数:

import router from "@/router";const query = { id: 666, name: '参数' }
router.push({ path: '/user', query })

接收参数:

import { useRoute} from 'vue-router'const route = useRoute()
console.log(route.query)

2.params传参

传递参数:

router.push({name: 'test', params: {name: '参数'}
})

接收参数:

import { useRoute} from 'vue-router'
const route = useRoute()
console.log(route.params) // { name: '参数' }

3.state传参

传递参数

<script setup>import { useRouter } from 'vue-router'
const router = useRouter();
router.push({ path: "/project",state:{data:JSON.stringify(json)}})<script>

接收参数:

<script setup>
import { ref } from "vue";
const tableData = ref([]);if (history.state.data) {tableData.value  = JSON.parse(history.state.data)
}
<script>

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

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

相关文章

车载测试面试题专题 - 如何测试蓝牙电话功能

现代车载系统中&#xff0c;蓝牙电话功能已经成为了一个必不可少的功能。它不仅提高了驾驶安全性&#xff0c;还提供了极大的便利性。作为车载行业的测试人员&#xff0c;如何全面、有效地测试车载蓝牙电话功能是我们工作的重要部分。因此在车载测试的面试过程中&#xff0c;蓝…

k8s怎么监听自定义资源的变更?(1)

这里我们通过 k8s的 code-generate来生成操作自定义资源的代码来监听变更 第一步下载工具 下载安装 k8s code-generate 查看我们的k8s版本 kubectl get node 输出结果为 可以看到我们的k8s版本为 v1.22.0 所以此时我们要下载与之对应的版本的code-generate git clone htt…

深入解析 Web 开发中的强缓存与协商缓存机制

在 Web 开发中,缓存机制是提高页面加载速度和用户体验的重要技术。缓存分为两种主要类型:强缓存和协商缓存。本文将详细介绍这两种缓存机制的原理、实现方式及其区别,并演示如何在 <meta> 元素中和 Nginx 服务器中进行缓存控制。 强缓存 强缓存(Strong Caching)是指…

iPhone的5G设置怎么更改吗?设置好这些能够优化电池的使用寿命

随着5G技术的普及&#xff0c;iPhone用户现在可以享受到更快的网络速度&#xff0c;但这同时也带来了一个问题&#xff1a;如何在使用5G和保持电池寿命之间找到平衡&#xff1f;苹果公司通过引入“5G Auto”设置&#xff0c;为用户提供了一个智能的解决方案&#xff0c;但用户也…

【JAVA WEB实用与优化技巧】如何使用本地.bat/.sh脚本快速将服务发布到测试环境?

文章目录 普通方式的springboot 使用docker打包发布【手动构建镜像模式】1. maven 打包可运行jar包2.手动打包镜像3.运行容器 全自动化本地命令发布到远程服务的方式配置ssh信任公钥获取公钥git 获取公钥方式: 桌面右键 -> open git gui here -> help -> show SSH key…

Honor of Kings 2024.06.03 50star (S35) AFK

Honor of Kings 2024.06.03 50star (S35) AFK 来个赛季S35总结吧&#xff0c;这个赛季结束以后&#xff0c;可能要和【魔兽世界】一样AFK了&#xff0c;手游来说肯定没法子和WOW相比&#xff0c;干啥都是有队友才好玩。 我玩的基本都是肉&#xff0c;爆发强的英雄&#xff0c;最…

llama-factory微调大模型

一、背景 微调或者全量调大语言模型&#xff0c;还包括deepseek,想找个快速的微调教程&#xff0c;网上暂时没有 二、原理和步骤 原理&#xff1a;搭建环境太累了&#xff0c;还是docker环境镜像简单快捷 1、先下载模型 如果用本身的会自动从huggingface下载&#xff0c;这…

解决JSON.stringify 方法在序列化 BigInt 类型时的错误

今天学nest时&#xff0c;使用apifox发送请求获取数据&#xff0c;结果还一直报错&#xff0c;而且还是我从未见过的 Do not know how to serialize a BigInt at JSON.stringify (<anonymous>) at stringify&#xff0c; 我都是跟着人家敲的&#xff0c;我就纳闷了&…

vector的使用和实现

目录 一、vector的常用接口说明1.vector的介绍2.vector的使用2.1 vector的定义2.2 vector的遍历operator[ ]迭代器范围for 2.3 vector的空间增长问题size和capacityreserveresize 2.4 vector的增删查改push_back和pop_backinserterasefindsort vector的模拟实现1、基本成员变量…

Linux基础操作——文件系统+find+head+tail

Linux基础操作——文件系统findheadtail 本文主要涉及LINUX的一些基础操作&#xff0c;文件系统与find命令head和tail命令 文章目录 Linux基础操作——文件系统findheadtail一、Linux下的文件类型二、ls -l 后各列的解释三、 find 查找四、 head 与 tail 查看文件的头部尾部 一…

Nginx Rewrite

Nginx Rerite概述 Nginx Rerite基本操作 location与rewrite的区别 location 通过前缀或正则匹配用户的URL访问路径做页面跳转、访问控制和代理转发 rewrite 对用户的URL访问路径进行重写&#xff0c;再重定向跳转访问重写的路径 Nginx正则表达式 校验数字的表达式 数字&a…

家宽动态公网IP,使用docker+ddns 实现动态域名解析

官方地址&#xff1a;https://github.com/jeessy2/ddns-go 安装docker docker pull jeessy/ddns-godocker run -d --name ddns-go --restartalways --nethost -v /opt/ddns-go:/root jeessy/ddns-go然后访问ip端口 配置时注意如下

pytorch+YOLOv8-1

1.工具开发 2.idea配置pytorch环境 默认安装新版本torch pip install torch 3.pytorch验证 4. print(torch.cuda.is_available()) 输出结果为 False 说明我只能用cpu

有关RIPv2认证技术与网络安全综合实验

有关RIPv2认证技术与网络安全综合实验 实验拓扑如下&#xff1a; 理论知识&#xff1a; 比较 RIPv1&#xff1a;广播式通信&#xff0c;255.255.255.255&#xff1b;不支持认证&#xff0c;有类不带掩码&#xff1b;不支持VLSM和CIDR RIPV2&#xff1a;组播通信&#xff0c;22…

【Matplotlib作图-4.Distribution】50 Matplotlib Visualizations, Python实现,源码可复现

目录 04 Distribution 4.0 Prerequisite 4.1 连续变量的直方图(Histogram for Continuous Variable) 4.2 分类变量的直方图(Histogram for Categorical Variable) 4.3 Density Plot 4.4 Density Curves with Histogram 4.5 Joy Plot 4.6 Distributed Dot Plot 4.7 Box P…

详解和实现数据表格中的行数据合并功能

theme: smartblue 前言 需求场景&#xff1a; 在提供了数据查看和修改的表格视图中(如table、a-table等…)&#xff0c;允许用户自行选择多行数据&#xff0c;依据当前状态进行特定列数据的合并操作。选中的数据将统一显示为选中组的首条数据值。同时&#xff0c;页面会即时反…

插入排序(直接插入排序与希尔排序)----数据结构-排序①

1、插入排序 1.1 插入排序的基本思想 将待排序的元素按其数值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的元素插入完为止&#xff0c;就可以得到一个新的有序序列 。 实际上在我们的日常生活中&#xff0c;插入排序的应用是很广泛的&#xff0c;例如我…

二分查找算法介绍(边界值、循环条件、值的变化、二分查找的原理、异常处理)

一、二分查找法原理介绍 二分查找是经典的查找算法之一&#xff0c;其原理也非常简单。 对于已排序的数组&#xff08;假设是整型&#xff0c;如果非整型&#xff0c;如果有排序和大小比较的定义&#xff0c;也可以使用二分查找&#xff09;&#xff0c;我们每次判断中间值与目…

Golang TCP网络编程

文章目录 网络编程介绍TCP网络编程服务器监听客户端连接服务器服务端获取连接向连接中写入数据从连接中读取数据关闭连接/监听器 简易的TCP回声服务器效果展示服务端处理逻辑客户端处理逻辑 网络编程介绍 网络编程介绍 网络编程是指通过计算机网络实现程序间通信的一种编程技术…

三十五、openlayers官网示例Dynamic Data——在地图上加载动态数据形成动画效果

官网demo地址&#xff1a; Dynamic Data 初始化地图 const tileLayer new TileLayer({source: new OSM(),});const map new Map({layers: [tileLayer],target: "map",view: new View({center: [0, 0],zoom: 2,}),}); 创建了三个样式 const imageStyle new Style(…