vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > Vue组件间传递数据

Vue组件间传递数据的多种方法

作者:几何心凉

在实际开发中,Vue组件之间的数据传递是最常见的需求,由于组件的作用域相互独立,如何在父子、兄弟和跨级组件间传递数据就显得尤为重要,本文将详细介绍多种Vue组件间传递数据的方,需要的朋友可以参考下

1. 引言

在实际开发中,Vue组件之间的数据传递是最常见的需求。由于组件的作用域相互独立,如何在父子、兄弟和跨级组件间传递数据就显得尤为重要。本文将详细介绍多种Vue组件间传递数据的方法,包括父子通信、兄弟通信、跨级传递以及全局状态管理方案,帮助你在不同场景下选择最适合的通信策略。

2. 常用数据传递方式

2.1 父子通信:Props 与 $emit

父向子传递数据

示例:

父组件:

<template>
  <div>
    <child-component :message="parentMessage" />
  </div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
  components: { ChildComponent },
  data() {
    return { parentMessage: '来自父组件的数据' };
  }
};
</script>

子组件:

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

子向父传递数据

示例:

子组件:

<template>
  <button @click="sendData">传递数据给父组件</button>
</template>
<script>
export default {
  methods: {
    sendData() {
      this.$emit('data-sent', '来自子组件的数据');
    }
  }
};
</script>

父组件:

<template>
  <div>
    <child-component @data-sent="handleData" />
    <p>{{ receivedData }}</p>
  </div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
  components: { ChildComponent },
  data() {
    return { receivedData: '' };
  },
  methods: {
    handleData(data) {
      this.receivedData = data;
    }
  }
};
</script>

2.2 兄弟组件通信:共享父组件或全局事件总线

通过共同父组件

示例:

父组件:

<template>
  <div>
    <child-a :sharedData="sharedData" />
    <child-b :sharedData="sharedData" @update-data="updateSharedData" />
  </div>
</template>
<script>
import ChildA from './ChildA.vue';
import ChildB from './ChildB.vue';
export default {
  components: { ChildA, ChildB },
  data() {
    return { sharedData: '初始数据' };
  },
  methods: {
    updateSharedData(newData) {
      this.sharedData = newData;
    }
  }
};
</script>

子组件B:

<template>
  <div>
    <p>{{ sharedData }}</p>
    <button @click="changeData">更新数据</button>
  </div>
</template>
<script>
export default {
  props: ['sharedData'],
  methods: {
    changeData() {
      this.$emit('update-data', '更新后的数据');
    }
  }
};
</script>

全局事件总线(EventBus)

示例:

创建eventBus.js

import Vue from 'vue';
export const EventBus = new Vue();

子组件A(发送数据):

<template>
  <button @click="sendData">发送数据</button>
</template>
<script>
import { EventBus } from './eventBus';
export default {
  methods: {
    sendData() {
      EventBus.$emit('data-event', '兄弟组件传递的数据');
    }
  }
};
</script>

子组件B(接收数据):

<template>
  <p>{{ dataFromBus }}</p>
</template>
<script>
import { EventBus } from './eventBus';
export default {
  data() {
    return { dataFromBus: '' };
  },
  created() {
    EventBus.$on('data-event', (data) => {
      this.dataFromBus = data;
    });
  },
  beforeDestroy() {
    EventBus.$off('data-event');
  }
};
</script>

2.3 跨级组件通信:Provide/Inject

示例:

祖先组件:

<template>
  <div>
    <child-component />
  </div>
</template>
<script>
export default {
  provide() {
    return { sharedMessage: '来自祖先的数据' };
  }
};
</script>

后代组件:

<template>
  <p>{{ sharedMessage }}</p>
</template>
<script>
export default {
  inject: ['sharedMessage']
};
</script>

2.4 全局状态管理:Vuex

示例:

store/index.js:

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);

export default new Vuex.Store({
  state: { message: '初始Vuex数据' },
  mutations: {
    updateMessage(state, payload) {
      state.message = payload;
    }
  },
  actions: {
    changeMessage({ commit }, newMessage) {
      commit('updateMessage', newMessage);
    }
  },
  getters: {
    getMessage(state) {
      return state.message;
    }
  }
});

组件使用Vuex:

<template>
  <div>
    <p>{{ message }}</p>
    <button @click="changeMessage('更新后的Vuex数据')">更新</button>
  </div>
</template>
<script>
import { mapGetters, mapActions } from 'vuex';
export default {
  computed: { ...mapGetters(['getMessage']) },
  methods: { ...mapActions(['changeMessage']) },
  computed: {
    message() {
      return this.getMessage;
    }
  }
};
</script>

3. 总结

Vue组件间数据传递的方法众多,主要包括:

以上就是Vue组件间传递数据的多种方法的详细内容,更多关于Vue组件间传递数据的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文