vue组件通信的方式?

父子通信:

1、父传子:在父组件的子组件标签绑定一个自定义属性,子组件通过props获取父组件传递的数据。

//父 
<child :data="list" @del="idx => list.splice(idx, 1)" ref="child" :isShow.sync="isShow" />
//子props: {data: {type: Array,required: true},value: { // 固定的名字(v-model)type: Boolean,default: false},isShow: {type: Boolean,default: false}},

vue3通过defineProps接受props数据

//vue3获取父组件数据defineProps({goods: {type: Array}
})

2、子传父:在父组件的子组件的标签上绑定一个自定义方法,子组件通过$emit触发父组件传递的方法从而传递数据给父组件。

//父
<child :data="list" @del="idx => list.splice(idx, 1)" ref="child" :isShow.sync="isShow" />
//子<li v-for="(item, index) in data" :key="item">{{ item }}<button @click="$emit('del', index)">删除</button></li>

vue3中通过defineEmits接受父组件的方法

const emit = defineEmits(['del', 'add'])const del = (id) => {emit('del', id)
}
const add = () => {emit('add')
}

vue3以上代码都是在setup语法糖中写的

3、ref:通过给子组件标签定义ref属性,通过this.$refs.ref属性名或租子组件的实例

//父
<child :data="list" @del="idx => list.splice(idx, 1)" ref="child" :isShow.sync="isShow" />
//子methods: {clickMe() {console.log(this.$refs.child.msg)}}

4、$parent:通过this.$parent获取父节点

//子methods: {clickMe() {console.log(this.$parent)}}

5、$root:获取根节点

//子methods: {clickMe() {console.log(this.$root)}}

6、v-model:通过双向数据绑定实现数据传递

//父
<child :data="list" @del="idx => list.splice(idx, 1)" ref="child" v-model="isShow" />
//子<div v-if="value"><h3>我是子组件</h3><ul><li v-for="(item, index) in data" :key="item">{{ item }}<button @click="$emit('del', index)">删除</button></li></ul><hr /><button @click="send">发送数据</button><button @click="$emit('input', false)">关闭</button></div>//props获取父组件通过v-model传递的值,值只能是value,通过value判断数据显隐props: {data: {type: Array,required: true},value: { // 固定的名字(v-model)type: Boolean,default: false},isShow: {type: Boolean,default: false}},

v-model缺点:只能使用一次,因为父组件传递的值在子组件中只能通过props获取并且值为value,不能触发多次

7、.sync修饰符:

