当前位置:首页 > VUE

vue订阅者实现

2026-01-17 23:02:44VUE

Vue 订阅者模式实现

在 Vue 中实现订阅者模式通常通过自定义事件或 Vuex 状态管理完成。以下是几种常见方法:

自定义事件(Event Bus)

创建一个全局事件总线作为中介:

// eventBus.js
import Vue from 'vue'
export const EventBus = new Vue()

组件订阅事件:

import { EventBus } from './eventBus'
EventBus.$on('event-name', (payload) => {
  console.log('Received:', payload)
})

发布事件:

vue订阅者实现

EventBus.$emit('event-name', { data: 'example' })

Vuex 状态管理

通过 Vuex 的 store 实现状态订阅:

// store.js
export default new Vuex.Store({
  state: { count: 0 },
  mutations: {
    increment(state, payload) {
      state.count += payload
    }
  }
})

组件订阅状态变化:

vue订阅者实现

this.$store.subscribe((mutation, state) => {
  if (mutation.type === 'increment') {
    console.log('Count changed:', state.count)
  }
})

watch 监听器

直接监听响应式数据变化:

export default {
  data() {
    return { message: 'Hello' }
  },
  watch: {
    message(newVal, oldVal) {
      console.log('Message changed:', newVal)
    }
  }
}

第三方库(如 mitt)

使用轻量级事件库:

import mitt from 'mitt'
const emitter = mitt()

// 订阅
emitter.on('event', (data) => console.log(data))

// 发布
emitter.emit('event', { key: 'value' })

注意事项

  • 事件总线需在组件销毁时移除监听器避免内存泄漏:
    EventBus.$off('event-name')
  • Vuex 更适合大型应用的状态管理,小型项目可使用事件总线
  • 深层对象监听需要指定 deep: true 参数

选择方法时应根据项目规模和复杂度决定,简单组件通信可用自定义事件,跨组件状态管理推荐 Vuex。

标签: vue
分享给朋友:

相关文章

vue实现删除

vue实现删除

Vue 实现删除功能的方法 在 Vue 中实现删除功能通常涉及以下几个步骤: 数据绑定与列表渲染 使用 v-for 指令渲染列表数据,并为每个项绑定唯一标识符(如 id)。例如: <…

vue实现文字

vue实现文字

Vue 中实现文字显示的方法 在 Vue 中实现文字显示可以通过多种方式,包括插值表达式、指令、组件等。以下是几种常见的实现方法: 插值表达式 使用双大括号 {{ }} 进行文本插值,这是 Vue…

vue实现签章

vue实现签章

Vue 实现签章功能 签章功能通常包括手写签名、电子印章等。以下是基于 Vue 的实现方法: 使用 canvas 实现手写签名 安装依赖(如需要): npm install signature_p…

vue实现ios

vue实现ios

Vue 实现 iOS 风格应用 使用 Vue 实现 iOS 风格的应用,可以通过结合 UI 框架和自定义样式来达成目标。以下是具体方法和步骤: 选择 iOS 风格的 UI 框架 Vue 生态中有多…

vue实现网站

vue实现网站

Vue 实现网站的基本步骤 Vue.js 是一个渐进式 JavaScript 框架,适合构建现代化的单页应用(SPA)或动态网站。以下是使用 Vue 实现网站的基本方法。 初始化 Vue 项目 使用…

vue 实现excel

vue 实现excel

Vue 实现 Excel 功能 前端导出 Excel 使用 xlsx 库可以轻松实现前端 Excel 导出功能。安装依赖: npm install xlsx 导出 Excel 示例代码: impo…