Vue组件通信模式

概述

在Vue.js中,有几种我们能用的内部组件通信的方法。一般的属性和事件对于大多数场景来说已经够用了,但是除此之外,还有其他可用的方法。

属性和事件

当然,一般的通信方法用到了属性和事件。这种常用的模式是组件中一种强大的通信方式,它不用在相关的组件上引入任何依赖和限制。

属性

属性允许你传递任意的数据类型到一个子组件中,并且允许你控制组件接收何种类型的数据。属性的更新也是响应式的,这使得无论任何时候,父组件的数据改变,子组件就会更新。

模板用法:

123
<my-component v-bind:prop1="parentValue"></my-component>

<my-component :prop1="parentValue"></my-component>

事件

事件提供了一种子组件通知父组件做出改变的方式。

模板用法:

123
<my-component v-on:myEvent="parentHandler"></my-component>

<my-component @myEvent="parentHandler"></my-component>

触发一个事件:

12345678
// ...export default {  methods: {    fireEvent() {      this.$emit('myEvent', eventValueOne, eventValueTwo);    }  }}

Additionally, you can create global event buses to pass events anywhere in your app. We’ve got an article on that.

此外,你还可以创建一个全局事件总线来在任意位置传递事件。这里有一篇相关的文章

组合使用

使用v-model可以结合属性和事件以实现双向绑定。这经常用于输入组件中。v-model假定了值属性和输入事件,但是这个可以根据自身需要来设置。

模板用法:

1
<my-component v-model="prop1"></my-component>

一个v-model兼容的组件

12345678910111213141516171819
<template>  <div>    <input type="text" :value="value" @input="triggerEvent"/>  </div></templ 大专栏  Vue组件通信模式ate>

<script>  export default {    props: {      value: String    },

    methods: {      triggerEvent(event) {        this.$emit('input', event.target.value);      }    }  }</script>

当你需要在组件之间做非常多的各种各样的数据传递和消息通讯的时候,可以用这种方式。

Provide / Inject

provide/inject机制是Vue一个比较新的特性。它可以选择性的暴露祖先组件的数据或者方法到其所有的后代中。由于provide/inject自身不是响应式的,它可以用来传递响应式对象。

对于开发应用而言,provice/inject也许不是一个好的选择,但是当写一个完整的自定义渲染组件库时,它就十分顺手了。

祖先组件:

1234567
const SomethingAllDescendantsNeed = 'Air, probably.';

export default {  provide: {    SomethingAllDescendantsNeed  }}

后代组件

1234567
export default {  inject: ['SomethingAllDescendantsNeed'],

  mounted() {    console.log(this.SomethingAllDescendantsNeed);  }}

模板使用:

123456789
<ancestor-component>  <div>    <descendant-component>      <p>        <descendant-component></descendant-component>      </p>    </descendant-component>  </div></ancestor-component>

(所有的后代组件,无论在组件树中有多深,都能获取SomethingAllDescendantsNeeds)

当子组件需要使用一个组件树只初始化一次时创建的实例时(比如另一个库或者一个事件总线时)。

直接访问

警告:危险

如果你真的,真的,真的需要直接访问一个父组件或者子组件,你可以使用所有组件都有的this.$parent和this$.children属性,它们拥有父组件和子组件所有的权限。但这个做法,是非常极其一定以及肯定地可怕的想法。如果你发现处于某种需要这么做的场景,那99.99958%的概率你在什么地方做错了,而且应该重构。

什么时候用这种方法呢:别用,就是,别用。

为什么别用呢?因为你在父子组件的实现和结构上直接引入了耦合,使组件的可扩展性几乎极大地降低。

参考

  1. Vue.js Component Communication Patterns - Joshua Bemenderfer

原文地址:https://www.cnblogs.com/liuzhongrong/p/12289254.html

时间: 2024-10-07 18:22:42

Vue组件通信模式的相关文章

Vue 组件通信

今天学习了,vue组件通信本篇随笔主要对今天的学习成果进行总结.有什么不对的地方还望谅解! 首先,Vue的核心即组件化开发,所以组件通信就显得十分重要. 组件通讯包括:父子组件间的通信和兄弟组件间的通信. 1.子组件获取父组件中数据间: var Child={ template:"#child", props:['mes'], data:function(){ return { data:this.$props.mes, //调用该子组件 props 中的对应属性的属性值: } } 通

vue组件通信的几种方式

最近用vue开发项目,记录一下vue组件间通信几种方式 第一种,父子组件通信 一.父组件向子组件传值 1.创建子组件,在src/components/文件夹下新建一个Child.vue 2.Child.vue的中创建props,然后创建一个名为message的属性 child.png 3.在App.vue中注册Child组件,并在template中加入child标签,标签中添加message属性并赋值 App2.png 4.保存修改的文件,查看浏览器 browser.png 5.我们依然可以对m

vue组件通信

1.子组件如何快速改变父组件中传过来的值(通过引用传递的方式给子组件,子组件可以直接改变对象中的属性) // App.vue <template> <div> <News :a-msg="msg" :out-data="outData"></News> {{msg}} <h3>{{outData.a}}</h3> </div> </template> <script

vue组件通信传值——Vuex

一.Vuex介绍 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. Vuex 也集成到 Vue 的官方调试工具devtools extension,提供了诸如零配置的 time-tavel 调试.状态快照导入导出等高级调试功能. 1.状态管理模式 一个简单的 Vue 计数应用范例如下所示: new Vue({ // state data () { return { count: 0 } }

vue组件通信(props,$emit,$attrs,$listeners)

朝颜陌 vue基础----组件通信(props,$emit,$attrs,$listeners) 一.父传子,子传孙 1. props 1>在父组件中通过子组件自定义的标签属性来传递数据. 2>在子组件中通过props声明希望用到的数据 1 <body> 2 <div id="app"> 3 <my-father :msg1="msg" a="10" :b="20" @click1=&

【Android翻译】组件通信模式

目标:避免紧耦合 本文对原文进行了精简 原文链接:Communication patterns for application components 紧耦合 组件之间相互持有引用,以及直接调用方法.在下面的代码中,MenuFragment持有MagazineActivity的直接引用,因此, MenuFragment 就与 MagazineActivity紧耦合了. 一旦没有了MagazineActivity,就无法工作了. // 紧耦合示例 class MenuFragment extends

Vue 组件通信(组件间通信)

1.中央事件总线bus <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <title>Vue</title> </head> <body> <div id="app"> <p>{{message}}</p> <my-compone

Vue组件通信之非父子组件传值

前言: 如果想要了解非父子关系的组件传值,最好是在了解父传子和子传父的基础上在来了解非父子传值可能会有更透彻的思路. 因为非父子传值是通过定义事件总线来代理实现父传子+子传父从而实现的传值方式. 这是我总结的父子传值相关的知识,可供参考: https://www.cnblogs.com/ViavaCos/p/11712131.html 然后大概回顾一下父子传值的过程: 根据上述信息可知,如果两个组件需要传递值那么需要这两个组件之间是父子关系才能传递数据. 那么如果有这样一个组件,既可以帮你传递数

VUE组件通信(父传子)

首先把父组件要传输的数据用自定义属性绑定在标签上 <father :father_data=' data '></father> 在子组件中用prpos接收 const childcomponent = { template:'<child>{{son_data}}</child>', props:[' father_data'], //props['属性名'] (在父组件中用来绑定数据的属性名) data(){ return{ //用来接收数据的变量 so