vue中通过使用$attrs实现组件之间的数据传递功能


Posted in Javascript onSeptember 01, 2019

组件之间传递数据的方式有很多种,之所以有这么多种方式,是为了满足在不同场景不同条件下的使用。

一般有三种方式:

props
vuex
Vue Event Bus

本文介绍的是使用$attrs的方式。

这是$attrs的官网api https://cn.vuejs.org/v2/api/#vm-attrs

这个api是在2.4版本中添加的,那么为什么要添加这个特性呢?
看看官网是怎么解释的

包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 ( class  和  style  除外)。

当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 ( class  和  style  除外),

并且可以通过  v-bind="$attrs"  传入内部组件——在创建高级别的组件时非常有用。

第一次看的话真是不容易看懂,这里是既包含用法又隐晦的说明了为什么使用,还是我来解释一下吧。

意思就是: $attrs 可以收集父组件中的所有传过来的属性除了那些在组件中没有通过  props 定义的。

引申说明一下,如果组件的嵌套层级有点深但又不那么深,比如三层。

我们如果使用props的话,最里面的组件想要获取最外层组件的数据,就要通过中间的组件的props来传递,

但是这个props对于中间的这个组件没啥用处,它就是做了一个桥梁而已。我们平时写代码时候其实经常碰到

这种场景,写起来有时候觉得挺烦的。所以就有了这个$attrs来帮助我们,不必在中间组件中写props就可以让

最里面的组件拿到最外面组件传进来的数据。

那么,具体怎么使用呢?

看看下面的代码吧,很简单就懂了

准备三个组件

vue中通过使用$attrs实现组件之间的数据传递功能 

里面的代码如下

//grandfather
<template>
 <div style="background: blue">
  father in grandfather
  <father :father-age="50" :child-time="`${time}`"></father>
 </div>
</template>
<script>
import father from './father'
export default {
 components: {
  father
 },
 data () {
  return {
   time: new Date().getTime()
  }
 }
}
</script>

//father
<template>
 <div style="background: red">
  child in father
  <div>
   <span>father age:</span>{{fatherAge}}
  </div>
  <child v-bind="$attrs"></child>
 </div>
</template>
<script>
import child from './child'
export default {
 components: {
  child
 },
 props: {
  fatherAge: {
   type: Number,
   default: 0
  }
 }
}
</script>

//child<template>
 <div style="background: green">
  <div>child</div>
  <div>time: {{childTime}}</div>
 </div>
</template>
<script>
export default {
 props: {
  childTime: {
   type: String,
   default: ''
  }
 }
}
</script>

需要从爷爷组件直接传给子组件的数据,不要在父组件中的props中声明。

在子组件上通过v-bind的方式就可以把父组件中未声明而子组件需要从爷爷组件中获取的数据传给子组件。

当然,子组件props肯定是要声明的,还是props的用法啦。

总结

以上所述是小编给大家介绍的vue中通过使用$attrs实现组件之间的数据传递功能,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
利用JS重写Cognos右键菜单的实现代码
Apr 11 Javascript
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
Sep 22 Javascript
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
Jan 15 Javascript
jquery mobile事件多次绑定示例代码
Sep 13 Javascript
浅析js中的浮点型运算问题
Jan 06 Javascript
JavaScript中遍历对象的property的3种方法介绍
Dec 30 Javascript
js添加绑定事件的方法
May 15 Javascript
iframe中使用jquery进行查找的方法【案例分析】
Jun 17 Javascript
Javascript 数组去重的方法(四种)详解及实例代码
Nov 24 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
Oct 16 Javascript
JavaScript遍历数组和对象的元素简单操作示例
Jul 09 Javascript
基于vue+echarts 数据可视化大屏展示的方法示例
Mar 09 Javascript
Vue使用mixin分发组件的可复用功能
Sep 01 #Javascript
JavaScript页面加载事件实例讲解
Sep 01 #Javascript
Node.js安装详细步骤教程(Windows版)详解
Sep 01 #Javascript
vue组件命名和props命名代码详解
Sep 01 #Javascript
Vue-CLI项目中路由传参的方式详解
Sep 01 #Javascript
vue实现输入框的模糊查询的示例代码(节流函数的应用场景)
Sep 01 #Javascript
vue中的v-if和v-show的区别详解
Sep 01 #Javascript
You might like
PHP实现清除wordpress里恶意代码
2015/10/21 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
Yii框架页面渲染操作实例详解
2019/07/19 PHP
如何解决PHP获取不到SESSION信息之一般情况
2019/10/10 PHP
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.3
2008/03/22 Javascript
JQuery中$之选择器用法介绍
2011/04/05 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
JavaScript中的类数组对象介绍
2014/12/30 Javascript
Javascript基础教程之比较操作符
2015/01/18 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
2015/02/20 Javascript
JS 对象属性相关(检查属性、枚举属性等)
2015/04/05 Javascript
jquery插件unobtrusive实现片段式加载
2015/06/15 Javascript
js+html5实现可在手机上玩的拼图游戏
2015/07/17 Javascript
AngularJS+bootstrap实现动态选择商品功能示例
2017/05/17 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
node.js读取Excel数据(下载图片)的方法示例
2018/08/02 Javascript
Vue+webpack实现懒加载过程解析
2020/02/17 Javascript
[55:03]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.20
2020/11/20 DOTA
python del()函数用法
2013/03/24 Python
Python读写文件方法总结
2015/06/09 Python
Python 爬虫的工具列表大全
2016/01/31 Python
django之使用celery-把耗时程序放到celery里面执行的方法
2019/07/12 Python
python虚拟环境完美部署教程
2019/08/06 Python
详解PyQt5信号与槽的几种高级玩法
2020/03/24 Python
详解HTML5 LocalStorage 本地存储
2016/12/23 HTML / CSS
如何在网站上添加谷歌定位信息
2016/04/16 HTML / CSS
Html5页面获取微信公众号的openid的方法
2020/05/12 HTML / CSS
意大利比基尼品牌:MISS BIKINI
2019/11/02 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
使用C#编写创建一个线程的代码
2013/01/22 面试题
JS原生实现轮播图的几种方法
2021/03/23 Javascript
高一政治教学反思
2014/01/28 职场文书
安全施工标语
2014/06/07 职场文书
大国崛起英国观后感
2015/06/02 职场文书
redis使用不当导致应用卡死bug的过程解析
2021/07/01 Redis