新闻详情

新闻详情

首页 / 资讯中心 / 详情

Vue3 组件通信

发布时间:2026/9/28 21:19:19来源:尧图网络
Vue3 组件通信
Vue3 组件通信前言Vue3 是组件化开发框架组件之间默认是相互独立的。所谓组件通信就是让不同组件能够共享数据、传递事件、协同工作。目录Props父传子Emits子传父v-model / defineModel双向绑定ref defineExpose父访问子attrs属性透传provide / inject跨层级通信Pinia全局状态共享mitt任意组件事件总线一、Props父组件向子组件传值Props 是最基础、最常用的通信方式遵循单向数据流。父组件template Child :titlepageTitle :listlist / /template script setup import { ref } from vue import Child from ./Child.vue const pageTitle ref(Vue3 组件通信) const list ref([Props, Emits, Provide]) /script子组件script setup const props defineProps({ title: { type: String, required: true }, list: { type: Array, default: () [] } }) console.log(props.title) // 父组件传来的值 /script特点数据只能从父流向子子组件不能直接修改 props。如果传入的是响应式数据ref/reactive父组件修改后子组件会自动更新。适合父子直接通信简单清晰。注意子组件直接修改 props 会报警告必须通过 emit 通知父组件修改。二、Emits子组件向父组件传值子组件不能修改父组件数据但可以通过触发自定义事件把数据或操作意图传回父组件。子组件script setup const emit defineEmits([update-title, submit]) function changeTitle() { emit(update-title, 新标题来自子组件) } function handleSubmit() { emit(submit, { id: 1, name: 张三 }) } /script template button clickchangeTitle修改标题/button button clickhandleSubmit提交/button /template父组件template Child update-titlehandleUpdateTitle submithandleSubmit / /template script setup function handleUpdateTitle(newTitle) { console.log(newTitle) // 新标题来自子组件 } function handleSubmit(payload) { console.log(payload) // { id: 1, name: 张三 } } /script特点子组件通过emit(事件名, 数据)向上传递。父组件在模板中用事件名监听。事件名推荐使用 kebab-case如update-title。三、v-model / defineModel双向绑定Vue3 支持在组件上使用v-model实现父子数据双向同步。Vue 3.4 起推荐使用defineModel()宏写法更简洁。子组件 Child.vuescript setup const model defineModel() function increment() { model.value // 自动同步到父组件 } /script template div当前值{{ model }}/div button clickincrement1/button /template父组件template Child v-modelcount / /template script setup import { ref } from vue const count ref(0) /script原理简析v-modelcount会被编译成Child :modelValuecount update:modelValuecount $event /defineModel()本质上是 Props Emits 的语法糖。多个 v-model!-- 子组件 -- script setup const firstName defineModel(firstName) const lastName defineModel(lastName) /script !-- 父组件 -- Child v-model:first-namefirst v-model:last-namelast /四、ref defineExpose父组件访问子组件有时候父组件需要直接调用子组件的方法或访问子组件的数据这时可以用ref配合defineExpose。子组件script setup import { ref } from vue const count ref(0) function reset() { count.value 0 } // 只有暴露出去的内容才能被父组件访问 defineExpose({ count, reset }) /script父组件template Child refchildRef / button clickhandleReset重置子组件/button /template script setup import { ref } from vue import Child from ./Child.vue const childRef ref(null) function handleReset() { childRef.value.reset() console.log(childRef.value.count) } /script特点打破了单向数据流父组件可以直接操作子组件。适合弹窗控制、表单校验、图表刷新等场景。不要滥用否则组件耦合会变高。五、attrs属性透传当父组件给子组件传递了子组件没有声明为 props 的属性时这些属性会进入attrs。常用于封装第三方组件或透传 class、style、事件。子组件 MyInput.vuescript setup defineProps({ label: String }) /script template label{{ label }}/label input v-bind$attrs / /template父组件template MyInput label用户名 placeholder请输入用户名 maxlength20 focusonFocus / /templateplaceholder、maxlength、focus都会通过$attrs自动绑定到input上。注意如果子组件有多个根节点需要手动指定v-bind$attrs绑到哪个元素上。六、provide / inject跨层级通信当组件层级很深用 Props 一层层传会非常麻烦这时可以用provide和inject。祖先组件script setup import { ref, provide, readonly } from vue const theme ref(dark) provide(theme, theme) provide(config, readonly({ version: 1.0 })) /script任意后代组件script setup import { inject } from vue const theme inject(theme, light) // 默认值 light const config inject(config) console.log(theme.value) // dark /script特点祖先提供数据后代注入数据中间组件不需要关心。如果提供的是 ref后代修改.value会同步更新如果不想被修改用readonly()包裹。适合主题、语言、用户信息等全局但不需要 Pinia 的场景。七、Pinia全局状态共享当多个不相邻组件需要共享同一份可变状态时Pinia 是最佳选择。定义 Store// stores/counter.jsimport{defineStore}frompiniaexportconstuseCounterStoredefineStore(counter,{state:()({count:0}),getters:{doubleCount:(state)state.count*2},actions:{increment(){this.count}}})组件中使用script setup import { useCounterStore } from /stores/counter import { storeToRefs } from pinia const store useCounterStore() const { count, doubleCount } storeToRefs(store) function add() { store.increment() } /script template div{{ count }} / {{ doubleCount }}/div button clickadd1/button /template特点全局唯一状态任何组件都可以读写。支持 devtools 调试、状态持久化等。适合用户信息、购物车、权限、主题等跨页面共享数据。注意直接解构store.count会丢失响应性必须用storeToRefs。八、mitt任意组件事件总线Vue3 移除了$on/$off官方推荐用mitt等第三方库实现事件总线。安装npminstallmitt创建事件总线// utils/eventBus.jsimportmittfrommittconstbusmitt()exportdefaultbus组件 A 发送事件importbusfrom/utils/eventBusbus.emit(user-login,{name:张三})组件 B 监听事件importbusfrom/utils/eventBusimport{onUnmounted}fromvuefunctionhandleLogin(user){console.log(用户登录,user.name)}bus.on(user-login,handleLogin)onUnmounted((){bus.off(user-login,handleLogin)// 记得清理})特点发布/订阅模式完全解耦。不会自动触发视图更新需要手动处理状态。适合完全无关的组件之间通信但不要滥用。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Substrate区块链框架:核心原理与开发实战指南 2026/9/28 22:07:34

