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 相关文章推荐
javaScript call 函数的用法说明
Apr 09 Javascript
Jquery下EasyUI组件中的DataGrid结果集清空方法
Jan 06 Javascript
javascript实现在下拉列表中显示多级树形菜单的方法
Aug 12 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
Aug 25 Javascript
详解为Angular.js内置$http服务添加拦截器的方法
Dec 20 Javascript
vue事件修饰符和按键修饰符用法总结
Jul 25 Javascript
解决vuejs 使用value in list 循环遍历数组出现警告的问题
Sep 26 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
Jan 06 Javascript
vscode下vue项目中eslint的使用方法
Jan 13 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
Feb 28 Javascript
如何基于vue-cli3.0构建功能完善的移动端架子
Apr 24 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
Mar 02 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
BBS(php &amp; mysql)完整版(三)
2006/10/09 PHP
php版微信公众平台入门教程之开发者认证的方法
2016/09/26 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
2017/03/05 PHP
javascript提取URL的搜索字符串中的参数(自定义函数实现)
2013/01/22 Javascript
关于JS管理作用域的问题
2013/04/10 Javascript
利用JavaScript实现新闻滚动效果(实例代码)
2013/11/27 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
Bootstrap实现的表格合并单元格示例
2018/02/06 Javascript
layer.alert回调函数执行关闭弹窗的实例
2019/09/11 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
2019/10/28 Javascript
vue data对象重新赋值无效(未更改)的解决方式
2020/07/24 Javascript
VUE使用 wx-open-launch-app 组件开发微信打开APP功能
2020/08/11 Javascript
vue element el-transfer增加拖拽功能
2021/01/15 Vue.js
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
python实现的简单文本类游戏实例
2015/04/28 Python
Python3实现抓取javascript动态生成的html网页功能示例
2017/08/22 Python
Python实现求笛卡尔乘积的方法
2017/09/16 Python
关于Python作用域自学总结
2019/06/10 Python
基于Python的图像数据增强Data Augmentation解析
2019/08/13 Python
Python中顺序表原理与实现方法详解
2019/12/03 Python
keras K.function获取某层的输出操作
2020/06/29 Python
Keras预训练的ImageNet模型实现分类操作
2020/07/07 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
html5自动播放mov格式视频的实例代码
2020/01/14 HTML / CSS
Carter’s OshKosh加拿大:购买婴幼儿服装和童装
2018/11/27 全球购物
请描述一下”is a”关系和”has a”关系
2015/02/03 面试题
2014年党课学习材料
2014/05/11 职场文书
群众路线专项整治工作情况报告
2014/10/28 职场文书
2015年个人自我剖析材料
2014/12/29 职场文书
初中教师德育工作总结2015
2015/05/12 职场文书
2015年房产销售工作总结范文
2015/05/22 职场文书
2019最新公司租房合同(例文)
2019/07/18 职场文书
vue-cropper组件实现图片切割上传
2021/05/27 Vue.js
SQL实战演练之网上商城数据库商品类别数据操作
2021/10/24 MySQL