浅谈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 相关文章推荐
javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
Jul 21 Javascript
基于jquery自己写tab滑动门(通用版)
Oct 30 Javascript
javascript模拟实现C# String.format函数功能代码
Nov 25 Javascript
Javascript中的回调函数和匿名函数的回调示例介绍
May 12 Javascript
Javascript获取CSS伪元素属性的实现代码
Sep 28 Javascript
多个jQuery版本共存的处理方案
Mar 17 Javascript
jQuery.trim() 函数及trim()用法详解
Oct 26 Javascript
js模式化窗口问题![window.dialogArguments]
Oct 30 Javascript
Node.js复制文件的方法示例
Dec 29 Javascript
JavaScript之class继承_动力节点Java学院整理
Jul 03 Javascript
在Vue项目中使用Typescript的实现
Dec 19 Javascript
js实现搜索提示框效果
Sep 05 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
php数组函数序列之sort() 对数组的元素值进行升序排序
2011/11/02 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
W3C Group的JavaScript1.8 新特性介绍
2009/05/19 Javascript
一个cssQuery对象 javascript脚本实现代码
2009/07/21 Javascript
在子窗口中关闭父窗口的一句代码
2013/10/21 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
2013/12/10 Javascript
通过$(this)使用jQuery包装后的方法或属性
2014/05/18 Javascript
javascript实现图片自动和可控的轮播切换特效
2015/04/13 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
jquery正则表达式验证(手机号、身份证号、中文名称)
2015/12/31 Javascript
JavaScript操作 url 中 search 部分方法函数
2016/06/15 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
Javascript 获取鼠标当前的位置实现方法
2016/10/27 Javascript
JS通过调用微信API实现微信支付功能的方法示例
2017/06/29 Javascript
Vue.js实现列表清单的操作方法
2017/11/15 Javascript
mpvue小程序仿qq左滑置顶删除组件
2018/08/03 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
基于aotu.js实现微信自动添加通讯录中的联系人功能
2020/05/28 Javascript
Vue路由切换页面不更新问题解决方案
2020/07/10 Javascript
python去除字符串中的换行符
2017/10/11 Python
Python实现查看系统启动项功能示例
2018/05/10 Python
详解Django中类视图使用装饰器的方式
2018/08/12 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
2019/02/21 Python
django的ORM操作 增加和查询
2019/07/26 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
解决Python import .pyd 可能遇到路径的问题
2021/03/04 Python
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
Booking.com美国:全球酒店预订网站
2017/04/18 全球购物
LivingSocial英国:英国本地优惠
2019/02/22 全球购物
Burt’s Bees英国官网:世界领先的天然个人护理品牌
2020/08/17 全球购物
高三上学期学习自我评价
2014/04/23 职场文书
鉴定评语大全
2014/05/05 职场文书
个人安全承诺书
2014/05/22 职场文书
2014年学校法制宣传日活动总结
2014/11/01 职场文书
敬老院义诊活动总结
2015/05/07 职场文书
初中英语教师个人工作总结2015
2015/07/21 职场文书