vue的组件通讯方法总结大全

我来为你详细讲解一下“Vue的组件通讯方法总结大全”的完整攻略。

1. 组件通讯方法概述

在Vue的组件化开发中,组件之间的通讯是必不可少的。Vue提供了多种组件通讯方法,包括:

  • 父子组件通讯:父组件通过props向子组件传递数据,子组件通过emit触发事件向父组件传递数据。
  • 兄弟组件通讯:通过一个共同的父组件来实现兄弟组件通讯,即父组件先接收兄弟组件的数据,再把数据传递给另一个兄弟组件。
  • 跨级组件通讯:使用provide/inject或者$attrs/$listeners实现跨级组件通讯。
  • 非父子组件通讯:使用$emit/$on、事件总线、Vuex等方式实现非父子组件的通讯。

下面我们将详细讲解这些通讯方式的实现方式及示例。

2. 父子组件通讯

父组件向子组件传递数据:

父组件中的模板代码:

<template>
  <div>
    <hello-world :msg="message"></hello-world>
  </div>
</template>

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

  export default {
    name: 'app',
    components: {
      HelloWorld
    },
    data() {
      return {
        message: 'Hello World'
      }
    }
  }
</script>

子组件中的模板代码:

<template>
  <div>{{ msg }}</div>
</template>

<script>
  export default {
    name: 'hello-world',
    props: {
      msg: String
    }
  }
</script>

在上述示例中,我们通过在父组件中使用子组件并传递props的方式向子组件传递了一个名为message、值为'Hello World'的数据。在子组件中,我们通过props接收传递过来的数据并展示在页面上。

子组件向父组件传递数据:

子组件中的模板代码:

<template>
  <button @click="handleClick">Click me</button>
</template>

<script>
  export default {
    name: 'hello-world',
    methods: {
      handleClick() {
        this.$emit('send-message', 'Child component sends a message to parent component');
      }
    }
  }
</script>

父组件中的模板代码:

<template>
  <div>
    <hello-world :msg="message" @send-message="handleSendMessage"></hello-world>
  </div>
</template>

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

  export default {
    name: 'app',
    components: {
      HelloWorld
    },
    data() {
      return {
        message: 'Hello World'
      }
    },
    methods: {
      handleSendMessage(msg) {
        console.log(msg);
      }
    }
  }
</script>

在上述示例中,我们在子组件中通过$emit方法触发了一个名为'send-message'的自定义事件,并向父组件传递了一个字符串类型的msg参数。在父组件中,我们通过在子组件上绑定@send-message事件来监听子组件中触发的事件,同时定义了一个handleSendMessage方法来接收传递过来的msg参数并打印到控制台上。

3. 兄弟组件通讯

由于兄弟组件之间没有直接的通讯方式,因此我们需要通过一个共同的父组件来实现兄弟组件之间的通讯。

父组件中的模板代码:

<template>
  <div>
    <hello-world-1 @send-message="handleSendMessage"></hello-world-1>
    <hello-world-2 :msg="message"></hello-world-2>
  </div>
</template>

<script>
  import HelloWorld1 from './HelloWorld1.vue';
  import HelloWorld2 from './HelloWorld2.vue';

  export default {
    name: 'app',
    components: {
      HelloWorld1,
      HelloWorld2
    },
    data() {
      return {
        message: ''
      }
    },
    methods: {
      handleSendMessage(msg) {
        this.message = msg;
      }
    }
  }
</script>

兄弟组件1中的模板代码:

<template>
  <div>
    <button @click="handleClick">Click me</button>
  </div>
</template>

<script>
  export default {
    name: 'hello-world-1',
    methods: {
      handleClick() {
        this.$emit('send-message', 'Sibling component 1 sends a message to sibling component 2');
      }
    }
  }
</script>

兄弟组件2中的模板代码:

<template>
  <div>{{ msg }}</div>
</template>

<script>
  export default {
    name: 'hello-world-2',
    props: {
      msg: String
    }
  }
</script>

在上述示例中,我们在父组件中声明了两个兄弟组件,并通过handleSendMessage方法实现了兄弟组件之间的数据传递。在兄弟组件1中,我们通过$emit方法触发了一个名为'send-message'的自定义事件,并向父组件传递了一个字符串类型的msg参数。在父组件中,我们通过handleSendMessage方法将传递过来的msg参数赋值给message属性,并作为props传递给了兄弟组件2中。在兄弟组件2中,我们通过props接收传递过来的数据并展示在页面上。

