首页 > 文章列表 > Vue组件通讯中的数据共享方案比较

Vue组件通讯中的数据共享方案比较

EventBus:EventBus是一个简单的事件总线 实现组件之间的通信。
474 2023-07-22

Vue组件通讯中的数据共享方案比较

在Vue项目中,组件通讯是一项非常重要的功能。而在组件通讯过程中,数据共享是一个非常常见的需求。在Vue中,我们有多种方式来实现组件之间的数据共享,本文将对这些数据共享方案进行比较,并给出相应的代码示例。

一、父子组件通讯
父子组件通讯是最常见的一种数据共享方式。通过props属性可以将数据从父组件传递到子组件中。

父组件示例:

<template>
  <div>
    <child-component :message="message"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  data() {
    return {
      message: 'hello world'
    }
  },
  components: {
    ChildComponent
  }
}
</script>

子组件示例:

<template>
  <div>
    {{ message }}
  </div>
</template>

<script>
export default {
  props: {
    message: {
      type: String,
      required: true
    }
  }
}
</script>

通过props属性,父组件可以将message数据传递给子组件,子组件在template中使用{{ message }}即可访问该数据。

二、兄弟组件通讯
兄弟组件通讯是指两个没有直接父子关系的组件之间进行数据共享。在Vue中,可以通过事件总线来实现兄弟组件之间的数据传递。

事件总线示例:

// eventBus.js
import Vue from 'vue'
export default new Vue()

// ComponentA.vue
<script>
import eventBus from './eventBus.js'

export default {
  data() {
    return {
      message: 'hello world'
    }
  },
  methods: {
    sendData() {
      eventBus.$emit('message', this.message)
    }
  }
}
</script>

// ComponentB.vue
<script>
import eventBus from './eventBus.js'

export default {
  data() {
    return {
      receivedMessage: ''
    }
  },
  created() {
    eventBus.$on('message', message => {
      this.receivedMessage = message
    })
  }
}
</script>

事件总线首先需要在Vue实例上进行声明,然后通过$emit方法触发事件,再通过$on方法监听事件并接收数据。

三、Vuex状态管理
Vuex是一个专为Vue.js设计的集中式状态管理库,可以在多个组件中共享状态数据。使用Vuex可以方便地管理组件之间的公共数据,并进行统一的状态调度。

Vuex示例:

// store.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    message: 'hello world'
  },
  mutations: {
    updateMessage(state, payload) {
      state.message = payload
    }
  },
  actions: {
    updateMessage({ commit }, payload) {
      commit('updateMessage', payload)
    }
  },
  getters: {
    getMessage(state) {
      return state.message
    }
  }
})

// ComponentA.vue
<script>
export default {
  methods: {
    updateMessage() {
      this.$store.dispatch('updateMessage', 'new message')
    }
  }
}
</script>

// ComponentB.vue
<script>
export default {
  computed: {
    message() {
      return this.$store.getters.getMessage
    }
  }
}
</script>

在Vuex中,通过state属性来定义共享的数据,通过mutations属性来修改共享数据的方法,通过actions属性来触发mutations方法,通过getters属性来获取共享数据。

四、provide/inject
在Vue 2.2.0版本之后,新增了一对API:provide和inject。通过provide可以在祖先组件中提供数据,然后在子孙组件中通过inject来注入这些数据。

provide/inject示例:

// ParentComponent.vue
<template>
  <div>
    <child-component></child-component>
  </div>
</template>

<script>
export default {
  provide: {
    message: 'hello world'
  }
}
</script>

// ChildComponent.vue
<template>
  <div>
    {{ injectedMessage }}
  </div>
</template>

<script>
export default {
  inject: ['message'],
  computed: {
    injectedMessage() {
      return this.message
    }
  }
}
</script>

通过在祖先组件的provide属性中提供数据,再在子孙组件的inject属性中注入这些数据,就可以实现数据的共享。

五、LocalStorage/SessionStorage
如果需要在不同的页面之间共享数据,可以使用LocalStorage或SessionStorage来存储数据。

LocalStorage示例:

// 存储数据到LocalStorage
localStorage.setItem('message', 'hello world')

// 从LocalStorage获取数据
const message = localStorage.getItem('message')

SessionStorage示例:

// 存储数据到SessionStorage
sessionStorage.setItem('message', 'hello world')

// 从SessionStorage获取数据
const message = sessionStorage.getItem('message')

LocalStorage和SessionStorage是浏览器自带的API,可以将数据存储到本地,并可以在不同的页面之间读取这些数据。

以上是几种常见的Vue组件通讯中的数据共享方案,根据实际需求选择合适的方式可以更好地实现组件之间的数据共享。