关于vue组件事件属性穿透详解

 更新时间:2019年10月28日 09:21:34   作者:莫西摩西  
今天小编就为大家分享一篇关于vue组件事件属性穿透详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

组件事件属性穿透

属性

$attrs包含从父组件传过来的属性,但不包含子组件中prop中的属性以及class和style,所以对于那些html元素原生属性,可以不用再子组件中声明,直接从父组件中传进来就好

// 子组件
<template>
 <div>
   <input type="text" name="" id="" v-bind="$attrs" v-on='listeners'/>
 </div>
</template>
 props: {
  test: {
   type: String,
   default: '123456'
  }
 },
 created () {
  console.log(`props:%o`, this.$props) // {test: '测试'}
  console.log('attrs:%o', this.$attrs) // {value: '测试'}
 },

 // 父组件
 <myInput :value="value" :class="class_" :style='style' :test='test' @input1="input"/>
  data () {
  return {
   style: {
    color: 'red'
   },
   value: '测试',
   class_: 'test',
   test: '测试'
  }
 }

注意:

由于在这个组件中input并不是根元素,默认情况下父组件的不被认作 props 的特性绑定将会“回退”且作为普通的 HTML 特性应用在子组件的根元素上,在该例子中根节点div会有value="测试"的属性,所以子组件需要设置 inheritAttrs: false去掉根元素默认行为,这样就可以通过实例属性 $attrs 可以让这些特性生效,且可以通过 v-bind 显性的绑定到非根元素上。

在子组件修改props,却不会修改父组件,这是因为extractPropsFromVNodeData中是通过浅复制将父组件中数据传递给props的。 浅复制意味着在子组件中对对象和数组的props进行修改还是会影响父组件,这就违背了单向数据流的设计。因此需要避免这种情况出现。

事件

$listeners包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件
 computed: {
  listeners () {
   return {
    ...this.$listeners,
    // 下面写需要从子组件事件传值到从父组件中的
    input: e => {
     this.$emit('input1', e.target.value)
    }
   }
  }
 },

以上这篇关于vue组件事件属性穿透详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Element Plus 去掉表格外边框的实现代码

    Element Plus 去掉表格外边框的实现代码

    使用el-table组件拖拽时, 想使用自定义样式进行拖拽, 想去掉外边框, 并在表头加入竖杠样式,本文给大家介绍Element Plus 去掉表格外边框的实现代码,感兴趣的朋友一起看看吧
    2025-04-04
  • vue的hash值原理也是table切换实例代码

    vue的hash值原理也是table切换实例代码

    这篇文章主要介绍了vue的hash值原理也是table切换,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 详解vue3.0 的 Composition API 的一种使用方法

    详解vue3.0 的 Composition API 的一种使用方法

    这篇文章主要介绍了vue3.0 的 Composition API 的一种使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Vue路由切换时的左滑和右滑效果示例

    Vue路由切换时的左滑和右滑效果示例

    这篇文章主要介绍了Vue路由切换时的左滑和右滑效果,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • 详解Vue.js动态绑定class

    详解Vue.js动态绑定class

    Vue.js的核心是一个响应的数据绑定系统,它允许我们在普通 HTML 模板中使用特殊的语法将 DOM “绑定”到底层数据。被绑定的DOM 将与数据保持同步,每当数据有改动,相应的DOM视图也会更新。基于这种特性,通过vue.js动态绑定class就变得非常简单。一起来看下吧
    2016-12-12
  • vue3+ts实现树形组件(菜单组件)

    vue3+ts实现树形组件(菜单组件)

    本文主要介绍了vue3+ts实现树形组件(菜单组件),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Vue中进行数据筛选与搜索功能实现常用的方法

    Vue中进行数据筛选与搜索功能实现常用的方法

    表格常用功能经常有字段筛选、更多字段筛选弹框来过滤出我们所需要的数据,下面这篇文章主要给大家介绍了关于Vue中进行数据筛选与搜索功能实现常用的方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • 浅析vue.js数组的变异方法

    浅析vue.js数组的变异方法

    本篇文章给大家分享了vue.js数组的变异方法的相关内容,有兴趣的朋友跟着学习参考下。
    2018-06-06
  • Vue3 的响应式和以前有什么区别,Proxy 无敌?

    Vue3 的响应式和以前有什么区别,Proxy 无敌?

    这篇文章主要介绍了Vue3 的响应式和以前有什么区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • vue-cli如何修改打包项目结构及前缀

    vue-cli如何修改打包项目结构及前缀

    这篇文章主要介绍了vue-cli如何修改打包项目结构及前缀问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07

最新评论