之前一直不了解$attrs的作用和使用场景,然后自己翻阅了相关资料整理了下,如有不对的地方请大家指教

$attrs:

  $attrs是vue版本2.40以上新增的属性;

  使用场景:

   vue项目里面,大家肯定遇到过组件之间的传值问题,父传子、子传父、非父子之间传值等等;

   假如说我们碰到一个多层组件之间的传值,可以用$emit、$on可以解决这个问题,但是操作太过于繁琐了,或者使用vuex也可以去实现,但是有点大材小用杀鸡用了宰牛刀。

   然后 $attrs 就是用来解决这个问题的!

     官方解释:

    $attr:包含了父作用域中不作为 prop 被识别 (且获取) 的 attribute 绑定 (class 和 style 除外)。当一个组件没有声明任何 prop 时,

    这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind="$attrs" 传入内部组件——在创建高级别的组件时非常有用。

   

   如果给组件传递的数据,组件不使用props接收,那么这些数据将作为组件的HTML元素的特性,这些特性绑定在组件的HTML根元素上
   inheritAttrs: false的含义是不希望本组件的根元素继承父组件的attribute,同时父组件传过来的属性(没有被子组件的props接收的属性),也不会显示在子组件的dom元素上,但是在组件里可以通过其$attrs可以获取到没有使用的注册属性, ``inheritAttrs: false`是不会影响 style 和 class 的绑定

  下面看实际用例(父组件的列表行数据传递给孙子组件展示):

  1. 父组件(Father.vue),给子组件关联数据,子组件如果不用props接收,那么这些数据就作为普通的HTML特性应用在子组件的根元素上

    1. <template>
    2. <div>
    3. <el-table :data='list'>
    4. <el-table-column
    5. prop="name"
    6. label="姓名"
    7. ></el-table-column>
    8. <el-table-column
    9. prop="study"
    10. label="学习科目"
    11. ></el-table-column>
    12. <el-table-column label="操作">
    13. <template slot-scope="scope">
    14. <el-button @click='transmitClick(scope.row)'>传递</el-button>
    15. </template>
    16. </el-table-column>
    17. </el-table>
    18.  
    19. <!-- 儿子组件 -->
    20. <ChildView
    21. :is-show="isOpen"
    22. :row="row"
    23. >
    24. </ChildView>
    25. </div>
    26. </template>
    27.  
    28. <script>
    29. import ChildView from './Child.vue'
    30. export default {
    31. components: { ChildView },
    32. data() {
    33. return {
    34. isOpen: false,
    35. row: {},
    36. list: [
    37. { name: '王丽', study: 'Java' },
    38. { name: '李克', study: 'Python' }
    39. ]
    40. }
    41. },
    42. methods: {
    43. // 传递事件
    44. transmitClick(row) {
    45. this.isOpen = true;
    46. this.row = row
    47. }
    48. }
    49. }
    50. </script>
  2. 儿子组件(Child.vue),中间层,作为父组件和孙子组件的传递中介,在儿子组件中给孙子组件添加v-bind="$attrs",这样孙子组件才能接收到数据
    1. <template>
    2. <div class='child-view'>
    3. <p>儿子组件</p>
    4. <GrandChild v-bind="$attrs"></GrandChild>
    5. </div>
    6. </template>
    7.  
    8. <script>
    9. import GrandChild from './GrandChild.vue'
    10. export default {
    11. // 继承所有父组件的内容
    12. inheritAttrs: true,
    13. components: { GrandChild },
    14. data() {
    15. return {
    16. }
    17. }
    18. }
    19. </script>
    20.  
    21. <style lang="stylus">
    22. .child-view {
    23. margin: 20px
    24. border: 2px solid red
    25. padding: 20px
    26. }
    27. </style>
  3. 孙子组件(GrandChild.vue),在孙子组件中一定要使用props接收从父组件传递过来的数据
    1. <template>
    2. <div class='grand-child-view'>
    3. <p>孙子组件</p>
    4. <p>传给孙子组件的数据:{{row.name}} {{row.name !== undefined? '学习' : ''}} {{row.study}}</p>
    5. </div>
    6. </template>
    7.  
    8. <script>
    9. export default {
    10. // 不想继承所有父组件的内容,同时也不在组件根元素dom上显示属性
    11. inheritAttrs: false,
    12. // 在本组件中需要接收从父组件传递过来的数据,注意props里的参数名称不能改变,必须和父组件传递过来的是一样的
    13. props: {
    14. isShow: {
    15. type: Boolean,
    16. dedault: false
    17. },
    18. row: {
    19. type: Object,
    20. dedault: () => { }
    21. }
    22. }
    23. }
    24. </script>
    25.  
    26. <style lang="stylus">
    27. .grand-child-view {
    28. border: 2px solid green
    29. padding: 20px
    30. margin: 20px
    31. }
    32. </style>

    总结:当我们涉及到多层传参的时候,父组件传出去的值,中间的组件不用通过props接收,但是要在子组件(中间组件)身上通过v-bind="$attrs",这样最下层的组件才能拿到最外层组件传过来的值

【vue】$attrs的作用和使用方法的更多相关文章

  1. JAVA 注解的几大作用及使用方法详解

    JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...

  2. serialVersionUID的作用以及设置方法(转)

    声明:本篇文章是转载的 http://blog.csdn.net/kakaxi_77/article/details/8129070 http://snowlotus.iteye.com/blog/2 ...

  3. 在Android开发中替换资源图片不起作用的解决方法

    现象 在android开发中,经常会需要替换res\drawable中的图片,打开res\layout下的文件预览布局页面发现图片已经被替换,但在模拟器或者真实机器上运行时发现该图片并没有被替换,还是 ...

  4. 【转】 PreTranslateMessage作用和使用方法

    PreTranslateMessage作用和使用方法  PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用, ...

  5. Linux中PATH环境变量的作用和使用方法

    关于PATH的作用:PATH说简单点就是一个字符串变量,当输入命令的时候LINUX会去查找PATH里面记录的路径.比如在根目录/下可以输入命令ls,在/usr目录下也可以输入ls,但其实ls这个命令根 ...

  6. PHP trim()函数的作用和使用方法

    PHP trim()函数一般是用来去除字符串首尾处的空白字符(或者其他字符),一般在用在服务端对接收的用户数据进行处理,以免把用户误输入的空格存储到数据库,下次对比数据时候出错. 该函数有两个参数,第 ...

  7. PreTranslateMessage作用和使用方法

    PreTranslateMessage作用和使用方法  PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用, ...

  8. C++ &quot;#&quot;的作用和使用方法

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/48879093 1 #和##的作用和使用 ...

  9. header中Content-Disposition的作用与使用方法

    下载文件的时候会使用: Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件.Content-disposition其实可以控制用 ...

随机推荐

  1. [MRCTF]XOR-无法生成反汇编的处理

    主程序,无法生成伪代码 由此分为两种方法即: 直接看反汇编 解决问题,尝试生成伪代码 硬啃汇编 输入与输出 判断输入长度是否为0x1B,其中al为eax的低8位 将输入的字符每个与当前字符所在下标异或 ...

  2. Java锁之乐观锁、悲观锁、自旋锁

    java锁分为三大类乐观锁.悲观锁.自旋锁 乐观锁:乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别 ...

  3. Grep 命令有什么用?如何忽略大小写?如何查找不含该串的行?

    是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来. grep [stringSTRING] filename grep [^string] filename

  4. Postman请求报错:Error:getaddrinfo ENOENT 50.88.88.88

    一.问题来源 今天发布一个新开发的项目到通州现场,内容是开放几个接口给第三方调用,需要现场部署的同事使用postman调用测试一下,现场同事使用postman调用后反馈有如下错误: 二.解决方法 发现 ...

  5. java-IO异常处理

    以前的异常处理 public class Demo3 { public static void main(String[] args) { //提高fw的作用域 //变量定义的时候可以没有值,但是使用 ...

  6. okayNav jQuery 插件怎么使用

    首先到 https://github.com/VPenkov/okayNav 这个网站里面把代码下载下来 下载之后解压出来,解压后打开文件app 然后创建一个HTML文档 然后倒入css的样式 样式: ...

  7. Netty学习摘记 —— 单元测试

    本文参考 本篇文章是对<Netty In Action>一书第九章"单元测试"的学习摘记,主要内容为使用特殊的 Channel 实现--EmbeddedChannel来 ...

  8. 智能指针中C++重载'->'符号是怎么实现的

    例如下面的代码: class StrPtr{ public: StrPtr() : _ptr(nullptr){} //拷贝构造函数等省略... std::string* operator->( ...

  9. C++ | 虚表的写入时机

    虚表 在C++的多态机制中,使用了 virtual 关键字声明的函数称之为虚函数,每个有虚函数的类或者虚继承的子类,编译器都会为它生成一个虚拟函数表(简称:虚表,以下用 vftable表示),表中的每 ...

  10. 浏览器中唤起native app || 跳转到应用商城下载

    前段时间遇到一个小需求:要求在分享出来的h5页面中,有一个立即打开的按钮,如果本地安装了我们的app,那么点击就直接唤起本地app,如果没有安装,则跳转到下载. 因为从来没有做过这个需求,因此这注定是 ...