当前位置: 首页 > news >正文

Vue3的多种组件通信方式

 父组件向子组件传递数据 (Props)

父组件

<template><child :name="name"></child>
</template><script setup>
import { ref } from 'vue'
import Child from './Child.vue'const name = ref('小明')
</script>

子组件

<template><div>{{ props.name }}</div>
</template><script setup>
import { defineProps } from 'vue'const props = defineProps({name: {type: String,default: '',},
})
</script>

子组件向父组件传递数据 (Emit)

子组件

<template><button @click="handleClick">点击我</button>
</template><script setup>
import { ref, defineEmits } from 'vue'const message = ref('来自子组件的问候')
const emits = defineEmits(['greet'])const handleClick = () => {emits('greet', message.value)
}
</script>

父组件

<template><child @greet="handleGreet"></child>
</template><script setup>
import { ref } from 'vue'
import Child from './Child.vue'const handleGreet = (message) => {console.log(message) // 输出: "来自子组件的问候"
}
</script>

兄弟组件通信 (Mitt)

npm install --save mitt

mainjs全局配置

import { createApp } from 'vue'
import mitt from 'mitt'
import App from './App.vue'const app = createApp(App)
app.config.globalProperties.$bus = mitt()app.mount('#app')

发送事件组件

<script setup>
import { getCurrentInstance } from 'vue'const { proxy } = getCurrentInstance()
const sendMessage = () => {proxy.$bus.emit('myEvent', '你好,兄弟')
}
</script>

接受事件组件

