当前位置:首页 > 技术 > 正文内容

Vue 3 中的组件间通信方式

访客 技术 2026年7月30日 1

1. 父子组件通信 - Props

通过 Props,父组件可以向子组件传递数据。

<template>
  <Child :username="parentData" />
</template>

<script setup>
import { ref } from 'vue';
import Child from './Child.vue';

const parentData = ref('Vue Developer');
</script>

子组件接收:

<template>
  <p>{{ props.username }}</p>
</template>

<script setup>
const props = defineProps({
  username: {
    type: String,
    default: '',
  },
});
</script>

2. 子父组件通信 - Emit

子组件通过触发事件将数据传递给父组件。

<script setup>
import { defineEmits } from 'vue';

const emits = defineEmits(['updateParent']);
const updateHandler = () => {
  emits('updateParent', 'New Data');
};
</script>

父组件监听事件:

<template>
  <Child @updateParent="handleUpdate" />
</template>

<script setup>
const handleUpdate = (data) => {
  console.log(data); // 输出 "New Data"
};
</script>

3. 兄弟组件通信 - mitt.js

使用 mitt.js 实现兄弟组件之间的通信。

  1. 安装 mitt.js:npm install mitt
  2. 全局挂载:app.config.globalProperties.$bus = new mitt();

发送事件:

import { getCurrentInstance } from 'vue';
const instance = getCurrentInstance();
instance.appContext.config.globalProperties.$bus.emit('event-name', payload);

监听事件:

import { onMounted, onUnmounted } from 'vue';
import { getCurrentInstance } from 'vue';

const instance = getCurrentInstance();
onMounted(() => {
  instance.appContext.config.globalProperties.$bus.on('event-name', (payload) => {
    console.log(payload);
  });
});

onUnmounted(() => {
  instance.appContext.config.globalProperties.$bus.off('event-name');
});

4. 非显式 Props - $attrs

$attrs 用于接收未定义为 Props 的属性。

<template>
  <Child data-extra="Extra Info" />
</template>

<script setup>
import { useAttrs } from 'vue';
const attrs = useAttrs();
console.log(attrs['data-extra']); // 输出 "Extra Info"
</script>

5. 引用子组件实例 - Refs

父组件可以通过 ref 访问子组件的公开方法和属性。

<template>
  <Child ref="childRef" />
  <button @click="invokeChildMethod">Invoke</button>
</template>

<script setup>
import { ref } from 'vue';
import Child from './Child.vue';

const childRef = ref(null);
const invokeChildMethod = () => {
  childRef.value.someExposedMethod();
};
</script>

子组件暴露方法:

<script setup>
const someExposedMethod = () => {
  console.log('Method Called');
};

defineExpose({ someExposedMethod });
</script>

6. 双向绑定 - v-model

v-model 提供了双向数据绑定的功能。

<template>
  <Child v-model:title="pageTitle" />
</template>

<script setup>
import { ref } from 'vue';
import Child from './Child.vue';

const pageTitle = ref('Page Title');
</script>

子组件实现:

<script setup>
import { defineEmits } from 'vue';

const emit = defineEmits(['update:title']);
const updateTitle = (newTitle) => {
  emit('update:title', newTitle);
};
</script>

7. 多层组件通信 - Provide/Inject

Provide 和 Inject 用于跨层级的数据共享。

<script setup>
import { provide } from 'vue';

provide('sharedValue', 'Shared Data');
</script>

后代组件获取:

<script setup>
import { inject } from 'vue';

const sharedValue = inject('sharedValue');
console.log(sharedValue); // 输出 "Shared Data"
</script>

8. 路由参数通信

通过 Vue Router 传递参数。

  • Query 参数:router.push({ path: '/page', query: { key: 'value' } });
  • Params 参数:router.push({ name: 'routeName', params: { id: 1 } });
  • State 参数:router.push({ path: '/page', state: { data: 'value' } });

9. 浏览器存储 - LocalStorage/SessionStorage

利用浏览器的存储机制进行持久化或临时数据共享。

// 存储
localStorage.setItem('key', 'value');
sessionStorage.setItem('key', 'value');

// 获取
const storedValue = localStorage.getItem('key');
const sessionValue = sessionStorage.getItem('key');

// 删除
localStorage.removeItem('key');
sessionStorage.removeItem('key');

10. 全局对象挂载 - Window

通过 window 对象挂载全局变量(不推荐)。

window.globalData = 'Global Value';
console.log(window.globalData); // 输出 "Global Value"

11. 全局配置 - app.config.globalProperties

在 Vue 应用中设置全局属性。

app.config.globalProperties.$globalMsg = 'Global Message';

访问全局属性:

import { getCurrentInstance } from 'vue';
const instance = getCurrentInstance();
console.log(instance.appContext.config.globalProperties.$globalMsg);
标签: Vue3

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。