4. 跨级组件通讯

使用provide/inject实现跨级组件通讯:

父组件中的模板代码:

<template>
  <div>
    <hello-world></hello-world>
  </div>
</template>

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

  export default {
    name: 'app',
    components: {
      HelloWorld
    },
    provide() {
      return {
        message: 'Hello World'
      }
    }
  }
</script>

子组件中的模板代码:

<template>
  <div>{{ msg }}</div>
</template>

<script>
  export default {
    name: 'hello-world',
    inject: ['message'],
    computed: {
      msg() {
        return this.message + ' from Inject';
      }
    }
  }
</script>

在上述示例中,我们在父组件中通过provide方法提供了一个名为message、值为'Hello World'的数据。在子组件中,我们通过inject选项注入了父级提供的message数据,并使用computed计算属性将其拼接后展示在页面上。

使用$attrs/$listeners实现跨级组件通讯:

父组件中的模板代码:

<template>
  <div>
    <hello-world v-bind="$attrs" v-on="$listeners"></hello-world>
  </div>
</template>

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

  export default {
    name: 'app',
    components: {
      HelloWorld
    },
  }
</script>

子组件中的模板代码:

<template>
  <div>
    <button v-bind="$attrs" v-on="$listeners">Click me</button>
  </div>
</template>

<script>
  export default {
    name: 'hello-world'
  }
</script>

在上述示例中,我们在父组件中通过$attrs/$listeners将所有的props和自定义事件传递给了子组件,实现了跨级组件的通讯。在子组件中,我们通过v-bind和v-on绑定了父组件传递过来的数据和事件。

5. 非父子组件通讯

使用$emit/$on实现非父子组件通讯:

示例中包含三个组件,分别为A、B、C组件。A组件与B组件为父子组件,B组件与C组件为兄弟组件,A与C组件则为非父子组件。

A组件中的模板代码:

<template>
  <div>
    <my-son></my-son>
  </div>
</template>

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

  export default {
    name: 'MyParent',
    components: {
      MySon
    },
    methods: {
      sendMessage(msg) {
        this.$emit('send-message', msg);
      }
    }
  }
</script>

B组件中的模板代码:

<template>
  <div>
    <my-bro></my-bro>
  </div>
</template>

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

  export default {
    name: 'MySon',
    components: {
      MyBro
    },
    methods: {
      handleSendMessage(msg) {
        this.$emit('send-message', msg);
      }
    }
  }
</script>

C组件中的模板代码:

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

<script>
  export default {
    name: 'MyBro',
    data() {
      return {
        message: ''
      }
    },
    mounted() {
      this.$on('send-message', this.handleReceiveMessage);
    },
    methods: {
      handleReceiveMessage(msg) {
        this.message = msg;
      }
    }
  }
</script>

在上述示例中,我们在A组件中定义了一个sendMessage方法,并通过$emit方法向外发送一个名为'send-message'的自定义事件和一个字符串参数。接着,在B组件中,我们同样通过$emit方法向外发送一个名为'send-message'的自定义事件和一个字符串参数。在C组件中,我们通过mounted钩子函数注册了一个名为'send-message'的自定义事件,并在handleReceiveMessage方法中接收和处理传递过来的数据。

使用事件总线实现非父子组件通讯:

为了实现事件总线,在Vue实例中添加一个空的Vue实例作为事件中心。

// 使用事件总线
const bus = new Vue();

// 在Vue实例中添加事件中心
new Vue({
  el: '#app',
  components: { App },
  template: '<App/>',
  data: {
    bus: bus
  }
})

代码说明:

在Vue实例外创建一个空的Vue实例,作为事件总线。在Vue实例中,将事件中心(bus)作为data传递给组件。在组件中可以通过this.$root.bus的方式来访问事件总线。

在组件中,使用事件总线进行通讯:

// 在组件中使用事件总线
this.$root.bus.$emit('send-message', 'Non-parent/child component communicates via event bus');

在组件中,我们可以通过this.$root.bus来访问事件总线并使用$emit方法向外发送一个名为'send-message'的自定义事件和一个字符串参数。

另外,接收事件也可以使用事件总线:

// 接收事件
this.$root.bus.$on('send-message', msg => {
  console.log(msg);
});

