浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用


Posted in Javascript onMarch 08, 2020

vue父子组件之间的传值我们都知道使用props和emit,但是祖孙之间的传值在以前,我们都需要子辈作为中间人,当祖辈有值要传递给孙辈时,需要子辈作为中间人把值传递给孙辈,当孙辈想要改变祖辈的值时,需要先emit子辈的方法,然后子辈再emit父辈的方法从而改变祖辈的值,如果是多级组件嵌套的话,那么祖孙辈之间传值,就会变得非常的繁琐,为了解决这个需求,vue2.4版本产生了$attrs,$listeners,inheritAttrs这三个属性。

vm.$attrs

官方API

vm.$attrs

2.4.0 新增,类型:{ [key: string]: string },只读

详细:

包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind="$attrs" 传入内部组件——在创建高级别的组件时非常有用。

使用介绍

从官方介绍我们可以得出 $attrs 应用于父子传值场景下,子组件通过 $attrs 可以访问父组件传过来的所有属性,但需要注意的是如果父组件所传的属性中有在子组件 props 中有过声明,那么该属性不会出现在 $attrs 对象中。

上示例

<template>
 <div>
  <p>我是父组件</p>
  <test name="tom" :age="12" :id="12345" class="child" style="color: red" />
 </div>
</template>

<script>
export default {
 components: {
  test: {
   template: `
   <div>
    <p>我是子组件</p>
    <test2 v-bind="$attrs" s1="sss" s2="sss" />
   </div>`,
   props: ["name"],
   created() {
    console.log(this.$attrs); // {age: 12, id: 12345}
   },
   components: {
    test2: {
     template: `<p>我是孙子组件</p>`,
     props: ["age", "s1"],
     created() {
      console.log(this.$attrs); // {s2: "sss", id: 12345}
     }
    }
   }
  }
 }
};
</script>

首先可以看到父组件传给子组件传了 name、age、id、class、style 五个属性,其中 name 属性在子组件 props 中声明,又因为 class 和 style 属性会被 $attrs 除外,最终在子组件打印的 $attrs 输出了 {age: 12, id: 12345}

接着,子组件把自己的 $attrs 对象传给了孙子组件,同时又给孙子组件传了 s1、s2 两个属性,孙子组件在自己的属性 props 中声明了 age 、s1 两个属性,最终打印输出 {s2: "sss", id: 12345} 可以看到,孙子组件的 $attrs 合并了从父组件和子组件传来的属性,并把 props 中声明的属性除外

至此 $attrs 的介绍结束,下面开始介绍 inheritAttrs

inheritAttrs

官方API

inheritAttrs

2.4.0 新增,类型:boolean,默认值:true

详细:

默认情况下父作用域的不被认作 props 的特性绑定 (attribute bindings) 将会“回退”且作为普通的 HTML 特性应用在子组件的根元素上。当撰写包裹一个目标元素或另一个组件的组件时,这可能不会总是符合预期行为。通过设置 inheritAttrs 到 false,这些默认行为将会被去掉。而通过 (同样是 2.4 新增的) 实例属性 $attrs 可以让这些特性生效,且可以通过 v-bind 显性的绑定到非根元素上。

注意:这个选项不影响 class 和 style 绑定。

使用介绍

官方的解释看上去很唬人,其实默认情况就是把 $attrs 对象上没在子组件 props 中声明的属性加在子组件的根 html 标签上

上示例

<template>
 <div>
  <p>我是父组件</p>
  <test name="tom" age="12" class="child" style="color: red" />
 </div>
</template>

<script>
export default {
 components: {
  test: {
   template: `<p>我是子组件</p>`,
   props: ["name"],
   inheritAttrs: true, // 默认为 true
   created() {
    console.log(this.$attrs); // {age: "12"}
   }
  }
 }
};
</script>

可以看到父组件传给子组件传了 name、age 两个属性,其中 name 属性在子组件 props 中声明,以上代码浏览器解析后

<div>
 <p data-v-469af010>我是父组件</p>
 <p data-v-469af010 age="12" class="child" style="color: red;">我是子组件</p>
