Vue非父子组件传值「建议收藏」

Vue非父子组件传值「建议收藏」Vue非父子组件传值:事件总线$attrs/listeners

大家好,又见面了,我是你们的朋友全栈君。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本节紧接这上一篇,说说如何在非父子组件中进行组件之间的传值


一、非父子组件传值

(1)事件总线
(2)$attrs / listeners

二、事件总线

事件总线的原理就是:

创建一个公共的Js文件,让其专门负责传值。就像公共的交通工具bus,data可以乘坐这辆bus到达指定的站台(相应的组件)

那么首先要做的就是在我们的项目中创造这辆bus

1.闭门造车(创建公用JS文件)

首先得在城市中(src目录下)租块地(创建一个文件夹),放置这辆bus。
bus.js的创建十分简单,只要粘贴以下代码:

import Vue from 'vue';
export default new Vue;

当然造车的方法有很多种,笔者只想给你最便捷的一种。

2.上车

既然坐车就要刷卡,刷卡的方式也很简单,在需要传递数据的组件中引入bus.js

import bus from './bus.js'

之后bus出发,在该组件中发射事件,发射事件需要一个媒介,在本篇就用button的click事件触发:

<button @click="appmsg">bus传递data</button>

在methods中定义事件:

 methods:{ 
   
    appmsg(){ 
   
      bus.$emit('getonbus','App')
    }
  }

上车出发过程完成

3.下车

下车也要刷卡,方式相同,在需要接收数据的组件中引入bus.js

import bus from './bus.js'

在示例中提前定义了一个变量value

data(){ 
   
    return{ 
   
      value:"Home"
    }
  }

到站接收数据,在接收组件的mounted中接收,代码如下:

mounted(){ 
   
    bus.$on('getonbus', val => { 
   
      this.value = val
    })
  }

至此我们已经完成了数据的传输,我们来看看效果:
html代码:

<p>{ 
   { 
   value}}</p>

效果:
点击前:
在这里插入图片描述

点击后:
在这里插入图片描述
这确实是一个十分方便的方法,但是:
事件总线方式传递数据同时需要及时的移除事件监听,这对于初学者是个麻烦事,因此
换种方法往下看吧,哈哈

2.$attrs / listeners

这种传值方式主要是用于多级组件的传值,其实还是得保持一种“血脉联系”
例如爷爷组件给孙子组件传值,当然这借助简单的v-bind也是可以实现的,但是如果我们就是想跳过父组件就可以用这种方式;

在示例中的组件关系如下:Home(爷爷)>parent(父亲)>child(孩子)
在Home中定义数据,并传入parent:

<template>
  <div class="home">
    <p>{ 
   { 
   value}}</p>
    <parent :msga="a" :msgb="b" :msgc ="c"></parent>
  </div>
</template>

<script>
import parent from './parent.vue'
export default { 
   
  name: 'home',
  components: { 
   
    parent
  },
  data(){ 
   
    return{ 
   
      value:"Home",
      a:"aaa",
      b:"bbb",
      c:"ccc"
    }
  }
}
</script>

在父组件中需要定义一个v-bind

<template>
    <div>
        <child v-bind="$attrs"></child>
    </div>
</template>

在孙子组件中打印$attrs

mounted(){ 
   
            console.log(this.$attrs)
        }

我们来看打印台结果:
在这里插入图片描述
孙子得到了爷爷全部的数据,真正的隔代亲!
$listeners大家自己可以试试,爷爷会直接得到孙子发射的事件。
这种方法可以看成props / $emit的延续版,对比学习,效果更佳

VueX是笔者认为最稳定的非父子传值的方法,笔者也会单独写出文章详解

总结

本篇主要讲解了非父子传值的两种方法,深入浅出,让大家对vue传值有更好的理解。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145796.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Cassandra SizeTieredCompaction策略解析

    Cassandra SizeTieredCompaction策略解析

    2021年8月18日
    60
  • 服务器对cpu的性能要求比较高_服务器cpu家用缺点

    服务器对cpu的性能要求比较高_服务器cpu家用缺点如今各种大型游戏对我们的电脑性能的要求越来越高,很多用了三四年的老电脑已经带不动最新的3A巨作了,这时候大家就需要考虑更换电脑或者是升级配置了。假如选择升级配置,效果最显著的就要数更换CPU和显卡了,今天编者就来谈谈由于种种原因,性价比很低几款CPU,假如大家想要更换以下的几款CPU可要三思了。首先,编者不推荐买英特尔的第六、七代酷睿处理器,以i57500为例,散片价格在1200元左右,与同为四…

    2026年1月28日
    9
  • SpringBoot 源码编译「建议收藏」

    SpringBoot 源码编译「建议收藏」SpringBoot源码编译1、从GitHub上下载源码https://github.com/spring-projects/spring-boot/tree/2.1.x下载源码的下面有关于编译源码的介绍:SpringBoot官方建议使用./mvnwcleaninstall或者标准的mvncleaninstall命令来编译源代码,如果要使用标准的mvn命令的话…

    2022年6月11日
    26
  • winhttp 发送 get 请求「建议收藏」

    winhttp 发送 get 请求「建议收藏」由于微端要和服务器交互,而服务器又只有http协议的处理,所以需要用C++来模拟get或post请求。这是使用windowsapi来模拟get请求的,使用到的库有“winhttp”,头文件有“winhttp.h”,下面的代码来源于http://msdn.microsoft.com:12345678

    2022年7月27日
    9
  • 面试扫码登记怎做的_无面试官扫码记录

    面试扫码登记怎做的_无面试官扫码记录真实面试场景——扫码登录如何实现?理解三端关系是关键。

    2025年7月10日
    4
  • ue4地编教程_编绳方法

    ue4地编教程_编绳方法一、基本操作二、导入模型和贴图##(一)导入UE4设置:1、导入:2、导入设置##(二)从3DMAX出设置##(三)从Blender导出

    2022年9月26日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号