浅谈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 相关文章推荐
弹出广告特效(一个IP只弹出一次)的代码
Jul 27 Javascript
Js 获取Gridview选中行的内容操作步骤
Feb 05 Javascript
Javascript执行效率全面总结
Nov 04 Javascript
使用JavaScript链式编程实现模拟Jquery函数
Dec 21 Javascript
原生javascript实现图片弹窗交互效果
Jan 12 Javascript
JS获取地址栏参数的两种方法(简单实用)
Jun 14 Javascript
微信小程序 动态的设置图片的高度和宽度详解及实例代码
Feb 24 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
Aug 23 Javascript
vue实现新闻展示页的步骤详解
Apr 11 Javascript
vue+element项目中过滤输入框特殊字符小结
Aug 07 Javascript
微信小程序 授权登录详解(附完整源码)
Aug 23 Javascript
在Vue中使用Select选择器拼接label的操作
Oct 22 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
Discuz! Passport 通行证整合
2008/03/27 PHP
PHP SEO优化之URL优化方法
2011/04/21 PHP
PHP获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
2012/10/03 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
Prototype 学习 工具函数学习($方法)
2009/07/12 Javascript
写了10年的Javascript也未必全了解的连续赋值运算
2011/03/25 Javascript
windows系统下简单nodejs安装及环境配置
2013/01/08 NodeJs
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
2013/08/29 Javascript
JavaScript声明变量时为什么要加var关键字
2014/09/29 Javascript
JavaScript前端图片加载管理器imagepool使用详解
2014/12/29 Javascript
jQuery制作可自定义大小的拼图游戏
2015/03/30 Javascript
JavaScript中日期的相关操作方法总结
2015/10/24 Javascript
javascript中eval解析JSON字符串
2016/02/27 Javascript
Js调用Java方法并互相传参的简单实例
2016/08/11 Javascript
微信小程序 slider 详解及实例代码
2017/01/10 Javascript
详解vue 配合vue-resource调用接口获取数据
2017/06/22 Javascript
Angular.js ng-file-upload结合springMVC的使用教程
2017/07/10 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
vue@cli3项目模板怎么使用public目录下的静态文件
2020/07/07 Javascript
[11:12]2018DOTA2国际邀请赛寻真——绿色长城OpTic
2018/08/10 DOTA
python使用Flask框架获取用户IP地址的方法
2015/03/21 Python
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
Python中Unittest框架的具体使用
2019/08/27 Python
自定义Django默认的sitemap站点地图样式
2020/03/04 Python
Python爬虫爬取新闻资讯案例详解
2020/07/14 Python
H5 meta小结(前端必看篇)
2016/08/24 HTML / CSS
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
意大利高端时尚买手店:Stefania Mode
2018/03/01 全球购物
优秀班集体事迹材料
2014/12/25 职场文书
2015年人力资源工作总结
2015/04/08 职场文书
小王子读书笔记
2015/06/29 职场文书
2019通用版新员工入职培训方案!
2019/07/11 职场文书
详细总结Python常见的安全问题
2021/05/21 Python
使用Python通过企业微信应用给企业成员发消息
2022/04/18 Python