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

vue3.0中的组件通信方式

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

父组件:

<template>
  <div>
    <ChildComponent :childData="parentData" />
  </div>
</template>

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

const parentData = ref('父组件的数据');
</script>

子组件:

<template>
  <div>{{ childData }}</div>
</template>

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

const props = defineProps({
  childData: String
});
</script>

2、Custom Events(子组件向父组件传递数据)

子组件:

<template>
  <button @click="notifyParent">通知父组件</button>
</template>

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

const emits = defineEmits(['update:parentData']);

function notifyParent() {
  emits('update:parentData', '这是来自子组件的数据');
}
</script>

父组件:

<template>
  <div>
    <ChildComponent @update:parentData="handleParentDataUpdate" />
    <p>父组件接收到的数据:{{ parentReceivedData }}</p>
  </div>
</template>

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

const parentReceivedData = ref('');

function handleParentDataUpdate(data) {
  parentReceivedData.value = data;
}
</script>

3 、Provide / Inject(跨组件传递数据)

祖先组件:

<template>
  <div>
    <DescendantComponent />
  </div>
</template>

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

provide('ancestorData', '这是来自祖先组件的数据');
</script>

后代组件:

<template>
  <div>{{ ancestorData }}</div>
</template>

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

const ancestorData = inject('ancestorData', '默认值');
</script>

4、Refs(父组件访问子组件实例)

父组件:

<template>
  <div>
    <ChildComponent ref="childRef" />
    <button @click="accessChildMethod">调用子组件方法</button>
  </div>
</template>

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

const childRef = ref(null);

function accessChildMethod() {
  if (childRef.value) {
    childRef.value.childMethod();
  }
}
</script>

子组件(ChildComponent.vue):

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

function childMethod() {
  console.log('子组件方法被调用');
}

defineExpose({
  childMethod
});
</script>

5 、Vuex / Pinia(状态管理)

VuexPinia 是 Vue 应用的状态管理模式和库,用于集中管理所有组件的共享状态。它们提供了全局状态存储和跨组件访问状态的能力。

6、 使用v-model进行父子组件间的双向数据绑定

父组件:

<template>
  <div>
    <ChildComponent v-model:childData="parentData" />
    <p>父组件的数据:{{ parentData }}</p>
  </div>
</template>

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

const parentData = ref('初始数据');
</script>

子组件(ChildComponent.vue):

<template>
  <div>
    <input v-model="localData" @input="updateValue" />
  </div>
</template>

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

const props = defineProps({
  modelValue: String
});

const emit = defineEmits(['update:modelValue']);

const localData = computed({
  get: () => props.modelValue,
  set: (value) => emit('update:modelValue', value)
});

function updateValue(event) {
 	console.log(event,"更新后的数据");
}
</script>

7、使用mitt或EventBus进行跨组件通信

mitt是一个轻量级的事件发射/订阅库,它可以用作Vue应用中的全局事件总线,实现跨组件通信。虽然Vue 3没有内置EventBus,但你可以通过安装mitt或自己实现一个简单的EventBus来达到相同的效果。

使用方式
npm install mitt
在项目中创建一个事件总线文件(如eventBus.js):
import mitt from 'mitt';
const emitter = mitt();
export default emitter;
在组件中使用:
// 发送事件的组件
<script setup>
import emitter from './eventBus';

function sendMessage() {
  emitter.emit('message', 'Hello from anywhere!');
}
</script>

// 监听事件的组件
<script setup>
import { onMounted, onUnmounted } from 'vue';
import emitter from './eventBus';

onMounted(() => {
  emitter.on('message', (msg) => {
    console.log(msg); // 输出: Hello from anywhere!
  });
});

onUnmounted(() => {
  emitter.off('message'); // 清理事件监听,避免内存泄漏
});
</script>

http://www.kler.cn/a/300236.html

相关文章:

  • sql实战解析-sum()over(partition by xx order by xx)
  • Android SystemUI——CarSystemBar车载状态栏(九)
  • AutoGen入门——快速实现多角色、多用户、多智能体对话系统
  • 【物联网】keil仿真环境设置 keilV5可以适用ARM7
  • 【Linux系统编程】—— 从零开始实现一个简单的自定义Shell
  • 代码中使用 Iterable<T> 作为方法参数的解释
  • 【PGCCC】Postgres 17 中的 3 大特性
  • 经验笔记:在 TypeScript 中使用回调函数
  • opencv彩色图像转灰度图原理
  • Linux和C语言(Day11)
  • 探索Python的数学魔法:Numpy库的神秘力量
  • linux从0到1 基础完整知识
  • 用Python爬虫制作一个简易翻译器
  • QT cmake vscode 构建流程
  • 空间数据库概述
  • 【Android】GreenDao数据库的使用方式
  • 三菱机器人手柄维修示教器维修手操器面板等
  • Centos7.9部署Gitlab-ce-16.9
  • python列表判断是否为空的三种方式
  • 数据结构(邓俊辉)学习笔记】排序 5——选取:通用算法
  • JavaScript语言基础知识
  • fastjson漏洞--以运维角度进行修复
  • kafka单机安装
  • linux运维常见命令行
  • vulhub spring 远程命令执行漏洞(CVE-2016-4977)
  • 当 PLC 遇见 “IT”