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)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 详解vue中axios请求的封装

    下面我会详细讲解vue中axios请求的封装。 前言 在vue项目开发中,我们经常需要使用到axios进行数据请求。但是,每次使用axios都需要重复的书写请求代码,一方面增加了代码量,另一方面也容易造成代码的维护成本变高。 所以,我们需要将axios请求进行封装,以便于复用和维护代码。 封装步骤 1. 安装axios 在vue项目中,使用axios请求前,…

    Vue 2023年5月28日
    00
  • 教你如何使用VUE组件创建SpreadJS自定义单元格

    教你如何使用VUE组件创建SpreadJS自定义单元格 前言 本篇文章将会详细讲解如何使用VUE组件创建SpreadJS自定义单元格。在讲解具体实现过程前,我们需要先明确两个概念: SpreadJS:一款可用于构建企业级Web应用程序的JavaScript电子表格控件。 自定义单元格:就是我们可以在电子表格中添加自己的HTML代码并且自由布局的单元格。 步骤…

    Vue 2023年5月27日
    00
  • VsCode新建VueJs项目的详细步骤

    下面是VsCode新建VueJs项目的详细步骤的完整攻略。 1. 确认安装Node.js 在开始创建VueJS项目之前,请先确认你的电脑上已经正确安装了Node.js。你可以在命令行中输入以下代码检查Node.js是否已经成功安装: node -v 如果能够正确输出版本号,就表示已经安装成功了。 2. 安装Vue CLI 在安装VueCLI之前,请先在命令行…

    Vue 2023年5月28日
    00
  • Vue之请求如何传递参数

    当我们通过Vue进行请求时,有时需要把一些参数传递给后端接口。在这里,我们可以采用两种方式来传递参数。下面将分别详细介绍这两种方式。 通过URL传递参数 通常,我们可以把参数直接拼接在请求的URL末尾,比如: axios.get(‘/api/user?id=1’) .then(function (response) { console.log(respons…

    Vue 2023年5月27日
    00
  • vue中如何通过函数传参数

    在Vue中,我们可以通过自定义事件及$emit方法来实现组件间的传值。相比传统的props和$emit,在某些场景下,使用函数传参可以更加方便快捷。下面是两种函数传参的示例: 示例1:通过匿名函数传递参数 在Vue中,在父组件里定义一个函数,该函数传入参数后将其传递给子组件触发自定义事件。子组件接收到事件后,触发一个匿名函数并将父组件传入的参数带入,然后将匿…

    Vue 2023年5月27日
    00
  • 在Vue中是如何封装axios

    在Vue中,axios库通常用于进行网络请求。为了方便代码复用和管理,我们可以将axios进行封装,封装后的axios可以配置全局的拦截器、预设基础路径、统一处理错误响应等。下面是封装axios的完整攻略: 1. 安装axios 在封装axios之前,我们首先需要安装axios库。在项目根目录下打开终端,输入以下命令进行安装: npm install axi…

    Vue 2023年5月28日
    00
  • Vue中localStorage的用法和监听localStorage值的变化

    关于Vue中localStorage的用法和监听localStorage值的变化,以下是完整内容: 1. Vue中localStorage的用法 LocalStorage是浏览器提供的一种本地存储方式,数据可以永久的保存在浏览器本地,下次访问此网页还能取回数据。使用localStorage需要使用到原生的JavaScript语法。在 Vue 中使用 loca…

    Vue 2023年5月28日
    00
  • vue中实现路由跳转的三种方式超详细教程

    接下来我将为你详细讲解“vue中实现路由跳转的三种方式超详细教程”。 背景介绍 Vue是一款流行的JavaScript框架。Vue Router是Vue的官方路由管理器。在Vue中,可以使用Vue Router实现页面路由跳转。 本教程将介绍Vue Router中实现路由跳转的三种方式。这三种方式分别是: 使用<router-link>标签进行跳…

    Vue 2023年5月29日
    00
合作推广
合作推广
分享本页
返回顶部