一起来学习Vue的组件间通信方式

yizhihongxing

一起来学习Vue的组件间通信方式

在Vue开发中,组件是进行页面构建的基本单元。不同的组件之间经常需要进行通信,以达到共同完成某个任务的目的。本文将详细讲解Vue的组件间通信方式。

props 和 $emit

Vue的组件实例只能向下传递数据。也就是说,顶层组件可以将数据传递到其子组件,子组件可以将数据传递到孙子组件,而孙子组件则不能直接向其父组件传递数据。这时候,可以利用组件的props和$emit属性来完成父子组件之间的通信。

props

props是用于父组件向子组件传递数据的一种机制。通过在子组件中定义props属性,从而实现对父组件传递的数据的限制和验证。

在父组件中的使用方法如下:

<template>
  <child-component :propName="propValue"></child-component>
</template>

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

export default {
  name: 'ParentComponent',
  components: {
    ChildComponent
  },
  data() {
    return {
      propValue: 'hello world'
    }
  }
}
</script>

在子组件中的使用方法如下:

<template>
  <div>{{ propName }}</div>
</template>

<script>
export default {
  name: 'ChildComponent',
  props: {
    propName: {
      type: String,
      required: true
    }
  }
}
</script>

在子组件的props属性中,定义propName属性,并且指定其类型为字符串类型,required为true时表示该属性必须有父组件传递值,否则会抛出警告。

$emit

$emit是用于子组件向父组件传递事件的一种机制。通过在子组件中定义事件,并通过$emit方法触发该事件,从而实现从子组件向父组件传递数据。

在子组件中定义事件的方法如下:

<template>
  <button @click="onClick">Submit</button>
</template>

<script>
export default {
  name: 'ChildComponent',
  methods: {
    onClick() {
      this.$emit('eventName', 'hello world');
    }
  }
}
</script>

在父组件中监听子组件的事件的方法如下:

<template>
  <child-component @eventName="onEvent"></child-component>
</template>

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

export default {
  name: 'ParentComponent',
  components: {
    ChildComponent
  },
  methods: {
    onEvent(data) {
      console.log(data); // 输出hello world
    }
  }
}
</script>

$parent 和 $children

$parent和$children是Vue提供的两种不太优雅的组件通信方式。它们分别表示一个组件的父组件和子组件列表。这种方式的缺点是它增加了组件之间的耦合性,而且不够灵活,但在一些特定情况下可以使用。

$parent

$parent返回当前组件实例的父级实例,通过其可以直接访问父级组件的属性和方法。

<template>
  <div>{{ parentValue }}</div>
</template>

<script>
export default {
  name: 'ChildComponent',
  computed: {
    parentValue() {
      return this.$parent.parentValue;
    }
  }
}
</script>

在上面的例子中,子组件通过$parent访问父组件的属性parentValue。

$children

$children返回当前组件实例的所有子级实例的数组。

<template>
  <ul>
    <li v-for="item in children">{{ item.name }}</li>
  </ul>
</template>

<script>
export default {
  name: 'ParentComponent',
  mounted() {
    console.log(this.$children);
  },
  computed: {
    children() {
      return this.$children.filter(child => child.name === 'ChildComponent');
    }
  }
}
</script>

在上面的例子中,父组件通过$children属性获取其所有子组件的实例,并通过过滤,只获取名字为ChildComponent的子组件实例,从而实现对符合特定条件的组件的访问。

实例与事件总线

实例和事件总线可以被视为两种相似的组件通信方式。它们都可以实现不同组件之间的通信,但它们的具体实现方式有所不同。

实例

在Vue的组件中,可以使用Vue.extend方法来创建一个组件的实例,通过直接访问该实例的属性,完成对该组件实例的操作。不同的组件实例之间可以通过访问全局变量window实现互相之间的通信。

<template>
  <div>{{ instanceValue }}</div>
</template>

<script>
import Vue from 'vue';

export default {
  name: 'ChildComponent',
  mounted() {
    const instance = new Vue({
      data() {
        return {
          instanceValue: 'hello world from another instance'
        }
      }
    });

    console.log(instance.instanceValue); // 输出hello world from another instance
  }
}
</script>

在上面的例子中,子组件中创建了一个新的Vue实例,在该实例中维护一个名为instanceValue的属性。并在子组件mounted钩子函数中访问该实例的属性instanceValue,并输出其值。

事件总线

事件总线是Vue中的一种广播机制,也叫做事件中心。通过在一个Vue实例上注册事件,从而让不同的组件实例进行通信。

// event-bus.js

import Vue from 'vue';

const eventBus = new Vue();

export default eventBus;

在上面的代码中,通过创建一个新的Vue实例,来实现事件总线。

在需要使用事件总线的组件中,只需要导入事件总线,并注册事件即可。

<template>
  <div>{{ eventBusValue }}</div>
</template>

