vue中组件通信的八种方式(值得收藏!)

Vue中组件通信的八种方式

在Vue框架中,组件通信是十分重要的一环,特别是在大型项目中。Vue提供了多种方式来实现组件之间的通信。以下是Vue中组件通信的八种方式:

一、父向子传递数据

父组件可以通过prop传递数据给子组件。子组件通过props选项声明自己接受哪些来自父组件的属性。

例如,父组件向子组件传递一个字符串:

<!-- 父组件 -->
<template>
  <div>
    <HelloWorld msg="Hello Vue!" />
  </div>
</template>

<script>
import HelloWorld from "@/components/HelloWorld.vue";

export default {
  components: {
    HelloWorld,
  },
};
</script>

<!-- 子组件 -->
<template>
  <div>{{ msg }}</div>
</template>

<script>
export default {
  props: {
    msg: String,
  },
};
</script>

二、子向父传递数据

子组件可以通过$emit方法来向父组件传递数据。在子组件中,使用$emit触发一个自定义事件,并传递需要传递的数据,父组件监听这个自定义事件,接收子组件传递的数据。

例如,子组件向父组件传递一个字符串:

<!-- 父组件 -->
<template>
  <div>
    <HelloWorld @hello="hello" />
  </div>
</template>

<script>
import HelloWorld from "@/components/HelloWorld.vue";

export default {
  components: {
    HelloWorld,
  },
  methods: {
    hello(msg) {
      console.log(msg);
    },
  },
};
</script>

<!-- 子组件 -->
<template>
  <button @click="sendHello()">Say hello</button>
</template>

<script>
export default {
  methods: {
    sendHello() {
      this.$emit("hello", "Hello Vue!");
    },
  },
};
</script>

三、兄弟之间的数据传递

在父组件中,通过v-bind绑定子组件的数据,然后通过props传递给另一个兄弟组件。兄弟组件之间进行通信需要借助父组件作为中转站。

例如,兄弟组件之间传递一个字符串:

<!-- 父组件 -->
<template>
  <div>
    <HelloWorld :msg="msg" />
    <HelloWorld2 :msg2="msg2" />
  </div>
</template>

<script>
import HelloWorld from "@/components/HelloWorld.vue";
import HelloWorld2 from "@/components/HelloWorld2.vue";

export default {
  components: {
    HelloWorld,
    HelloWorld2,
  },
  data() {
    return {
      msg: "Hello Vue!",
      msg2: "",
    };
  },
};
</script>

<!-- 子组件1 -->
<template>
  <div>{{ msg }}</div>
</template>

<script>
export default {
  props: {
    msg: String,
  },
};
</script>

<!-- 子组件2 -->
<template>
  <div>
    <input v-model="msg2" />
  </div>
</template>

<script>
export default {
  props: {
    msg2: String,
  },
  watch: {
    msg2(val) {
      this.$emit("msg2-change", val);
    },
  },
};
</script>

四、使用事件总线

在Vue应用程序中创建一个事件总线,然后在不同组件之间注册事件,随着应用程序的执行,事件的发布和处理将在事件总线中进行。

例如,使用事件总线传递一个字符串:

// event-bus.js
import Vue from "vue";
export const EventBus = new Vue();

// Sender.vue
import { EventBus } from "./event-bus.js";
export default {
  methods: {
    sendMessage() {
      EventBus.$emit("message", "Hello Vue!");
    },
  },
};

// Receiver.vue
import { EventBus } from "./event-bus.js";
export default {
  created() {
    EventBus.$on("message", (message) => {
      console.log(message);
    });
  },
};

五、使用Vuex

Vuex是Vue的状态管理库,它允许我们在应用程序中共享和管理数据。组件可以通过分发Vuex中的操作来更改或获取数据。

例如,使用Vuex传递一个字符串:

// store.js
import Vue from "vue";
import Vuex from "vuex";
Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    message: "",
  },
  mutations: {
    updateMessage(state, message) {
      state.message = message;
    },
  },
});

// Sender.vue
export default {
  methods: {
    sendMessage() {
      this.$store.commit("updateMessage", "Hello Vue!");
    },
  },
};

// Receiver.vue
export default {
  computed: {
    message() {
      return this.$store.state.message;
    },
  },
};

六、使用provide/inject

provide/inject用于非响应式数据的跨级传递,父级组件通过provide提供数据,后代组件通过inject注入数据,可以跨越多层嵌套关系。

例如,使用provide/inject传递一个字符串:

// Parent.vue
export default {
  provide: {
    message: "Hello Vue!",
  },
};

// Child.vue
export default {
  inject: ["message"],
  mounted() {
    console.log(this.message);
  },
};

七、使用$parent和$children

Vue组件实例有两个属性$parent和$children,可以通过它们访问父级组件和子级组件的实例。但是,这种方法不太可靠,因为它依赖组件树的结构。

例如,使用$parent和$children传递一个字符串:

// Parent.vue
export default {
  mounted() {
    console.log(this.$children[0].message);
  },
};

// Child.vue
export default {
  data() {
    return {
      message: "Hello Vue!",
    };
  },
};

八、使用$attrs和$listeners

$attrs和$listeners是在Vue中传递属性和事件的另一种方式。$attrs保存传递给组件的所有属性,而$listeners保存传递给组件的所有事件监听器。

例如,使用$attrs和$listeners传递一个字符串:

<!-- Parent.vue -->
<template>
  <div>
    <Child msg="Hello Vue!" @sent="sent" />
  </div>
</template>

