Vue 常见的几种通信方式(总结)

devtools/2024/11/13 9:10:38/
htmledit_views">

前言

Vue的通信方式,相信各位小伙伴都已经滚瓜烂收了,但是我估计咱们平常用到的就那么几个,那么剩余的哪些具体是怎么使用的,或者再去温习一下,我觉得也是很有必要的。

1.props/emit

父组件

html"><template><h2>props传递和emit传递</h2><CustomPropsEmits :title="pageTitle" @update-title="handleTitleUpdate"></CustomPropsEmits>
</template><script setup>
import { ref} from 'vue'
import CustomPropsEmits from './components/customPropsEmits.vue'// 父组件的状态
const pageTitle = ref('父组件的值')// 父组件处理子组件的事件
const handleTitleUpdate = (newTitle) => {pageTitle.value = newTitle
}</script>

 子组件

html"><template><div><h3>{{ props.title }}</h3><el-button @click="updateTitle">Update 父组件</el-button></div>
</template><script setup>
import { defineProps } from 'vue'
// 使用 defineProps 接收父组件传递的 prop
const props = defineProps({title: {type: String,required: true}
})// 定义 emit 用于发射事件
const emit = defineEmits(['update-title'])// 点击按钮时发射事件
const updateTitle = () => {emit('update-title', '子组件去改变')
}
</script>

2.v-model

父组件

html"><template> <h2>v-model传值</h2><p>{{ message }}</p><CustomVodel v-model="message"></CustomVodel>
</template><script setup>
import {ref} from 'vue'
import CustomVodel from './components/customVodel.vue'const message = ref('Hello, World!')
</script>

子组件

html"><template><div><input v-model="localValue" /></div>
</template><script setup>
import { defineProps, ref, watch } from 'vue'
// 使用 defineProps 接收父组件传递的 prop
const props = defineProps({modelValue: {type: String,required: true}
})// 定义 emit 用于发射事件
const emit = defineEmits(['update:modelValue'])// 创建一个局部变量,保存 modelValue 的值
const localValue = ref(props.modelValue)// 监听 localValue 的变化,并发射事件通知父组件
watch(localValue, (newValue) => {emit('update:modelValue', newValue)
})
</script>

 3.refs

父组件

html"><template>  
<h2>refs 子向父通信</h2><el-button @click="callChildMethod">Call Child Method</el-button><CustomRef ref="childRef"></CustomRef>s
</template> <script setup>
import { ref, provide } from 'vue'-
import CustomRef from './components/customRef.vue'
const childRef = ref(null)
// 调用子组件的方法
const callChildMethod = () => {if (childRef.value) {childRef.value.sayHello() // 调用子组件的方法}
}

 子组件一定要搭配defineExpose使用

html"><template><div><p>Hello, I'm the Child Component!</p></div>
</template><script setup>
import { defineExpose } from 'vue'// 定义子组件的方法
// eslint-disable-next-line no-unused-vars
const sayHello = () => {console.log('Hello from Child Component!')
}
defineExpose({ sayHello })
</script>

4.provide/inject

父组件

html" title=javascript>javascript">import { ref, provide } from 'vue'provide('sharedData', 'This is provided data')

 子组件

html"><template><div>{{ injectedData }}</div><p>这里是传递下来的组件</p>
</template><script setup>
import { inject } from 'vue'const injectedData = inject('sharedData')
</script>

5.eventBus

父向子通信(Vue3移除) 【官方推荐使用 mitt 或 tiny-emitter,使用pubsub-js也可以】

6.状态管理器Vuex/Pinia

注意要配合一个插件才可以实现持久化存储

"pinia-plugin-persistedstate"

 这里的代码我只写仓库里的代码

html" title=javascript>javascript">// 此商店用于存放全局的一些状态
import { defineStore } from 'pinia'export const useAllStore = defineStore('all', {state: () => ({isCollapse: false,defaultActive: '1-1'}),actions: {SetIsCollapseInfo(data) {this.isCollapse = data},setDefaultActive(data) {this.defaultActive = data.toString()}},persist: {paths: ['isCollapse', 'defaultActive'] //只有 isCollapse,defaultActive被持久化保存}
})

7.本地存储也可以

基本也就这些,如果有好的方法欢迎评论区来讨论。


http://www.ppmy.cn/devtools/114201.html

相关文章

【CTF Web】BUUCTF BUU BURP COURSE 1 Writeup(X-Real-IP伪造+POST请求)

BUU BURP COURSE 1 1 点击启动靶机。 解法 用 hackbar 将 X-Forwarded-For 设为 127.0.0.1&#xff0c;无效。提示&#xff1a;只能本地访问。 将 Referer 设为 127.0.0.1&#xff0c;无效。提示&#xff1a;只能本地访问。 将 X-Real-IP 设为 127.0.0.1&#xff0c;成功&am…

【开源免费】基于SpringBoot+Vue.JS在线文档管理系统(JAVA毕业设计)

本文项目编号 T 038 &#xff0c;文末自助获取源码 \color{red}{T038&#xff0c;文末自助获取源码} T038&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

深度学习Day-32:CycleGAN实战

&#x1f368; 本文为&#xff1a;[&#x1f517;365天深度学习训练营] 中的学习记录博客 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制] 一、 基础配置 语言环境&#xff1a;Python3.8编译器选择&#xff1a;Pycharm深度学习环境&#xff1a; torch1.12.1c…

第五章 网络编程 TCP/UDP/Socket

第五章 网络编程 一、IP地址 唯一标识网络上的每一台计算机 32位&#xff0c;由4个8位二进制数组成1.IP地址的组成 IP地址 网络地址 主机地址 网络地址&#xff1a;标识计算机或网络设备所在的网段 主机地址&#xff1a;标识特定主机或网络设备A类地址通常分配给具有大量主…

汽车软件开发之敏捷开发

一、前言 目前汽车电子产品&#xff0c;特别是汽车几大域控&#xff08;如&#xff1a;智能座舱、智能驾驶、智能网联、车身控制&#xff09;市场竞争激烈&#xff0c;消费者对汽车的需求逐渐多元化和个性化&#xff0c;用户对座舱和智驾产品的要求也越来越高。他们不仅要求产…

在 Windows 上恢复已删除的 PDF 文件的最佳方法

如果您不小心删除了 PDF 文件或由于系统突然崩溃而无法再找到它们&#xff0c;本指南介绍了恢复已删除文件的最佳方法。 帖子中列出的方法简单、有效且可行。我们在列出它们之前对其进行了测试。 什么是 PDF&#xff0c;Adobe 将未保存的 PDF 存储在哪里&#xff1f; 自从 Ad…

家居小程序有什么用?

家居小程序在现代家居生活中扮演着越来越重要的角色&#xff0c;其功能和用途广泛且实用。以下是家居小程序的主要用途&#xff1a; 一、商品展示与购物 商品展示&#xff1a;家居小程序可以展示各种家居产品&#xff0c;包括家具、家电、装饰品等&#xff0c;用户可以通过分类…

【Linux下的cpp】编译调试(gcc、g++、gdb)

【Linux下的cpp】编译调试&#xff08;gcc、g、gdb&#xff09; 文章目录 【Linux下的cpp】编译调试&#xff08;gcc、g、gdb&#xff09;简述gcc、g、gdb编译过程g 编译参数命令行编译演练1、直接编译2、生成库文件并编译链接静态库并生成可执行文件链接动态库生成可执行文件 …