</div>

可以看到没有在子组件 props 中声明的 age 属性被写到了标签里,如果你不希望这样,则可以把子组件中的 inheritAttrs 设为 false,解析后的结果如下

<div>
 <p data-v-469af010>我是父组件</p>
 <p data-v-469af010 class="child" style="color: red;">我是子组件</p>
</div>

可以看到标签中的属性消失了,同时可以看到 class、style 属性不受影响

至此 inheritAttrs 的介绍结束

到此这篇关于浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用的文章就介绍到这了,更多相关Vue2.4.0 $attrs与inheritAttrs内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
用jQuery技术实现Tab页界面之二
Sep 21 Javascript
改变javascript函数内部this指针指向的三种方法
Apr 23 Javascript
页面刷新时记住滚动条的位置jquery代码
Jun 17 Javascript
jQuery平滑旋转幻灯片特效代码分享
Sep 07 Javascript
javascript从作用域链谈闭包
Jul 29 Javascript
javascript中错误使用var造成undefined
Mar 31 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
Nov 21 Javascript
Angular在一个页面中使用两个ng-app的方法
Feb 20 Javascript
浅谈对Angular中的生命周期钩子的理解
Jul 31 Javascript
js+canvas实现验证码功能
Sep 21 Javascript
Vue-Router基础学习笔记(小结)
Oct 15 Javascript
Vue源码分析之Vue实例初始化详解
Aug 25 Javascript
vue-cli点击实现全屏功能
Mar 07 #Javascript
vue全屏事件开发详解
Jun 17 #Javascript
vue实现全屏滚动效果(非fullpage.js)
Mar 07 #Javascript
vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)
Mar 07 #Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
Mar 07 #Javascript
Vue实现手机扫描二维码预览页面效果
May 28 #Javascript
微信小程序点击按钮动态切换input的disabled禁用/启用状态功能
Mar 07 #Javascript
You might like
默默简单的写了一个模板引擎
2007/01/02 PHP
php中strtotime函数性能分析
2016/11/20 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
JavaScript国旗变换效果代码
2008/08/13 Javascript
jquery 插件 web2.0分格的分页脚本,可用于ajax无刷新分页
2008/12/25 Javascript
JavaScript入门教程(10) 认识其他对象
2009/01/31 Javascript
Jquery 1.42 checkbox 全选和反选代码
2010/03/27 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
ExtJS4如何给同一个formpanel不同的url
2014/05/02 Javascript
node.js中的fs.lchownSync方法使用说明
2014/12/16 Javascript
Node.js和MongoDB实现简单日志分析系统
2015/04/25 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
解决vue-cli项目打包出现空白页和路径错误的问题
2018/09/04 Javascript
Vue 3.0 全家桶抢先体验
2020/04/28 Javascript
ES2020 已定稿,真实场景案例分析
2020/05/25 Javascript
vue中使用vue-pdf的方法详解
2020/09/05 Javascript
python解析html开发库pyquery使用方法
2014/02/07 Python
Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
2018/02/18 Python
python如何去除字符串中不想要的字符
2020/07/05 Python
对python3 urllib包与http包的使用详解
2018/05/10 Python
python识别图像并提取文字的实现方法
2019/06/28 Python
django之静态文件 django 2.0 在网页中显示图片的例子
2019/07/28 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
2020/02/11 Python
解决Keras 自定义层时遇到版本的问题
2020/06/16 Python
仿CSDN Blog返回页面顶部功能实现原理及代码
2013/06/30 HTML / CSS
美国电子元器件分销商:Newark element14
2018/01/13 全球购物
经典优秀个人求职自荐信格式
2013/09/25 职场文书
文体活动实施方案
2014/03/27 职场文书
教师师德师风整改措施
2014/10/24 职场文书
公司财务经理岗位职责
2015/04/08 职场文书
小学生读书笔记
2015/07/01 职场文书
详解MySQL数据库千万级数据查询和存储
2021/05/18 MySQL
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android