<script>
import eventBus from './event-bus';

export default {
  name: 'ChildComponent',
  data() {
    return {
      eventBusValue: ''
    }
  },
  created() {
    eventBus.$on('eventName', data => {
      this.eventBusValue = data;
    });
  }
}
</script>

在上面的例子中,子组件通过在事件总线中注册事件eventName,来监听来自不同组件的事件,并通过回调函数,获取事件传递的数据,使用该数据更新组件中的eventBusValue属性。

在需要触发事件的组件中,只需要在Vue实例上触发事件即可。

<template>
  <button @click="onClick">Submit</button>
</template>

<script>
import eventBus from './event-bus';

export default {
  name: 'ChildComponent',
  methods: {
    onClick() {
      eventBus.$emit('eventName', 'hello world');
    }
  }
}
</script>

在上面的例子中,子组件通过$emit方法,触发名为eventName的事件,并传递了字符串'hello world'给注册了该事件的子组件。

结语

本文详细讲解了Vue的组件间通信方式,包括props和$emit、$parent和$children、实例与事件总线。在实际开发中,需要根据具体的情况,选择合适的方式进行通信。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一起来学习Vue的组件间通信方式 - Python技术站

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

相关文章

  • 在vue项目中配置你自己的启动命令和打包命令方式

    下面我为你详细讲解在Vue项目中如何配置自己的启动命令和打包命令。 配置启动命令 在Vue项目中,默认的启动命令为npm run serve。如果我们要配置自己的启动命令,可以按照以下步骤进行: 打开项目根目录下的package.json文件,在scripts节点中添加自己的启动命令,如下所示: "scripts": { "st…

    Vue 2023年5月28日
    00
  • vue项目实现文件下载进度条功能

    下面是“vue项目实现文件下载进度条功能”的完整攻略: 服务端实现文件下载接口 首先,在服务器端需要实现一个文件下载的接口,将需要下载的文件流返回给客户端。根据不同的后端语言和框架,具体实现会有所差异。这里以 Node.js 和 Express 框架为例,示例如下: // 下载文件接口 app.get(‘/download’, (req, res) =&gt…

    Vue 2023年5月28日
    00
  • Vue超详细讲解重试机制示例

    Vue超详细讲解重试机制示例 介绍 在实际开发中,我们经常遇到需要重试某个请求的情况,例如网络不稳定或请求失败等情况。Vue提供了一个非常方便易用的重试机制,以解决这个问题。 在本篇文章中,我们将会探讨如何使用Vue的重试机制,并提供两个示例帮助理解。 Vue的重试机制 Vue的重试机制是通过vue-resource库中的retry方法实现的。retry方法…

    Vue 2023年5月28日
    00
  • vue实现虚拟列表组件解决长列表性能问题

    Vue是一个流行的JavaScript框架,其易于使用和高度灵活的特性使得在前端开发中广泛应用。但是在处理长列表时,用Vue来渲染数据容易导致页面性能下降,尤其是在移动浏览器中。为了提高Vue性能,在Vue官方文档中提供了一种解决长列表性能问题的机制,那就是使用算法实现虚拟列表,从而避免渲染大量无意义数据。本文将详细介绍如何使用Vue实现虚拟列表组件,包括以…

    Vue 2023年5月27日
    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 项目中遇到的跨域问题及解决方法(后台php)

    下面给出解决Vue项目中跨域问题的攻略。 1. 跨域问题的背景 在Vue项目中,由于前端代码和后端接口的部署位置不同,涉及到跨域访问的问题。如果没有任何处理,就会出现浏览器的同源策略限制,无法访问到后端接口。因此,需要对跨域问题进行处理。 2. 解决跨域问题的方法 2.1. 后端设置允许跨域访问 后端通过设置http响应头的内容,告知浏览器允许Vue项目的跨…

    Vue 2023年5月28日
    00
  • Vue过滤器filters的用法及时间戳转换问题

    让我来详细讲解一下“Vue过滤器filters的用法及时间戳转换问题”的完整攻略。 什么是Vue过滤器filters? Vue过滤器filters是一种在模板中使用的文本格式化工具,用于将数据转换成所需的格式,比如将文本全部转换为大写、将数字按照指定的小数位数四舍五入等等。Vue过滤器通常被放在Mustache插值的后面,由管道符号(|)连接,如下: {{ …

    Vue 2023年5月28日
    00
  • 巧用Vue.js+Vuex制作专门收藏微信公众号的app

    下面我来详细讲解“巧用Vue.js+Vuex制作专门收藏微信公众号的app”的完整攻略。 1. 搭建Vue.js项目 首先需要搭建一个基于Vue.js的项目。可以使用Vue CLI来快速生成一个基础项目,命令如下: vue create wechat-collect 这个命令会创建一个名为wechat-collect的项目,并自动添加Vue.js所需要的基础…

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