//父
<child :data="list" @del="idx => list.splice(idx, 1)" ref="child" :isShow.sync="isShow" />
//子
<div v-if="isShow"><h3>我是子组件</h3><ul><li v-for="(item, index) in data" :key="item">{{ item }}<button @click="$emit('del', index)">删除</button></li></ul><hr /><button @click="send">发送数据</button><button @click="$emit('update:isShow', false)">关闭</button><hr /><div>{{ title }}</div></div></div>props: {data: {type: Array,required: true},value: { // 固定的名字(v-model)type: Boolean,default: false},isShow: {type: Boolean,default: false}},

通过父组件传递属性的时候加上.sync修饰符,子组件通过$emit接受到传递的属性通过update:属性名可进行修改

兄弟通信:

8、全局事件总线(事件搭桥):

main.js文件中创建一个实例对象,通过this.bus.$emit('方法名',传递的数据)发送数据

兄弟组件可以通过this.bus.$on('方法名',回调)接受数据

//main.js
// 创建一个空的vue实例对象
Vue.prototype.bus = new Vue()//html中button按钮
<button @click="send">发送数据</button>//方法(发送数据)methods: {send() {this.bus.$emit('send', this.msg)// console.log(this.$root);console.log(this.$parent.list);}}//方法(接受数据)mounted() {this.bus.$on('send', val => {// console.log(val);this.msg = val;})}

vue3中使用全局事件总线需要通过mitt插件从而实现。

下载插件以后在main.js文件引入mitt,并且创建一个新的实例,通过创建的实例进行兄弟通讯

//main.js
import mitt from 'mitt'
app.config.globalProperties.mittBus = new mitt()//传递数据组件 通过getCurrentInstance的proxy获取我们的全局属性mittBus
import { getCurrentInstance, provide, reactive, toRefs } from 'vue'const { proxy } = getCurrentInstance()//方法传递数据
const ShowData = () => {proxy.mittBus.emit('openData', name.value)proxy.mittBus.emit('openIsShow', true)console.log('展示');
}//接受数据的组件 通过getCurrentInstance的proxy获取我们的全局属性mittBus
import { getCurrentInstance, provide, reactive, toRefs } from 'vue'
const { proxy } = getCurrentInstance()
//通过on方法接受回调,从而进行逻辑操作
onMounted(() => {proxy.mittBus.on('openData', (data) => {fatherData.value = data})proxy.mittBus.on('openIsShow', (data) => {isShow.value = data})
})

9、vuex:

通过集中式管理工具,从而获取数据进行获取修改等

vue3和vue2相似,vue3可以通过useStore引入直接获取数据或者dispatch调用方法等操作

vue2通过this.$store.dispatch/state获取数据以及获取dispatch调用方法等操作

这里展示vue3的

//store/index.js
import { createStore } from 'vuex'export default createStore({state: {vuexNum: 10},getters: {},mutations: {handleChangeNum(state, payload) {console.log(payload, 'payload');state.vuexNum += payload}},actions: {},modules: {}
})
import { useStore } from 'vuex';
const store = useStore()const handleVuexNum = () => {store.commit('handleChangeNum', 10)//调用actions的方法
}

10、pinia:类似于vuex的集中式管理工具

需要下载pinia插件main.js全局引入

import { createPinia } from 'pinia'
const pinia = createPinia()
app.config.globalProperties.sname = '刘展通'
app.use(plugin).use(router).use(store).use(pinia).mount('#app')

使用:目录创建文件store或者什么都可以 目录下创建pinia.js

import { defineStore } from 'pinia'const userStore = defineStore('user', {state: () => {return {count: 1,paw2: 1,paw3: 1}},getters: {doubleCount: (state) => state.count * 2,handleDoubleCount() {return this.doubleCount + 1}},actions: {inc() {this.count++},randomNum() {this.count = Math.random(100 + Math.random()).toFixed(2)}}
})
export default userStore;
//代码使用
<template><div>数值:{{ data.count }},双倍数值:{{ data.doubleCount }},双倍数值+1:{{ data.handleDoubleCount }},平方:{{ data.paw2 }}三次方:{{data.paw3 }}<button @click="store.count--">-</button><button @click="handleCount">+</button><button @click="store.$reset()">重置</button><button @click="store.randomNum()">随机数</button></div>
</template><script setup>
import userStore from '../storage/pinia'
import { storeToRefs } from 'pinia'
const store = userStore()
// console.log(store, 'store');
const data = storeToRefs(store)
console.log(data);
const handleCount = () => {store.$patch({count: store.count + 1,paw2: Math.pow(store.count + 1, 2),paw3: Math.pow(store.count + 1, 3)})
}
</script><style lang="scss" scoped></style>

pina通过引入我们store下pinia.js中抛出的defineStore可以获取数据以及调用方法

通过pinia中引入storeToRefs可以获取我们pinia仓库中的所有数据

store为我们pinia抛出的方法 通过赋值方法 store = useStore()使store拥有pinia的属性和方法

通过store.$patch可以批量调用我们的方法实现更新效果。

通过$store.reset()可以实现重置功能,重置为我们最初值。

通过store也可以直接给按钮绑定方法直接store.方法名直接调用。

跨组件通信:

11、provide/inject:

通过provide发布数据 inject接受数据

//传递者 provide也可以是个对象
provide('provideSendData', num.value)
//接收者  inject也可以是个数组
const provideData = inject('provideSendData')

12、插槽(slot):

分为匿名插槽、具名插槽、作用域插槽

专门一篇文章进行讲解
 

13、消息订阅与发布

下载pubsub-js插件

引入pubsub在需要发送和接受的组件

pubsub.publish发布数据

publish.subscribe接受数据 通过回调获取数据类似于事件总线on接受方法以后获取数据那样

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

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

相关文章

Redis可以用作数据库吗?它的适用场景是什么?

是的&#xff0c;Redis可以用作数据库。虽然Redis通常被认为是一个内存数据库&#xff08;in-memory database&#xff09;&#xff0c;但它也可以通过持久化机制将数据保存在磁盘上&#xff0c;以便在重启后恢复数据。 Redis的适用场景包括但不限于以下几个方面&#xff1a; …

程序使用Microsoft.XMLHTTP对象请求https时出错解决

程序中使用Microsoft.XMLHTTP组件请求https时出现如下错误&#xff1a; 出错程序代码示例&#xff1a; strUrl "https://www.xxx.com/xxx.asp?id11" dim objXmlHttp set objXmlHttp Server.CreateObject("Microsoft.XMLHTTP") objXmlHttp.open "…

电脑关机程序

//关机程序 1、电脑运行起来后&#xff0c;1分钟内关机。 2、如果输入&#xff1a;我是猪。就取消关机。 #include<stdio.h> #include<string.h> int main() { char input[20] { 0 }; system("shutdown -s -t 60"); again: printf(&quo…

Cesium相机理解

关于cesium相机&#xff0c;包括里面内部原理网上有很多人讲的都很清楚了&#xff0c;我感觉这两个人写的都挺好得&#xff1a; 相机 Camera | Cesium 入门教程 (syzdev.cn) Cesium中的相机—setView&lookAtTransform_cesium setview_云上飞47636962的博客-CSDN博客上面这…

【Linux】进程间通信——system V共享内存

目录 写在前面的话 System V共享内存原理 System V共享内存的建立 代码实现System V共享内存 创建共享内存shmget() ftok() 删除共享内存shmctl() 挂接共享内存shmat() 取消挂接共享内存shmdt() 整体通信流程的实现 写在前面的话 上一章我们讲了进程间通信的第一种方式…

Linux基础学习

文章目录 Linux命令学习Linux环境准备Linux命令行学习Linux命令行格式与文件系统linux实用命令笔记Linux文件权限查看 Linux命令学习 理解Linux命令是什么 &#xff08;图形化的操作&#xff0c;文件查看&#xff0c;浏览器打开&#xff09; 你打开一个谷歌浏览器&#xff0c;…

微积分入门:总结归纳汇总(一)

基础 标准符号约定: ( s i n x ) n (sinx)^n (sinx)

Spring Aop组成部分

Spring Aop &#xff08;Aspect orirnted Programming&#xff09;面向切面编程,是对面向对象编程的一种补充&#xff0c;是一种编程思想&#xff0c;是对某一类的事情的集中处理。 比如用户登录状态的验证状态&#xff0c;在之前写servlet版本的博客系统&#xff0c;这里就有…

模拟实现消息队列项目(系列4) -- 服务器模块(内存管理)

目录 前言 1. 创建MemoryDataCenter 2. 封装Exchange 和 Queue方法 3. 封装Binding操作 4. 封装Message操作 4.1 封装消息中心集合messageMap 4.2 封装消息与队列的关系集合queueMessageMap的操作 5. 封装未确认消息集合waitMessage的操作 6. 从硬盘中恢复数据到内存中 7. Memo…

ceph pg inconsistent修复(unexpected clone)

问题概述&#xff1a; ceph -s 显示pg 10.17 inconsistent 且命令ceph pg repair 10.17无法修复&#xff0c;/var/log/ceph/cep-osd.3.log报错内容如下&#xff1a; pg 10.17 osd [3,4] 权威副本osd&#xff1a;3 repair 10.17 10:e889b16a:::rbd_data.88033092ad95.00000000…

Linux 命令之 - scp(从远端机器拉取数据)

scp是secure copy的简写&#xff0c;用于在Linux下进行远程拷贝文件的命令&#xff0c;和它类似的命令有cp&#xff0c;不过cp只是在本机进行拷贝不能跨服务器&#xff0c;而且scp传输是加密的。 命令格式&#xff1a; scp [参数] [原路径] [目标路径]从本地服务器复制到远程…

面试攻略,Java 基础面试 100 问(一)

面向对象的特征有哪些方面? 抽象(Encapsulation)&#xff1a;封装的目的是为了保证变量的安全性&#xff0c;使用者不必在意具体实现细节&#xff0c;而只是通过外部接口即可访问类的成员 如果不进行封装&#xff0c;类中的实例变量可以直接查看和修改&#xff0c;可能给整个…

工具推荐:Wireshark网络协议分析工具(对比tcpdump)

文章首发地址 Wireshark是一款开源的网络协议分析工具&#xff0c;可以捕获网络数据包并对其进行详细的分析和解释。下面是Wireshark的详细介绍&#xff1a; Wireshark 工作原理 Wireshark通过捕获网络接口上的数据包&#xff0c;将其转换为可读的格式&#xff0c;并在界面…

vue3实现自定义select下拉框内容之城市区域篇

分享-2023年资深前端进阶&#xff1a;前端登顶之巅-最全面的前端知识点梳理总结 *分享一个使用比较久的&#x1fa9c; 需求分析&#xff1a; 1、实现一个区域下拉选项与现有ui组件库不同&#xff0c;支持多选、单选需求 2、支持选中区域后-全选中当前区域下的所有城市信息 3、…

安卓如何卸载应用

卸载系统应用 首先需要打开手机的开发者选项&#xff0c;启动usb调试。 第二步需要在电脑上安装adb命令&#xff0c;喜欢的话还可以将它加入系统path。如果不知道怎么安装&#xff0c;可以从这里下载免安装版本。 第三步将手机与电脑用数据线连接&#xff0c;注意是数据线&a…

贝叶斯深度学习的温和介绍

一、说明 欢迎来到令人兴奋的概率编程世界&#xff01;本文是对这个领域的温和介绍&#xff0c;你只需要对深度学习和贝叶斯统计有一个基本的了解。如果像我一样&#xff0c;你听说过贝叶斯深度学习&#xff0c;并且你猜它涉及贝叶斯统计&#xff0c;但你不知道它是如何使用的&…

iOS开发-处理UIControl触摸事件TrackingWithEvent

IOS BUG记录 之 处理UIControl的点击事件。 UIControl的触摸事件的方法是beginTrackingWithTouch:withEvent:&#xff0c;continueTrackingWithTouch:withEvent:&#xff0c;endTrackingWithTouch:withEvent:&#xff0c;cancelTrackingWithEvent: ##下面简单的介绍一下 beg…

【Express.js】集成Websocket

集成websocket 本节我们介绍在如何在 express 中集成 websocket。 WebSocket 服务器可以主动向客户端推送信息&#xff0c;客户端也可以主动向服务器发送信息&#xff0c;是真正的双向平等对话&#xff0c;属于服务器推送技术的一种。 准备工作 创建一个 express.js 项目&a…

LVS-DR模式集群配置

四台虚拟机 node1&#xff1a;128 node2&#xff1a;135 RS端&#xff1a; node3&#xff1a;130 node4&#xff1a;132 [rootnode2 ~]# yum install -y ipvsadm #配置LVS虚拟IP&#xff0c;没有ifconfig命令则先安装 [rootnode2 ~]# yum install net-tools -y #配置VIP [root…