• Vue $attrs / $listeners


    $attrs

    把父组件中非props属性绑定到内部组件

    $listeners

    把父组件中的DOM对象的原生事件绑定到内部组件

    1.父组件传给自定义子组件的属性,如果没有prop接收,会自动设置到子组件内部的最外层标签上, 如果是 class 或者 style 的话,会合并最外层标签的 classstyle

    <!-- 父组件 -->
    <demo class="parent-class" required placeholder="Hello vue"></demo>
    
    <!-- 子组件 -->
    <div>
     <input type="text" class="form-control" />
    </div>
    
    <!-- 不使用 $attrs 和 inheritAttrs=false -->
    <!-- 把非props的属性添加到最外层的元素上 -->
    <div required="required" placeholder="Hello vue" class="parent-class">
     <input type="text" class="form-control">
    </div>
    

    2.如果子组件不想继承父组件传入的非props属性,可以使用 inheritAttrs 禁用继承, 然后通过 v-bind="$attrs" 把外部传入的非props属性添加到希望的标签上. 但是这不会改变 classstyle(还是会把class和style添加到最外层的元素上)

    <!-- 子组件 -->
    <div>
     <input type="text" class="form-control" v-bind="$attrs" />
    </div>
    <!-- 使用$attrs 和 inheritAttrs=false -->
    <!-- 除了 class 和 style 属性都被加在指定的元素上 -->
    <div class="parent-class">
     <input type="text" required="required" placeholder="Hello vue" class="form-control">
    </div>
    

    3. 给子组件绑定事件

    <!-- 父组件 -->
    <demo class="parent-class" required placeholder="Hello vue" @focus="onFocus" @input="onInput"></demo>
    
    <!-- 子组件 -->
    <div>
        <input
          type="text"
          class="form-control"
          v-bind="$attrs"
          @input="$emit('input',$event)"
          @focus="$emit('focus',$event)"
        />
      </div>
    

    4. 通过$listeners简化事件的注册(效果同3一致)

    <!-- 父组件 -->
    <demo class="parent-class" required placeholder="Hello vue" @focus="onFocus" @input="onInput"></demo>
    
    <!-- 子组件 -->
    <input type="text" class="form-control" v-bind="$attrs" v-on="$listeners" />
    
    Keep learning
  • 相关阅读:
    slots属性(省内存,限制属性的定义)
    自定制格式化方式format
    改变对象的字符串显示__str__repr
    __getattribute__和item系列
    授权(类似)
    双下划线开头的attr方法
    动态导入模块
    反射
    python的单下划线和双下划线
    在子类中调用父类的方法
  • 原文地址:https://www.cnblogs.com/leslie1943/p/13615163.html
Copyright © 2020-2023  润新知