news 2026/4/9 19:35:32

Vue的组件通信方式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue的组件通信方式

一. props 父=》子 ;emit 子=》父 通信

//父组件 <template> <div class="demo"> <Child :text="text" @changeText="changeText" />//子组件触发change-text事件,更新text的值 <h1>{{ appText }}</h1>//点击子组件按钮后为hello worldchanged </div> </template> <script lang="ts" setup> import Child from '@/views/childOne .vue' import { ref } from 'vue' const text = ref('hello world') const appText = ref('hello world') // 父组件监听子组件触发的change-text事件,更新text的值 const changeText = (newText: string) => { appText.value += newText } </script> <style scoped></style> //子组件 <template> <div> <h2>{{ props.text }}</h2> <button @click="changeText">change</button> </div> </template> <script lang="ts" setup> // 子组件接收父组件传递的text属性 const props = defineProps({ text: String }); const emit = defineEmits(['changeText']) // 子组件点击按钮触发changeText事件,传递新的文本 const changeText = () => { emit('changeText', ' changed')//子组件触发changeText事件,传递新的文本 } </script> <style scoped></style>

二.expose +ref 导出获取子组件的属性和方法

<template> <div>父组件:拿到子组件的message数据:{{ msg }}</div> <button @click="callChildFn">调用子组件的方法</button> <hr /> <Child ref="com" />//ref绑定子组件 </template> <script setup> import Child from './child.vue'; const com = ref(null); // 通过 模板ref 绑定子组件 const msg = ref(''); onMounted(() => { // 在加载完成后,将子组件的 message 赋值给 msg msg.value = com.value.message; }); function callChildFn() { // 调用子组件的 show方法 com.value.show(); // 重新将 子组件的message 赋值给 msg msg.value = com.value.message; } </script> //子组件 <template> <div> Expose子组件</div> </template> <script setup> const message = ref('子组件传递得信息'); const show = () => { console.log('子组件得方法'); }; //交出子组件函数 defineExpose({ message, show, }); </script>

三.v-model 双向通信

<template> <div> <Child v-model="text" v-model:msg1="message1" v-model:msg2="message2"/> </div> </template> <script setup lang="ts"> import Child from '@/views/childOne .vue'; import { ref } from 'vue'; const text = ref<string>('默认'); const message1 = ref<string>('水果1'); const message2 = ref<string>('水果2'); </script>
//子组件: <template> <div> <div><button @click="changeText">修改text</button> {{ modelValue }}</div> <div><button @click="changeMsg1">修改msg1</button> {{ msg1 }}</div> <div><button @click="changeMsg2">修改msg2</button> {{ msg2 }}</div> </div> </template> <script setup lang="ts"> // 接收 defineProps({ 'modelValue': String, //默认为modelValue msg1: String, msg2: String, }); //默认为modelValue,update:+方法名 const emit = defineEmits(['update:modelValue', 'update:msg1', 'update:msg2']); function changeMsg1() { emit('update:msg1', '蔬菜1'); } function changeMsg2() { emit('update:msg2', '蔬菜2'); } function changeText() { emit('update:modelValue', 'Text2') } </script>

