一起来学习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渲染大量数据时卡顿卡死解决方法

    对于Vue渲染大量数据时出现卡顿和卡死的问题,有以下几种解决方法: 1. 利用vue的v-for指令渲染列表时使用分页 对于要渲染大量数据的列表,我们可以通过分页的方式一次渲染一定量的数据,而不是一次性全部渲染,可以有效增强浏览器的性能。这里提供一个简单的分页示例: <template> <div> <ul> <li…

    Vue 2023年5月28日
    00
  • Vue项目部署上线全过程记录(保姆级教程)

    非常感谢您对Vue项目上线过程的关注。以下是我整理的“Vue项目部署上线全过程记录(保姆级教程)”的详细攻略。 确认服务器环境在开始之前,请确保您已经购买了云服务器,在服务器上安装好操作系统和需要的软件环境。推荐使用Linux系统,并保证服务器具备如下配置: 操作系统:CentOS 7/Ubuntu 14.04及以上版本; CPU:1核及以上; 内存:2GB…

    Vue 2023年5月28日
    00
  • 关于vue属性使用和不使用冒号的区别说明

    关于Vue属性的使用和不使用冒号的区别,主要涉及Vue的模板语法和组件属性传递。在Vue中,通常使用“v-bind”指令和冒号来将数据绑定到HTML元素的属性上。而不使用冒号,则意味着传递一个具体字符串值或变量名。 Vue属性使用冒号的区别: 数据绑定 在Vue中使用冒号可以实现数据绑定,让模板中的HTML元素及其对应的属性随数据变化而动态更新。这个特性可以…

    Vue 2023年5月27日
    00
  • 关于vue2响应式缺陷的问题

    问题描述: 在Vue2中使用响应式数据,如果一个对象的属性不存在,那么对于该属性的修改并不会触发视图的更新。 解决方法: 1.使用Vue.set()方法手动触发更新 Vue.set()是Vue提供的一种修改响应式对象的方法,可以更新对象的属性并触发视图更新。使用方法如下: Vue.set(vm.someObject, ‘key’, value); 其中,vm…

    Vue 2023年5月29日
    00
  • 在vue中实现简单页面逆传值的方法

    下面是在Vue中实现简单页面逆传值的方法的攻略。首先,我们需要明确以下两个概念: 父组件:组件树中调用子组件的那个组件。 子组件:组件树中被调用的那个组件。 实现逆传值的基本思路是,子组件将要传递的值通过事件的形式传递给父组件,从而实现逆传。具体实现步骤如下: 1. 通过emit事件传递值 在子组件中需要创建一个按钮,通过该按钮触发事件。这里我们假设子组件中…

    Vue 2023年5月28日
    00
  • vue数据字典取键值方式

    当我们使用Vue来进行前端开发时,经常会用到数据字典。而获取数据字典的键值可以通过以下两种方法来实现。 方法一:使用计算属性 计算属性是Vue提供的一个能够对数据进行监听并保持响应式的一个特性。可以通过这个特性来进行数据字典的取值。 首先,我们需要定义一个数据字典的对象,例如: const dict = { 1: ‘男’, 2: ‘女’ } 然后,在使用该数…

    Vue 2023年5月29日
    00
  • 仿照Element-ui实现一个简易的$message方法

    这是一个完整的攻略,步骤如下: 步骤一:创建组件 首先,我们需要创建一个Vue组件来实现这个消息框功能。 我们可以在src/components目录下创建一个messageBox.vue文件,并在其中写入以下代码: <template> <div v-show="visible" :class="[‘messa…

    Vue 2023年5月29日
    00
  • vue3.0 vue.config.js 配置基础的路径问题

    配置Vue.js项目的构建后的静态文件的发布路径是非常必要的。在Vue.js 3.0中,配置静态资源的发布路径的方式有所改变。本文将提供Vue.js 3.0中的vue.config.js配置多个基础路径的示例说明。 创建Vue.js 3.0项目 使用Vue CLI 3创建Vue.js 3.0项目: $ vue create my-project vue.co…

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