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

yizhihongxing

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实现可移动水平时间轴

    Vue实现可移动水平时间轴 1. 引入样式文件 在head标签内引入需要用到的样式文件,例如: <head> <link rel="stylesheet" href="timeline.css"> </head> 2. 组件的结构 要实现一个时间轴,我们需要用到一个列表(<ul…

    Vue 2023年5月29日
    00
  • Delegate IDE build/run actions to maven 配置会影响程序运行吗?

    “Delegate IDE build/run actions to maven”这个选项是IntelliJ IDEA中的一个功能,意味着让IDEA通过Maven来进行项目构建、测试以及运行。在Maven的配置文件中,可以进行配置来指定构建、测试和运行项目时所需的依赖和其他配置。 配置会影响程序的构建过程 选择”Delegate IDE build/run …

    Vue 2023年5月28日
    00
  • Vue验证码60秒倒计时功能简单实例代码

    那么我们来逐步讲解如何使用Vue实现验证码60秒倒计时功能的步骤和代码实现。 步骤一:安装Vue 首先,需要安装Vue,可通过以下命令安装: npm install vue 步骤二:创建Vue实例 在HTML页面中引入Vue库后,需创建Vue实例,用于管理页面数据和操作行为: const vueApp = new Vue({ el: ‘#app’, data…

    Vue 2023年5月29日
    00
  • Vue3.0静态文件存放路径与引用方式

    下面是关于Vue3.0静态文件存放路径与引用方式的完整攻略: 静态文件存放路径 在Vue3.0中,静态文件被默认存放在public文件夹中,该文件夹位于项目根目录下。在public文件夹中,你可以自由创建文件夹存放静态资源,例如images、css、js等文件夹。 值得注意的是,public文件夹中的文件可以被直接引用,例如<img src=”/ima…

    Vue 2023年5月28日
    00
  • Vue 中v-model的完整用法及原理

    首先我们先来了解一下v-model的基本用法和原理。 v-model的基本用法 在Vue中,v-model被用来实现表单元素和Vue实例之间的双向数据绑定。v-model通常和表单元素input、textarea、select等配合使用。将 v-model 赋值给一个普通的变量,这个变量就可以被修改以响应用户的输入和交互。 v-model的基本语法如下: &…

    Vue 2023年5月27日
    00
  • 详解vue-cli项目中怎么使用mock数据

    下面是详细讲解vue-cli项目中怎么使用mock数据的完整攻略: 1. 什么是Mock数据? Mock(模拟)数据是指在应用开发中,为了测试或者展示某些特定场景,而生成的一些假数据,这些数据可以被用来代替实际的数据,来进行快速、高效的应用开发。在前后端分离的架构下,Mock数据往往是前端开发人员自己模拟生成,而不必触碰后端的真实数据。 2. 为什么使用Mo…

    Vue 2023年5月28日
    00
  • 深入解析Vue 组件命名那些事

    下面我将为你详细讲解“深入解析Vue 组件命名那些事”的完整攻略。 1. 为什么需要规范化的组件命名 在创建Vue应用时,我们通常需要定义很多的组件。如果不加以规范化的组件命名,就会给在后续开发中造成很大的麻烦。比如:组件名与方法名重名、难于查找等情况。因此,规范化组件命名变得十分必要。 2. 组件命名规范 Vue官方定义了组件命名的规范,具体如下: 组件名…

    Vue 2023年5月27日
    00
  • javascript使用substring实现的展开与收缩文字功能示例

    下面是详细讲解JavaScript使用substring实现的展开与收缩文字功能的完整攻略。 什么是“展开与收缩文字功能”? “展开与收缩文字功能”指的是一个常见的交互效果,即当页面上某一段文字过长时,可以利用JavaScript代码将其缩短并用一个“展开”按钮控制显示全部内容或隐藏部分内容。这种效果通常用于提升页面的读取体验,避免过多文字占据页面空间。 使…

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