<script setup>
import { onMounted, getCurrentInstance } from 'vue'const { proxy } = getCurrentInstance()onMounted(() => {proxy.$bus.on('myEvent', (message) => {console.log(message) // 输出: "你好,兄弟"})
})
</script>

透传 Attributes ($attrs)

父组件

<template><child name="小明" age="18" hobby="篮球"></child>
</template>

子组件

<script setup>
import { useAttrs } from 'vue'const attrs = useAttrs()
console.log(attrs) // { age: "18", hobby: "篮球" }
</script>

模板引用 (Refs)

父组件

<template><child ref="childRef"></child><button @click="callChildMethod">调用子组件方法</button>
</template><script setup>
import { ref } from 'vue'
import Child from './Child.vue'const childRef = ref(null)const callChildMethod = () => {childRef.value.someMethod()
}
</script>

子组件

<script setup>
import { defineExpose } from 'vue'const someMethod = () => {console.log('子组件方法被调用了')
}defineExpose({someMethod,
})
</script>

双向绑定 (v-model)

父组件

<template><child v-model:name="name"></child>
</template><script setup>
import { ref } from 'vue'
import Child from './Child.vue'const name = ref('小明')
</script>

子组件

<template><input :value="name" @input="updateName" />
</template><script setup>
import { defineProps, defineEmits } from 'vue'const props = defineProps(['name'])
const emit = defineEmits(['update:name'])const updateName = (e) => {emit('update:name', e.target.value)
}
</script>

依赖注入 (Provide/Inject)

爷组件

<script setup>
import { provide, ref } from 'vue'const themeColor = ref('blue')
provide('theme', themeColor)
</script>

子孙组件

<script setup>
import { inject } from 'vue'const theme = inject('theme')
console.log(theme.value) // 'blue'
</script>

路由传参

通过query

import { useRouter } from 'vue-router'const router = useRouter()
router.push({ path: '/user', query: { id: 123 } })// 在目标组件中
import { useRoute } from 'vue-router'const route = useRoute()
console.log(route.query.id) // 123

Vuex 状态管理

// store/index.js
import { createStore } from 'vuex'export default createStore({state: {count: 0,},mutations: {increment(state) {state.count++},},
})// 在组件中使用
import { useStore } from 'vuex'const store = useStore()
console.log(store.state.count)
store.commit('increment')

Pinia 状态管理

// stores/counter.js
import { defineStore } from 'pinia'export const useCounterStore = defineStore('counter', {state: () => ({ count: 0 }),actions: {increment() {this.count++},},
})// 在组件中使用
import { useCounterStore } from '@/stores/counter'const counter = useCounterStore()
console.log(counter.count)
counter.increment()

浏览器存储

localStorage 和 sessionStorage 可以用于在不同页面或组件之间共享数据。

// 存储数据
localStorage.setItem('user', JSON.stringify({ name: '小明', age: 18 }))// 读取数据
const user = JSON.parse(localStorage.getItem('user'))

Window 对象

// 设置全局数据
window.globalData = { message: '全局消息' }// 在任何地方使用
console.log(window.globalData.message)

 全局属性

Vue 3 提供了 app.config.globalProperties 来替代 Vue 2 中的 Vue.prototype,用于添加全局可用的属性。

// main.js
const app = createApp(App)
app.config.globalProperties.$http = axios// 在组件中使用
import { getCurrentInstance } from 'vue'const { proxy } = getCurrentInstance()
proxy.$http.get('/api/data')

相关文章:

Vue3的多种组件通信方式

父组件向子组件传递数据 (Props) 父组件 <template><child :name"name"></child> </template><script setup> import { ref } from vue import Child from ./Child.vueconst name ref(小明) </script> 子组件 <template…...

【C++语言】list的构造函数与迭代器

1. list的介绍及使用 1.1 list的介绍 list的文档介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点…...

Python 安装 PyTorch详细教程

本章教程,介绍如何安装PyTorch,介绍两种安装方式,一种是通过pip直接安装,一种是通过conda方式安装。 一、查看CUDA版本 二、安装PyTorch 1、pip安装方式 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu1162、conda安装方式 …...

html页面缩放自适应

html页面缩放自适应 一、为什么页面要进行缩放自适应 在我们一般web端进行页面拼接完成后&#xff0c;在web端的显示正常&#xff08;毕竟我们是按照web端进行页面拼接完成的&#xff09;&#xff0c;那么要是用其他设备打开呢&#xff0c;比如手机或者平板&#xff0c;这时候…...

024.自定义chormium-修改屏幕尺寸

自定义chormium-修改屏幕尺寸 屏幕尺寸信息雷同太大&#xff0c;用作指纹信息&#xff0c;作用不多。 但多个类似小信息组合在一起的话&#xff0c;也就是成唯一指纹了。积少成多吧。 一、如何使用js获取屏幕信息 将下面的代码复制进F12控制台 console.log("screen.widt…...

测试环境搭建整套大数据系统(十九:kafka3.6.0单节点做 sasl+acl)

1. 增加配置配文件信息 vim /opt/kafka_2.13-3.6.1/config/server.properties listenersPLAINTEXT://192.168.50.240:9092,OUTER://192.168.50.240:9094# Listener name, hostname and port the broker will advertise to clients. # If not set, it uses the value for &quo…...

小白零基础学数学建模应用系列(五):任务分配问题优化与求解

文章目录 一. 分配问题1.1 问题背景1.2 假设条件1.3 问题要求1.4 数学建模 二. 实际案例2.1 问题背景2.2 假设条件2.3 问题要求2.4 模型建立2.5 求解代码2.6 结果分析2.6.1 分配方案的解释2.6.2 总时间的优化2.6.3 潜在的现实应用 一. 分配问题 1.1 问题背景 分配问题&#x…...

怎么防止源代码泄露?十种方法杜绝源代码泄密风险

源代码是软件开发的核心资产之一&#xff0c;保护其不被泄露对企业的安全至关重要。源代码泄露不仅可能导致知识产权的丧失&#xff0c;还可能给企业带来经济损失和品牌形象的损害。以下是十种有效的方法&#xff0c;可以帮助企业杜绝源代码泄密的风险。 1. 代码加密 对源代码…...

uniapp left right 的左右模态框

标题 这是组件 <template><div class"content-wrapper"><divv-for"(vla, i) in products":key"i":class"[content-page, getPageClass(i)]"><slot :data"vla"><!-- 用户自定义的内容 --><…...

Docker Compose与私有仓库部署

一、Docker Compose工具 1.1什么是Docker Compose Docker Compose 的前身是 Fig&#xff0c;它是一个定义及运行多个 Docker 容器的工具。使用Docker Compose 时&#xff0c;只需要在一个配置文件中定义多个 Docker 容器&#xff0c;然后使用一条命令启 动这些容器。Docker Co…...

Layout 布局组件快速搭建

文章目录 设置主题样式变量封装公共布局组件封装 Logo 组件封装 Menu 菜单组件封装 Breadcrumb 面包屑组件封装 TabBar 标签栏组件封装 Main 内容区组件封装 Footer 底部组件封装 Theme 主题组件 经典布局水平布局响应式布局搭建 Layout 布局组件添加 Layout 路由配置启动项目 …...

北京城市图书馆-非遗文献馆:OLED透明拼接屏的璀璨应用

在数字化与传统文化深度融合的今天&#xff0c;北京城市图书馆的非遗文献馆以一场前所未有的视觉盛宴&#xff0c;向世人展示了OLED透明拼接屏的非凡魅力与无限可能。这座集阅读、展示、体验于一体的非遗文献馆&#xff0c;通过2*7布局的OLED透明拼接屏&#xff0c;不仅为传统非…...

OpenCV图像滤波(12)图像金字塔处理函数pyrDown()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 函数主要是对图像进行模糊处理并将其降采样。 默认情况下&#xff0c;输出图像的大小计算为 Size((src.cols1)/2, (src.rows1)/2)&#xff0c;但…...

css如何使一个盒子水平垂直居中

方法一&#xff1a;利用定位(常用方法,推荐&#xff09; <style> .parent{width: 500px;height: 500px;border: 1px solid #000;position:relative; }.child {width: 100px;height: 100px;border: 1px solid #999;position:absolute;top: 50%;left: 50%;margin-top: -50…...

机器人等方向学习和研究的目标

核心目标类似&#xff1a; 学习一个知识点用时越来越短&#xff0c;研究一个系统效率越来越高。 目标 没有目标是常态&#xff0c;十分普遍。 但其实&#xff0c;目标也可以很宽泛。 感谢朋友们一直以来的鼓励帮助&#xff0c;倍感荣幸&#xff0c;非常感谢。-CSDN blink-…...

封装一个细粒度的限流器

文章目录 原因限流对象限流后的做法怎么确定限流阈值观测业务性能数据压测借鉴链路上的其他服务手动计算 四种静态限流算法令牌桶漏桶固定窗口与滑动窗口 手写限流算法令牌桶漏桶固定窗口滑动窗口 分布式限流的具体实现 原因 尽管云原生网关里有统一入口的限流&#xff08;根据…...

【Spring Boot - 注解】@ResponseBody 注解:处理 JSON 响应

文章目录 一、ResponseBody 注解概述1. 注解的功能2. 主要功能 二、ResponseBody 的工作原理1. 接口定义2. 消息转换器3. 自动配置与默认行为 三、ResponseBody 的应用场景1. RESTful API 的实现2. 返回复杂数据结构3. 错误处理和异常处理 四、ResponseBody 的配置和自定义1. 自…...

无人机航拍与ArcGIS融合实战:从地表观测到空间数据可视化的全方位指南!无人机图像拼接数据处理与分析、可视化与制图

目录 第一章 无人机航拍基本流程、航线规划与飞行实践 第二章 无人机图像拼接软件的学习与操作实践 第三章 无人机图像拼接典型案例详解 第四章 无人机图像拼接数据在GIS中的处理与分析 第五章 无人机图像拼接数据在GIS中的可视化与制图 第六章 综合案例:无人机航拍植被动…...

日期转时间濯

tfunction(date_str) local code ,time World:getTimeFromDateString(date_str) return time/(60*60*24) end print(t(2024-08-16)-t(2024-08-3))...

【计算机网络】TCP实战

其实有了UDP的基础&#xff0c;TCP不管怎么说学习起来都还是比较舒服的&#xff0c;至少是比直接就学习TCP的感觉好。 这篇文章最多就是介绍一下起手式&#xff0c;如果想带业务的话和UDP那篇是完全一样的&#xff0c;就不进行演示了。 总的来说还是很简单的。 目录 Echo服务端…...

AI 将编写 90% 的代码……我们现在到底该怎么办?

我至今仍清晰地记得读到那个标题的瞬间。那是 2026 年初一个平凡的夜晚&#xff0c;大约晚上 9 点&#xff0c;我正习惯性地在关闭笔记本电脑前翻阅科技新闻。突然&#xff0c;一行文字让我如坠冰窖&#xff0c;整个人僵在原地。“Anthropic 首席执行官预判&#xff1a;未来六个…...

Rust重写GNU核心工具集:现代CLI工具的终极指南

Rust重写GNU核心工具集&#xff1a;现代CLI工具的终极指南 【免费下载链接】coreutils 跨平台的 Rust 重写 GNU 核心工具集。 项目地址: https://gitcode.com/GitHub_Trending/co/coreutils 在当今的软件开发领域&#xff0c;命令行工具仍然是系统管理员、开发者和DevOp…...

3步完成系统深度净化:Win11Debloat工具让旧电脑性能提升60%

3步完成系统深度净化&#xff1a;Win11Debloat工具让旧电脑性能提升60% 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&#xff0c;用于从Windows中移除预装的无用软件&#xff0c;禁用遥测&#xff0c;从Windows搜索中移除Bing&#xff0c;以及执行各种其他更改以简…...

从赛道到产线:智能车竞赛如何为《美国工厂》精神谱写青春代码

1. 智能车竞赛&#xff1a;制造业的青春实验室 当《美国工厂》纪录片中那些机械臂精准运作的画面还在脑海中挥之不去时&#xff0c;我站在全国大学生智能车竞赛的现场&#xff0c;突然意识到这两者之间存在着某种奇妙的联系。智能车竞赛就像是一个微缩版的制造业实验室&#xf…...

【esp-idf调试问题-代码为提前配置工程,配网wedsocket服务】

esp-idf调试问题-配网wedsocket服务一、提示分区表错误&#xff0c;没有配置自己的编写的分区表。menuconfig 配置分区表步骤 1&#xff1a;打开配置菜单 在项目根目录执行&#xff1a;步骤 2&#xff1a;选择分区表类型 在 Partition Table → Partition Table 中可选&#xf…...

茉莉花插件:如何用3分钟完成中文文献元数据智能抓取与PDF大纲生成

茉莉花插件&#xff1a;如何用3分钟完成中文文献元数据智能抓取与PDF大纲生成 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件&#xff0c;用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 茉莉…...

树莓派无头模式终极指南:不接显示器,用SSH+VNC搞定所有开发调试

树莓派无头模式终极指南&#xff1a;不接显示器&#xff0c;用SSHVNC搞定所有开发调试 当你把树莓派塞进机器人底盘、挂在墙上作为智能家居中枢&#xff0c;或是藏在机柜里充当服务器时&#xff0c;最不想看到的就是拖着一堆显示器和线材。作为嵌入式开发老手&#xff0c;我经历…...

手把手教你用CH32V208开发板实现蓝牙BLE5.3通信(附完整工程源码)

基于CH32V208开发板的蓝牙BLE5.3实战开发指南 在物联网设备爆发式增长的今天&#xff0c;低功耗蓝牙&#xff08;BLE&#xff09;技术因其低功耗、低成本的优势&#xff0c;成为短距离无线通信的首选方案之一。作为一款集成了BLE5.3模块的RISC-V微控制器&#xff0c;CH32V208为…...

SAP物料账核心:手把手配置OBYC中的GBB与PRD科目(含OMSK评估类关联详解)

SAP物料账核心&#xff1a;手把手配置OBYC中的GBB与PRD科目&#xff08;含OMSK评估类关联详解&#xff09; 在SAP系统中&#xff0c;物料账管理是连接物流与财务的关键桥梁。对于财务人员而言&#xff0c;理解物料移动如何触发财务过账&#xff0c;以及如何通过后台配置实现精准…...

从NASA到你家菜园:聊聊那些藏在智慧农业背后的‘黑科技’传感器(光学/微波遥感全解析)

从NASA到你家菜园&#xff1a;智慧农业背后的传感器技术革命 当清晨的阳光洒在堪萨斯州的麦田上&#xff0c;NASA的Landsat卫星正以每秒7.5公里的速度掠过北美大陆上空。它的多光谱传感器捕捉到的数据&#xff0c;将在6小时后转化为中国山东某葡萄种植园主的手机推送——"…...