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

一起来学习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动态添加store、路由和国际化配置方式

    为了动态添加 store、路由和国际化配置,可以使用 Vue.js 提供的插件系统。下面是具体的步骤: 动态添加 store 首先,我们需要创建一个新的 store 模块。这可以通过在一个 JavaScript 文件中定义一个新模块来完成,如下所示: // myModule.js export default { state: { foo: ‘bar’ },…

    Vue 2023年5月29日
    00
  • Vuejs如何通过Axios请求数据

    接下来我会为你详细讲解Vue.js如何通过Axios请求数据的完整攻略,并提供两个示例以加深理解。 使用Axios在Vue.js中请求数据的步骤 要使用Axios在Vue.js中请求数据,需要按照以下步骤进行: 步骤1: 安装Axios 使用Axios前,需要先安装它。在终端中运行以下命令便可以安装Axios: npm install axios –sav…

    Vue 2023年5月28日
    00
  • vue项目环境搭建 启动 移植操作示例及目录结构分析

    下面就来详细讲解一下“vue项目环境搭建 启动 移植操作示例及目录结构分析”的攻略。 1. 环境搭建 在开始开发 Vue 项目之前,需要先搭建好相应的环境,具体步骤如下: 1.1 安装 Node.js 在 Node.js 官网下载最新版的 Node.js 后进行安装,这里不做过多介绍。 1.2 安装 Vue CLI Vue CLI 是 Vue 的脚手架工具,…

    Vue 2023年5月28日
    00
  • vue 输入电话号码自动按3-4-4分割功能的实现代码

    实现输入电话号码自动按照 3-4-4 的格式分割,可以通过 Vue 自定义指令实现。以下是具体步骤: 1. 创建自定义指令 在 Vue 中创建自定义指令可以通过 Vue.directive 方法实现。该方法有两个参数,第一个参数是指令名称,第二个参数是指令回调函数。 Vue.directive(‘phone’, { bind: function(el, bi…

    Vue 2023年5月27日
    00
  • webpack + vue 打包生成公共配置文件(域名) 方便动态修改

    要实现“webpack + vue 打包生成公共配置文件(域名) 方便动态修改”,可以参照以下步骤: 创建配置文件在项目根目录下创建一个config.js文件,用于存放公共配置信息,例如域名、API地址等。在文件中定义一个对象,包含需要的配置信息。示例代码如下: “`javascript// config.js module.exports = { dom…

    Vue 2023年5月28日
    00
  • vue中动态添加style样式的几种写法总结

    当我们在Vue中需要动态添加样式时,我们可以使用以下几种方法: 使用class绑定 Vue中可以使用:class或者:v-bind指令将一个变量与class属性绑定起来,这样我们可以通过改变变量的值来改变元素的class属性,从而改变样式。 <template> <div :class="{ ‘selected’: isSelec…

    Vue 2023年5月27日
    00
  • Vue 通过自定义指令回顾v-内置指令(小结)

    Vue 自定义指令可以实现新的 DOM 操作,以及对现有的指令功能扩充和封装。本文旨在回顾 Vue 内置指令以及介绍如何自定义指令。 Vue 内置指令小结 Vue 提供了多种内置指令,这里我们对这些指令进行一个小结。 v-model 可用于给表单元素绑定数据和更新数据。主要使用的表单元素有 input、textarea、select等。 示例: <in…

    Vue 2023年5月27日
    00
  • vue中的计算属性和侦听属性

    当我们在使用Vue.js开发Web应用时,有时我们需要根据某些状态进行计算,计算属性和侦听属性是Vue.js为我们提供的两种响应式的计算机制。本文将详细讲解vue中的计算属性和侦听属性的完整攻略。 计算属性 什么是计算属性 计算属性指的是在模板中使用时,通过计算属性函数的返回值来得到一个新的值,这个新的值能够自动触发页面重新渲染。 计算属性的用法 计算属性的…

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