Substrate区块链框架:核心原理与开发实战指南

Substrate这个名词,在区块链圈子里已经被说滥了,但真正动手用过的人并不多。你搜索这个词,翻来覆去看到的可能是“Polkadot生态”、“一键发链”、“Rust框架”这些标签,却很少有人能讲清楚:Substrate到底是什么、它帮…

阅读更多 →
漫画助手V6脚本助手:Stable Diffusion批量出图自动化与参数配置指南 2026/9/28 22:07:27

漫画助手V6脚本助手:Stable Diffusion批量出图自动化与参数配置指南

简介:这份资源是面向Stable Diffusion用户的漫画创作辅助脚本工具,主要解决AI绘画流程中批量生成、参数调节与漫画分镜处理等重复性操作问题,适合已具备SD基础操作能力、希望提升出图效率的插画爱好者与漫画创作者。压缩包共3个文件&#xff…

阅读更多 →
Agent Substrate与gRPC在云原生调度系统中的协同实践 2026/9/28 22:07:27

Agent Substrate与gRPC在云原生调度系统中的协同实践

我无法根据当前输入生成符合要求的博文。原因如下:项目标题仅为单个字母“ax”,无明确语义指向,无法界定所属领域(是缩写?代号?变量名?产品名?技术术语?)&…

阅读更多 →
从零构建统一CLI工具:插件化架构与工程实践 2026/9/28 22:07:20

从零构建统一CLI工具:插件化架构与工程实践

1. 项目缘起:为什么我需要一个“什么都能管”的CLI工具我每天的工作流里,至少有二十个重复动作:临时启动某个微服务、翻日志、批量改文件名、转格式、调API、跑定时任务……以前这些事散落在不同的脚本和工具里,有的用Shell&#…

阅读更多 →
Vivado 2025.1与VCS 2024.SP1联合仿真环境搭建及Verdi调试实战 2026/9/28 22:06:51

Vivado 2025.1与VCS 2024.SP1联合仿真环境搭建及Verdi调试实战

1. 联合仿真环境搭建的整体思路与选型考量做FPGA验证这行十几年,我见过太多人在仿真环境搭建这一步反复折腾。Vivado自带的仿真器跑小规模测试还行,一旦涉及复杂IP核、大规模逻辑或者需要更精细的调试手段,就力不从心了。VCS作为业界老牌的数…

阅读更多 →
投机解码提速三倍?AI推理优化与Agent落地实战全解析 2026/9/28 22:06:24

投机解码提速三倍?AI推理优化与Agent落地实战全解析

今天是2026年9月18日,这期科技AI资讯日报照例从HackerNews的热榜开始。从昨夜到今晨,技术版讨论得最凶的几个话题分别是:开源推理引擎的投机解码优化、AI Agent能否写生产代码的正反论战,以及PyCharm AI插件在真实重构场景里的表现…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