在组件中,我们可以通过this.$root.bus来访问事件总线并使用$on方法监听名为'send-message'的自定义事件。事件触发后,会执行定义的回调函数并接收到传递过来的数据,最后将数据打印到控制台上。

以上就是“Vue的组件通讯方法总结大全”的详细攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue的组件通讯方法总结大全 - Python技术站

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

相关文章

  • mpvue开发音频类小程序踩坑和建议详解

    mpvue开发音频类小程序踩坑和建议详解 1. 前言 mpvue 是一个基于 Vue.js 核心的高性能小程序开发框架。它传承了 Vue.js 的语法风格和开发习惯,在小程序开发中尽可能的减少了学习成本和上手难度。同时,mpvue 利用 Webpack 和 Vue.js 的自身特性,将组件和业务逻辑代码进行分离抽离,维护更加方便易用。 在开发小程序中,音频类…

    Vue 2023年5月27日
    00
  • Vue动态组件与内置组件浅析讲解

    Vue动态组件与内置组件浅析讲解 什么是Vue动态组件 Vue动态组件是一种结合动态组件和组件的功能,允许我们在运行时通过提供一个名称来动态切换组件。 我们可以使用Vue的内置动态组件标签\<component>,该标签可以通过一个特殊的is属性动态绑定组件。 例如: <component :is="currentComponen…

    Vue 2023年5月28日
    00
  • JavaScript实现单击下拉框选择直接跳转页面的方法

    下面是JavaScript实现单击下拉框选择直接跳转页面的方法的完整攻略: 1. 使用下拉框 我们可以使用HTML中的<select>标签创建一个下拉框,并用<option>标签添加选项。然后,我们需要为选中的选项添加一个事件,以便在单击时跳转到相关的页面。 以下是一个示例,演示如何使用下拉框实现单击下拉框选择直接跳转页面的方法: &…

    Vue 2023年5月28日
    00
  • 详解vue 路由跳转四种方式 (带参数)

    详解vue 路由跳转四种方式 (带参数) 在vue中,路由跳转是非常常见的操作,我们可以使用vue-router提供的四种方式进行路由跳转。本文将详细讲解这四种方式,并提供带参数的示例。 1. router.push 使用router.push可以向路由添加一个新的历史记录,这意味着用户可以使用浏览器的后退按钮回到之前的页面。这种方式常用于页面跳转或者在当前…

    Vue 2023年5月28日
    00
  • vue中data里面的数据相互使用方式

    Vue是一款流行的前端框架。data对象是Vue组件中的一个非常重要的属性。在Vue组件中,我们可以定义数据、方法、计算属性等。data对象中定义的数据可以在Vue实例的模板中使用,也可以在Vue组件中的方法或计算属性中进行操作。 下面是在Vue中使用data里面的数据的几种方式: 直接使用 最基本的使用方法,就是在Vue实例或组件中使用this关键字直接访…

    Vue 2023年5月28日
    00
  • JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析

    下面是详细讲解“JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析”的完整攻略。 1. 需求分析 我们的目标是实现在HTML页面中自定义一个上传图片按钮,并且在用户选择上传图片后,能够将图片显示在页面上。 需要具备以下功能: 自定义上传图片按钮 选择图片文件后上传并显示图片 将图片文件转换为base64编码 2. HTML布局 首先,我们需要在HT…

    Vue 2023年5月28日
    00
  • 详解使用webpack打包编写一个vue-toast插件

    一、简介 本文主要讲解如何使用 webpack 打包编写一个 Vue.js 的 toast 插件。我们将通过以下步骤创建一个简单的 Vue.js toast 插件: 创建项目并安装必要的依赖 编写插件代码 配置 webpack 打包 将插件添加到 Vue.js 项目中进行使用 二、项目创建和依赖安装 我们首先使用 npm 初始化一个新项目: npm init…

    Vue 2023年5月28日
    00
  • 解决Nginx 配置 proxy_pass 后 返回404问题

    当使用Nginx进行反向代理时,有时会遇到proxy_pass指向的地址返回404的问题。这个问题可能有很多原因,以下提供一些可能解决问题的方法。 确认proxy_pass指向的地址是否正确 首先确保proxy_pass指向的地址是正确的。可以尝试用curl等工具进行测试,以确认proxy_pass地址的正确性。如下面的示例: location /api/ …

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