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+css在交互上的应用
Jul 18 Javascript
jQuery动画效果-slideUp slideDown上下滑动示例代码
Aug 28 Javascript
AngularJS基础 ng-init 指令简单示例
Aug 02 Javascript
详解AngularJS如何实现跨域请求
Aug 22 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
Jan 19 Javascript
vue模板语法-插值详解
Mar 06 Javascript
ReactJs实现树形结构的数据显示的组件的示例
Aug 18 Javascript
使用express来代理服务的方法
Jun 21 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
Feb 11 Javascript
5个你不知道的JavaScript字符串处理库(小结)
Jun 01 Javascript
JavaScript中遍历的十种方法总结
Dec 15 Javascript
Vue项目中如何封装axios(统一管理http请求)
May 02 Vue.js
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
如何使用脚本模仿登陆过程
2006/11/22 PHP
PHP支持多种格式图片上传(支持jpg、png、gif)
2011/11/03 PHP
深入php函数file_get_contents超时处理的方法详解
2013/06/03 PHP
CodeIgniter针对数据库的连接、配置及使用方法
2016/03/03 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
JavaScript中json对象和string对象之间相互转化
2012/12/26 Javascript
FireBug 调试JS入门教程 如何调试JS
2013/12/23 Javascript
首页图片漂浮效果示例代码
2014/06/05 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
2015/03/18 Javascript
jquery实现Li滚动时滚动条自动添加样式的方法
2015/08/10 Javascript
轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
2015/11/30 Javascript
详解JavaScript树结构
2017/01/09 Javascript
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
2017/05/20 jQuery
详解如何使用webpack打包Vue工程
2017/05/27 Javascript
JavaScript递归算法生成树形菜单
2017/08/15 Javascript
JavaScript实现的斑马线表格效果【隔行变色】
2017/09/18 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
2018/02/26 Javascript
解决jquery的ajax调取后端数据成功却渲染失败的问题
2018/08/08 jQuery
Vue 之孙组件向爷组件通信的实现
2019/04/23 Javascript
Vue实现附件上传功能
2020/05/28 Javascript
对vue生命周期的深入理解
2020/12/03 Vue.js
python中的sort方法使用详解
2014/07/25 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
2018/06/22 Python
python tkinter canvas 显示图片的示例
2019/06/13 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
2020/03/30 Python
Python装饰器如何实现修复过程解析
2020/09/05 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
HTML5有哪些新特征
2015/12/01 HTML / CSS
捷克家居装饰及图书音像购物网站:Velký košík
2018/04/16 全球购物
IFCHIC台湾:欧美国际设计师品牌
2019/05/18 全球购物
公司市场部岗位职责
2013/12/02 职场文书
涉及车辆房产分割的离婚协议书范文
2014/10/12 职场文书
幼儿园国庆节活动总结
2015/03/23 职场文书
上市公司财务总监岗位职责
2015/04/03 职场文书
Ruby处理YAML和json数据
2022/04/18 Ruby
利用nginx搭建RTMP视频点播、直播、HLS服务器
2022/05/25 Servers