Vue2和Vue3的10种组件通信方式梳理

Vue2和Vue3的10种组件通信方式梳理

Vue.js是一款用于构建用户界面的渐进式JavaScript框架,为单页应用提供了一系列有用的特性,如组件化、数据双向绑定、路由管理等。在Vue.js应用程序中,组件通信是非常重要的一环,本文将详细讲解Vue2和Vue3中的10种组件通信方式,以便开发者可以更好地应用这些技巧。

1. 父子组件通信

1.1 父传子

在Vue.js中,父组件可以通过props传递数据到子组件中,这种方式适用于父子组件之间的单向数据流通信。下面是一个示例:

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

<script>
import Child from './Child.vue';

export default {
  components: {
    Child
  },
  data() {
    return {
      message: 'Hello, World!'
    }
  }
}
</script>
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  props: {
    message: String
  }
}
</script>

在上述示例中,通过父组件的message属性将Hello, World!传递给子组件,子组件将props中的message渲染到页面中。

1.2 子传父

子组件通过$emit方法触发父组件的事件来实现子传父的方式,下面是一个示例:

<template>
  <div>
    <button @click="emitMessage">Send Message to Parent</button>
  </div>
</template>

<script>
export default {
  methods: {
    emitMessage() {
      this.$emit('message-to-parent', 'Hello, Parent!');
    }
  }
}
</script>
<template>
  <div>
    <child @message-to-parent="getChildMessage"></child>
  </div>
</template>

<script>
import Child from './Child.vue';

export default {
  components: {
    Child
  },
  methods: {
    getChildMessage(message) {
      alert(message);
    }
  }
}
</script>

在上述示例中,子组件通过@click事件触发emitMessage方法,该方法通过$emit方法触发了父组件的message-to-parent事件,并传递了Hello, Parent!。父组件通过监听该事件,获取到了子组件传递的信息,并进行alert提示。

2. 兄弟组件通信

2.1 通过共同的父组件传递信息

可以通过共同的一个父组件来实现兄弟组件之间的通信,这种方式相当于将父组件作为兄弟组件之间的代理,将信息从一个组件传递到另一个组件。

<template>
  <div>
    <a v-on:click="setCurrent(name)">Set current component</a>
    <child-1 :current="current"></child-1>
    <child-2 :current="current"></child-2>
  </div>
</template>

<script>
import Child1 from './Child1.vue';
import Child2 from './Child2.vue';

export default {
  components: {
    Child1,
    Child2
  },
  data() {
    return {
      current: ''
    }
  },
  methods: {
    setCurrent(name) {
      this.current = name;
    }
  }
}
</script>

在上述示例中,父组件通过click事件触发了setCurrent方法,该方法将当前组件名赋值给了current变量。通过子组件中props接收父组件中的current变量,进行渲染。这样,当某一个子组件props收到值的改变,当前页和其他页的相应数据都会变化。

2.2 使用Vue2中的事件总线

在Vue2中,可以通过创建一个Event Bus实例来实现兄弟组件之间的通信,该实例可作为一个中央事件总线,兄弟组件通过该实例来进行通信。

<template>
  <div>
    <button @click="send()">Send Message</button>
  </div>
</template>

<script>
import EventBus from './EventBus.js';

export default {
  methods: {
    send() {
      EventBus.$emit('message', 'Hello, World!');
    }
  }
}
</script>
<template>
  <div>
    {{message}}
  </div>
</template>

<script>
import EventBus from './EventBus.js';

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

在上述示例中,使用EventBus.$emit触发message事件,子组件通过EventBus.$on监听该事件,并将接收到的数据赋值给了message变量。

2.3 使用Vue3中的provide/inject

Vue3中提供了新的API,provide/inject方法可以实现祖先组件向所有的后代子组件传递信息。这种方式比共同的父组件传递信息方式更加适用于跨组件传递复杂数据结构。

<template>
  <div>
    <child-1></child-1>
    <child-2></child-2>
  </div>
</template>

<script>
import Child1 from './Child1.vue';
import Child2 from './Child2.vue';
import { provide } from 'vue';

export default {
  components: {
    Child1,
    Child2
  },
  setup() {
    const message = 'Hello, World!';
    provide('message', message);
  }
}
</script>
<template>
  <div>
    {{ message }}
  </div>
</template>

<script>
import { inject } from 'vue';

export default {
  setup() {
    const message = inject('message');
    return {
      message
    }
  }
}
</script>

在上述示例中,父组件通过provide方法向后代子组件提供了message变量。后代子组件通过inject方法获取了message变量,并进行渲染显示。

3. 任意两个组件间通信

3.1 通过事件总线

事件总线可以用于任意两个组件之间的通信,只需创建一个全局的Event Bus实例,在各个组件之间进行信息交换即可。如示例2.2所示。

3.2 通过Vuex

Vuex是一个专为Vue.js应用程序开发的状态管理模式,它可以贯穿整个应用的生命周期,并将组件状态作为中央存储库进行管理,为组件之间提供了双向绑定的响应式数据流通信机制。

<template>
  <div>
    <button @click="setMessage">Set Message</button>
    <child></child>
  </div>
</template>

<script>
import { mapMutations } from 'vuex';

export default {
  methods: {
    ...mapMutations(['setMessage']),
  }
}
</script>
<template>
  <div>
    {{ message }}
  </div>