总结:

  1. Props(单向数据流)

    • 细节:父组件通过v-bind(或:) 将数据绑定到子组件的属性上。子组件需要在props选项中声明接收的属性名,并可指定类型 (type)、是否必需 (required)、默认值 (default)、验证函数 (validator)。
  2. Emit (自定义事件)

    • 细节:子组件const emit = defineEmits(['event-name']); emit('event-name', payload)(Composition API +<script setup>) 触发自定义事件。payload是传递给父组件的数据。
    • 父组件处理:父组件在模板中使用v-on(或@) 监听子组件触发的事件,如@event-name="handler"handler是父组件中定义的方法,接收payload作为参数进行处理。
  3. Expose + Ref

    • 细节 (Vue 3):子组件使用defineExpose显式暴露其内部属性或方法(如defineExpose({ publicMethod }))。
    • 父组件操作:父组件通过ref属性 (<ChildComponent ref="childRef" />) 为子组件实例创建引用。在父组件脚本中,const childRef = ref(null); childRef.value?.publicMethod()(Composition API) 访问暴露的内容。
    • 注意:访问需确保子组件已挂载(如在mounted钩子或watchref变化后)。
  4. v-model (双向绑定语法糖)

    • 细节 (Vue 3):v-model默认对应一个名为modelValueprop和一个名为update:modelValue的事件。父组件v-model="parentData",子组件接收modelValueprop,并在需要更新时触发emit('update:modelValue', newValue)
    • 参数:可指定参数实现多个绑定,如v-model:title="pageTitle",对应titlepropupdate:title事件。
    • 本质::modelValue="parentData" @update:modelValue="parentData = $event"的语法糖。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/3 18:37:30

通义团队Qwen2.5-VL-32B-Instruct模型发布:多模态AI视觉代理能力再突破

通义实验室近期正式推出多模态大语言模型Qwen2.5-VL-32B-Instruct&#xff0c;作为Qwen2.5-VL系列的重要成员&#xff0c;该模型在视觉理解与智能交互领域实现了显著突破。相较于传统视觉模型局限于物体识别的基础能力&#xff0c;该模型构建了"感知-分析-行动"的全链…

作者头像 李华
网站建设 2026/4/1 5:26:25

BlenderGIS地形生成终极指南:从零到专业级3D场景

BlenderGIS地形生成终极指南&#xff1a;从零到专业级3D场景 【免费下载链接】BlenderGIS Blender addons to make the bridge between Blender and geographic data 项目地址: https://gitcode.com/gh_mirrors/bl/BlenderGIS 还在为手动创建不真实的地形而苦恼吗&#…

作者头像 李华
网站建设 2026/3/23 10:28:48

告别文献格式噩梦:5分钟掌握LaTeX国标引用终极方案

告别文献格式噩梦&#xff1a;5分钟掌握LaTeX国标引用终极方案 【免费下载链接】gbt7714-bibtex-style GB/T 7714-2015 BibTeX Style 项目地址: https://gitcode.com/gh_mirrors/gb/gbt7714-bibtex-style 还在为论文参考文献格式而头疼吗&#xff1f;GB/T 7714-2015国家…

作者头像 李华
网站建设 2026/4/7 15:45:03

WinFsp虚拟文件系统:5分钟实现企业级数据安全防护

你是否曾为员工随意使用U盘拷贝重要数据而头疼&#xff1f;是否担心笔记本电脑丢失导致商业信息泄露&#xff1f;传统的数据保护方案复杂且昂贵&#xff0c;今天我将分享如何用WinFsp在Windows平台快速构建安全虚拟磁盘&#xff0c;实现企业数据零本地存储的终极防护方案。 【免…

作者头像 李华
网站建设 2026/4/7 21:42:01

解放你的B站收藏:全能视频下载神器使用全攻略

你是否曾经因为网络问题错过精彩的B站视频&#xff1f;或者担心喜欢的UP主删除作品后无法重温&#xff1f;现在&#xff0c;通过这款基于Java开发的跨平台B站视频下载工具&#xff0c;你可以轻松将心仪的内容永久保存到本地。这款工具不仅支持单个视频下载&#xff0c;还能批量…

作者头像 李华
网站建设 2026/4/9 0:47:15

Obsidian Git终极配置指南:打造坚不可摧的笔记版本控制系统

在数字化知识管理时代&#xff0c;Obsidian已成为众多创作者和知识工作者的首选工具。然而&#xff0c;笔记丢失的风险始终存在——无论是设备故障、误操作还是同步冲突&#xff0c;都可能让你的心血付之一炬。Obsidian Git插件通过Git版本控制系统为你的知识库提供专业级保护&…

作者头像 李华