vue3中监听,组件通信如父子传值、Vuex、Event Bus的使用

这篇具有很好参考价值的文章主要介绍了vue3中监听,组件通信如父子传值、Vuex、Event Bus的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、监听

二、父子传值:

1、父传子:

2、子传父

三、全局状态管理(Vuex):

四、事件总线(Event Bus):


一、监听

<template>
  <div>
    <p>Count: {{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script setup>
import { ref, watch } from 'vue';

const count = ref(0);

const increment = () => {
  count.value++;
};

// 使用 watch 监听 count 的变化
watch(count, (newValue, oldValue) => {
  console.log(`count changed from ${oldValue} to ${newValue}`);
});
</script>

二、父子传值:

1、父传子:

我们有一个父组件ParentComponent和一个子组件ChildComponent。在父组件中,我们使用:childProp="parentData"将数据传递给子组件。在子组件中,我们使用defineProps来接收父组件传递的属性(props)。

ParentComponent.vue:

<template>
  <div>
    <p>我是父组件</p>
    <ChildComponent :childProp="parentData" />
  </div>
</template>

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

const parentData = ref('Hello from parent');
</script>

ChildComponent.vue:

<template>
  <div>
    <p>子组件接收的数据: {{ childProp }}</p>
  </div>
</template>

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

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

2、子传父

在父组件中,我们使用 @childEvent="handleChildEvent" 来监听子组件的 childEvent 事件,并在 handleChildEvent 方法中接收子组件传递的数据。这样,当在子组件点击按钮时,子组件会通过自定义事件将数据传递给父组件,父组件监听事件并接收数据。

ChildComponent.vue:

<template>
  <button @click="sendDataToParent">向父组件传递数据</button>
</template>

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

const emits = defineEmits(['childEvent']);

const sendDataToParent = () => {
  emits('childEvent', 'Hello from child');
};
</script>

在子组件中,我们使用 defineEmits 来定义一个自定义事件 childEvent,然后通过 sendDataToParent 方法触发该事件,并传递数据 'Hello from child'

ParentComponent.vue:

<template>
  <div>
    <p>来自子组件的数据: {{ dataFromChild }}</p>
    <ChildComponent @childEvent="handleChildEvent" />
  </div>
</template>

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

const dataFromChild = ref('');

const handleChildEvent = (data) => {
  dataFromChild.value = data;
};
</script>

三、全局状态管理(Vuex):

Vuex 是 Vue 官方提供的状态管理库,用于管理应用的共享状态。通过 Vuex,你可以在任何组件中访问和修改全局状态,实现组件之间的数据共享。

以下是一些简单的步骤,以示例代码为基础,展示如何设置和使用Vuex。

  1. 安装 Vuex:首先,确保在你的项目中安装了Vuex:
    cnpm install vuex
  2. 创建 Vuex Store:在你的应用中创建一个Vuex store,用于管理全局状态。在一个名为 store.js 的文件中编写以下代码:
    import { createStore } from 'vuex';
    
    const store = createStore({
      state() {
        return {
          count: 0
        };
      },
      mutations: {
        mutationsIncrement(state, newCount) {
          state.count = newCount;
        }
      },
      actions: {
        increment(context, count) {
          context.commit('mutationsIncrement', count);
        }
      },
      getters: {
        getCount(state) {
          return state.count;
        }
      }
    });
    
    export default store;
    
  3.  在主应用中使用 Vuex Store:在主应用中引入并使用创建好的 Vuex store:
    在 main.js 中:
    import { createApp } from 'vue';
    import App from './App.vue';
    import store from './store';
    
    const app = createApp(App);
    app.use(store);
    app.mount('#app');
    
  4. 在组件中使用 Vuex:在你的组件中使用 Vuex 中的状态、mutations、actions 和 getters。 
    在组件中使用状态:
    <template>
      <div>
        <p>Count: {{ count }}</p>
        <button @click="increment">Increment</button>
      </div>
    </template>
    
    <script setup>
    import { useStore } from 'vuex';
    
    const store = useStore();
    const count = ref('')
    
    const increment = () => {
      // 修改 count
      store.dispatch('increment', 'This is new');
      // 获取 count
      count.value = store.state.count
    };
    </script>
    

这只是一个简单的示例,展示了如何设置和使用 Vuex。在实际应用中,你可以在 store 中管理更多的状态、mutations、actions 和 getters,以满足你的项目需求。如果你需要更多关于 Vuex 的详细信息,建议查阅 Vuex 的官方文档。 

四、事件总线(Event Bus):

事件总线是一种在组件之间传递事件和数据的模式,它可以用于简单的通信场景。你可以通过创建一个 Vue 实例来作为事件总线,然后在需要的组件中使用该实例来监听和触发事件。

在 Vue 3 中并没有 on 和 emit 方法,用于自定义事件的监听和触发对于全局事件总线的需求,Vue 3 推荐使用第三方库如 mitt 。

以下是创建和使用事件总线的简单示例:

安装 mitt 库

cnpm install mitt

EventBus.js:

创建一个 mitt 实例来作为事件总线,然后在组件中引入该实例进行事件监听和触发。

import mitt from 'mitt';

const eventBus = mitt();

export default eventBus;

ComponentA.vue:

在一个组件中,你可以使用事件总线实例来触发事件。

<template>
  <div>
    <button @click="sendMessage">发送消息到组件B</button>
  </div>
</template>

<script setup>
import eventBus from './EventBus';

const sendMessage = () => {
  eventBus.emit('message', 'Hello from Component A');
};
</script>

ComponentB.vue:

在另一个组件中,你可以使用事件总线实例来监听来自其他组件的事件。

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

<script setup>
import eventBus from './EventBus';
import { ref, onMounted } from 'vue';

const receivedMessage = ref('');

onMounted(() => {
  eventBus.on('message', (message) => {
    receivedMessage.value = message;
    console.log('接收到的消息:', receivedMessage.value)
  });
});
</script>

在这个示例中,我们创建了一个事件总线实例 eventBus,并在 ComponentA 组件中使用 eventBus.emit 来触发 message 事件,然后在 ComponentB 组件中使用 eventBus.on 来监听 message 事件,并在事件被触发时更新接收到的消息。

请注意,事件总线模式适用于简单的通信场景,但随着应用变得更加复杂,可能会导致事件的管理和维护变得困难。对于更复杂的通信需求,你可能会考虑使用其他通信方式,如 Vuex 或其他状态管理工具。文章来源地址https://www.toymoban.com/news/detail-638082.html

到了这里,关于vue3中监听,组件通信如父子传值、Vuex、Event Bus的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • watch监听,解决Vue3父组件异步props传值,子组件接收不到的问题

    写静态数据的时候父组件传值子组件接收并渲染是没问题的,但当父组件异步获取数据,子组件接收数据会晚于渲染,就会产生接收不到的问题,我在用echarts绘制图表时图表就直接不显示  用watch监听props数据并在watch内进行赋值操作可解决该问题 直接上代码 父组件,vue3语法

    2024年02月15日
    浏览(44)
  • vue3-父子组件间通信

    在实际业务开发的过程中,我们时常会遇到组件间的通信问题,比如:父子组件间通信、同级组件间通信等。本篇文章中主要介绍父子组件间通信。父子组件间通信主要有以下常见形式: 方案 父组件向子组件 子组件向父组件 props/emits props emits v-model/emits v-model emits ref/emits

    2024年02月05日
    浏览(66)
  • vue3实现父组件向子组件传值并监听props改变触发事件

    1. 父组件 向子组件 loginPhone 传递 tel 参数  phone 是在 reactive 定义的变量也可是是 ref 定义的变量 2. 子组件

    2024年02月05日
    浏览(43)
  • VUE3+TS(父子、兄弟组件通信)

    目录 父传子值、方法(子调用父值、方法) 子传父值(父调用子值) 父读子(子传父)(父调用子值、方法) 兄弟(任意组件)通信 引入Mitt来完成任意组件通信 1、统一规范写法,通过在子组件标签上绑定属性和值,来传递到子组件,子组件再通过defineProps来接收,先给其

    2023年04月08日
    浏览(48)
  • Vue3父子组件间传参通信

    本文主要是记录Vue3在setup语法糖下的父子组件间传参的四种方式 Vue3+TypeScript 父组件传值给子组件主要是由父组件为子组件通过v-bind绑定数值,而后传给子组件;子组件则通过defineProps接收使用。 如下为父组件 Father.vue 如下为子组件Son.vue 父组件 Father.vue 中在调用 Son.vue 这个子

    2024年01月19日
    浏览(76)
  • vue3中的event bus

    event Bus在vue3中事实上已经被删除了,因为官方说它可能会导致一些潜在的问题。如,在大型项目中使用 Event Bus 可能会变得难以维护和调试,同时也可能会影响应用程序的性能。此外,在 Vue 3.x 中已经有更多先进和强大的工具来进行组件之间通信,例如 provide/inject 和 Emit/Li

    2024年02月08日
    浏览(37)
  • vue3 常用的组件互相通信(父子、兄弟、爷孙、任意组件)

    目录 前言:目前组件通信方法有好多种,我这挑选一部分来讲 1、父传子 2、子传父 3、兄弟之间通信 3.1、父组件充当中间件 3.2、全局事件总线—EventBus 4、爷孙之间通信 5、任意组件、全局 方案 父传子 子传父 props / emits props emits v-model / emits v-model emits ref / emits ref emits provi

    2024年02月15日
    浏览(44)
  • vue3探索——组件通信之v-model父子组件数据同步

    再很多场景中,我们可能想在子组件中修改父组件的数据,但事实上,vue不推荐我们这么做,因为数据的修改不容易溯源。 在vue2中,我们使用 .sync 修饰符+自定义事件 \\\'update:xxx\\\' ,来使父子组件数据同步。 这里不作过多说明,有需要请自行了解。 vue3的写法与vue2基本一致。最

    2024年02月11日
    浏览(59)
  • vue3探索——使用ref与$parent实现父子组件间通信

    在vue3中,可以使用vue3的API defineExpose() 函数结合 ref 或者 $parent ,实现父子组件数据的传递。 子组件:通过 defineExpose() 函数,向外暴露响应式数据或者方法 父组件:通过 ref 获取子组件实例,进而获取子组件暴露的响应式数据或方法 💡 你没看错!这里的 ref 就是经常用来定

    2024年02月10日
    浏览(42)
  • vue3 父子传值的使用

    父传子:   setup语法糖的写法:    子传父:   setup语糖的写法:    

    2024年02月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包