</template>

<script>
import { mapState } from 'vuex';

export default {
  computed: {
    ...mapState(['message']),
  }
}
</script>

在上述示例中,通过mapMutations将setMessage方法映射到当前组件中,点击按钮后通过该方法修改Vuex中的message变量。子组件中通过mapState将Vuex中的message变量映射到组件中进行渲染。这样,两个组件就实现了信息的交换。

3.3 使用全局函数

全局函数可以用于在任何组件之间方便地进行通信,只需在Vue实例上挂载一个方法即可,示例如下:

Vue.prototype.$myFunction = function(message) {
  console.log(message);
}

在其中一个组件中调用该方法:

<template>
  <div>
    <button @click="sendMessage">Send Message</button>
  </div>
</template>

<script>
export default {
  methods: {
    sendMessage() {
      this.$myFunction('Hello, World!');
    }
  }
}
</script>

在另一个组件中接收该方法:

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

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

在上述示例中,将全局函数绑定到Vue.prototype上,在发送组件中使用this.$myFunction触发函数,在接收组件中通过this.$root.$on监听该函数,在函数被触发时,接收组件将message赋值给了本地变量进行渲染。

本文仅是对Vue2和Vue3中组件通信方式的简单梳理,在实际开发中,还需结合具体的业务需求,来选择适用的通信方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue2和Vue3的10种组件通信方式梳理 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • axios的简单封装以及使用实例代码

    下面是对于“axios的简单封装以及使用实例代码”的完整攻略: 1. axios基础概念 axios是一个基于Promise的HTTP客户端,用于浏览器和Node.js。 它支持同步请求和异步请求,并提供了优秀的HTTP拦截器。 axios提供了丰富的配置项,例如设置请求头、设置请求方式、设置超时时间等。 2. 封装axios 对axios进行简单的封装可以…

    Vue 2023年5月28日
    00
  • JS实现的幻灯片切换显示效果

    当下,网站的幻灯片切换效果越来越流行,JS作为前端语言自然是实现幻灯片切换的最佳选择。下面我将详细讲解JS实现的幻灯片切换显示效果的攻略,包含如何引入JS库,如何使用JS实现切换效果等重要内容。 引入JS库 要实现幻灯片切换效果,首先要引入JS库。目前比较流行的JS库有jQuery和Zepto.js,我们可以根据项目的实际需求选择不同的库进行引入。比如我们使…

    Vue 2023年5月28日
    00
  • vue 项目接口管理的实现

    下面是关于“Vue 项目接口管理的实现”的攻略: 一、前言 在Vue开发中,数据的获取和处理是必不可少的。如果您的项目已经非常复杂,那么您最好要考虑如何规范接口的使用,否则将会十分混乱。本文将为您讲解Vue项目中如何有效管理接口和如何与后端进行联调。 二、接口管理的实现 1. 接口管理方案 接口管理可以通过建立一个独立的接口文件夹来实现,这个文件夹可以包括接…

    Vue 2023年5月28日
    00
  • vue-cli脚手架的安装教程图解

    下面是”vue-cli脚手架的安装教程图解”的完整攻略: 安装Node.js 首先,你应该安装Node.js。Node.js是一个JavaScript运行时环境,可以实现服务器端的JavaScript开发。 如果你还没有安装,可以从Node.js官网下载并安装:https://nodejs.org/ 安装vue-cli vue-cli是一个Vue.js项目的…

    Vue 2023年5月27日
    00
  • vue计算属性computed、事件、监听器watch的使用讲解

    下面我将详细讲解“vue计算属性computed、事件、监听器watch的使用讲解”的完整攻略,让你更加深入理解vue中这三个重要的概念。 计算属性computed computed可以理解为计算属性,它可以根据已经存在的数据computed属性(即model中data中的属性)进行计算得到一个新的值,这个新的值可以使用在模板中。computed具有缓存的特…

    Vue 2023年5月28日
    00
  • vue转react入门指南

    感谢您关注我们网站的内容。下面是针对“vue转react入门指南”的完整攻略,希望对您有所帮助。 1. 概述 Vue和React都是当前非常流行的前端框架。如果您熟悉Vue框架,想要学习React框架,可以参考本篇指南。本指南将从以下几个方面帮助您入门React: 认识React框架 学习React的核心概念 手写几个React组件实例 理解React生命周…

    Vue 2023年5月28日
    00
  • vue实现在线预览pdf文件和下载(pdf.js)

    首先,我们需要明确一下,在线预览和下载PDF文件需要借助于开源的PDF.js库。这个库是Mozilla基金会开发的,可以在Web上直接呈现PDF文档。 接下来,我们将学习如何使用Vue.js和PDF.js库,实现在线预览和下载PDF文件的功能。 步骤一:安装依赖 我们首先需要在Vue项目中安装pdf.js库。 在命令行输入: npm install pdfj…

    Vue 2023年5月28日
    00
  • 如何获取this.$store.dispatch的返回值

    获取this.$store.dispatch的返回值可以通过以下步骤实现: 1.使用Promise 在Vue中,this.$store.dispatch返回一个Promise对象,你可以通过在调用dispatch方法时添加.then()和.catch()方法来获取返回值,代码如下: methods: { async getUserInfo() { try {…

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