<script>
import Child from "@/components/Child.vue";

export default {
  components: {
    Child,
  },
  methods: {
    sent() {
      console.log("Message sent");
    },
  },
};
</script>

<!-- Child.vue -->
<template>
  <button
    @click="$listeners.sent()"
    v-bind="($attrs)"
    v-on="($listeners)"
  ></button>
</template>

<script>
export default {
  inheritAttrs: false,
  props: {
    msg: String,
  },
};
</script>

总结:
除了以上八种方式,Vue还有其他的通信方式,如自定义事件、provide/inject(响应式数据传递)、$parent和$root,大家可以根据具体业务需求进行选择。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue中组件通信的八种方式(值得收藏!) - Python技术站

(0)
上一篇 2天前
下一篇 2天前

相关文章

  • vue指令 v-bind的使用和注意需要注意的点

    下面是关于“vue指令 v-bind的使用和注意需要注意的点”的完整攻略。 1. vue指令 v-bind的使用 v-bind指令用于动态绑定html属性或Vue组件的属性。它的语法是 v-bind:属性名 或者简写成:属性名,例如: <template> <div> <a v-bind:href="url"…

    Vue 1天前
    00
  • vue3中使用Apache ECharts的详细方法

    在Vue3中使用Apache ECharts的方法,可以通过以下步骤来实现: 步骤1:安装ECharts 可以通过NPM来安装ECharts,输入以下命令来安装最新版本的ECharts: npm install echarts 步骤2:在Vue3中引入ECharts 可以在Vue3中使用ECharts,只需要在需要使用的组件中引入ECharts即可,例如: …

    Vue 1天前
    00
  • vue解析指令compile源码层面使用解析

    Vue.js 是一个流行的 JavaScript 框架,它支持使用模板语法编写数据绑定和渲染逻辑,这些模板语法通过指令进行定义和使用。在 Vue.js 中,一个指令通常由两部分组成:指令名称和绑定值。指令名称可以是任意有效的 CSS 类名或 HTML 属性名,绑定值可以是表达式或 JavaScript 对象。当一个指令被解析和渲染时,Vue.js 会将其转换…

    Vue 1天前
    00
  • Nuxt.js实现一个SSR的前端博客的示例代码

    下面就是“Nuxt.js实现一个SSR的前端博客的完整攻略”。 Nuxt.js简介 Nuxt.js 是一个基于 Vue.js 的通用应用框架,它可以帮助我们快速搭建一个 Vue.js 应用(如 SPA、SSR、静态 生成),并且还提供了自动化的构建和部署功能。 步骤 1. 创建项目 首先,我们需要安装 Node.js 和 Npm。然后,我们可以使用 Npm …

    Vue 1天前
    00
  • vue-router传参的四种方式超详细讲解

    下面是“vue-router传参的四种方式超详细讲解”的完整攻略。 一、路径参数 路径参数是指在路由路径中使用“:xxx”的方式来表示一个参数,该参数为动态的,可以根据需要传入不同的值。使用路径参数可以方便地对同一组件进行不同样式或页面展示的切换,比如展示一组商品列表时选择不同的分类。 在定义路由时,只需将参数用“:”包围即可,如下所示: { path: ‘…

    Vue 2天前
    00
  • Vue动态实现评分效果

    下面就是 “Vue动态实现评分效果” 的完整攻略。 1. 了解评分组件的实现细节 评分组件是一个很常见的组件,在 Vue 中实现起来也比较简单。我们可以通过 v-for 指令渲染出固定个数的星星图标,然后通过绑定 @click 事件来处理星星的选中状态,进而实现评分效果。具体实现步骤如下: 首先,我们需要定义一个数组 starList 来存储星星的显示状态,…

    Vue 2天前
    00
  • vue vant中picker组件的使用

    针对“vue vant中picker组件的使用”的完整攻略,我将分为以下几个部分进行讲解: picker组件的基本使用 picker组件的高级使用 两条示例说明 1. picker组件的基本使用 在vue vant中使用picker组件首先需要通过npm安装vant组件库: npm install vant -S 然后在需要使用picker组件的页面中导入v…

    Vue 2天前
    00
  • vue-property-decorator用法详解

    Vue.js 是一个非常受欢迎的前端框架,它能够快速构建交互性强的单页面应用。而 vue-property-decorator 是一个用于 Vue.js 的装饰器库,可以帮助我们更方便地编写 Vue.js 组件。下面来详细讲解 vue-property-decorator 的用法。 安装 通过 npm 安装 vue-property-decorator: n…

    Vue 2天前
    00
  • vue项目base64转img方式

    下面我来详细讲解”Vue项目Base64转Img方式”的完整攻略。 什么是Base64? Base64是一种将二进制数据编码成ASCII字符的方式。通过这种方式,可以将图片、音频、视频等二进制数据以文本的形式传输或储存。在Vue项目中,我们可以使用Base64方式将图片转化为文本,方便传输和储存。 Base64转Img的原理 将一个图片文件使用Base64编…

    Vue 1天前
    00
  • vue 指令与过滤器案例代码

    以下是关于 Vue 指令与过滤器的详细攻略: Vue 指令 Vue.js 中的指令是一种特殊的属性,以 v- 开头,并且会在渲染时根据一些逻辑被解析和执行。指令主要是用来操作 DOM 元素的,包括变更元素的文本内容、监听元素的事件、控制元素的显示和隐藏等等。下面是几个常用的指令示例。 v-text 指令 这个指令可以用来替代元素的 innerText 属性,…

    Vue 2天前
    00