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


Posted in Javascript onOctober 28, 2019

组件事件属性穿透

属性

$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组件事件属性穿透详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
显示、隐藏密码
Jul 01 Javascript
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
May 10 Javascript
有趣的javascript数组定义方法
Sep 10 Javascript
JS的location.href跳出框架打开新页面的方法
Sep 04 Javascript
jQuery中:enabled选择器用法实例
Jan 04 Javascript
原生js实现商品放大镜效果
Jan 12 Javascript
使用 Vue 绑定单个或多个 Class 名的实例代码
Jan 08 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
Feb 26 Javascript
vue仿element实现分页器效果
Sep 13 Javascript
微信小程序开发(三):返回上一级页面并刷新操作示例【页面栈】
Jun 01 Javascript
JavaScript中的函数式编程详解
Aug 22 Javascript
vue 避免变量赋值后双向绑定的操作
Nov 07 Javascript
对vue中的事件穿透与禁止穿透实例详解
Oct 28 #Javascript
vue h5移动端禁止缩放代码
Oct 28 #Javascript
在Vue项目中,防止页面被缩放和放大示例
Oct 28 #Javascript
element-ui 本地化使用教程详解
Oct 28 #Javascript
vue 全局环境切换问题
Oct 27 #Javascript
vue 父组件通过v-model接收子组件的值的代码
Oct 27 #Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
Oct 27 #Javascript
You might like
法兰绒滤网冲泡
2021/03/03 冲泡冲煮
php模拟post行为代码总结(POST方式不是绝对安全)
2012/02/22 PHP
discuz目录文件资料汇总
2014/12/30 PHP
php中解析带中文字符的url函数分享
2015/01/20 PHP
简单PHP会话(session)说明介绍
2016/08/21 PHP
javascript动态加载三
2012/08/22 Javascript
JS自动缩小超出大小的图片
2012/10/12 Javascript
javascript模拟select,jselect的方法实现
2012/11/08 Javascript
javascript在IE下trim函数无法使用的解决方法
2014/09/12 Javascript
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
javascript鼠标右键菜单自定义效果
2020/12/08 Javascript
BootStrap中Table分页插件使用详解
2016/10/09 Javascript
JavaScript定义全局对象的方法示例
2017/01/12 Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
2017/02/12 Javascript
jQuery插件echarts去掉垂直网格线用法示例
2017/03/03 Javascript
WEB前端性能优化的7大手段详解
2020/02/04 Javascript
解决vuecli3中img src 的引入问题
2020/08/04 Javascript
vue实现广告栏上下滚动效果
2020/11/26 Vue.js
python分析apache访问日志脚本分享
2015/02/26 Python
Python的Django框架中if标签的相关使用
2015/07/15 Python
深入理解python try异常处理机制
2016/06/01 Python
Python 找到列表中满足某些条件的元素方法
2018/06/26 Python
python 快速把超大txt文件转存为csv的实例
2018/10/26 Python
python range实例用法分享
2020/02/06 Python
在PyTorch中使用标签平滑正则化的问题
2020/04/03 Python
css3.0 图形构成实例练习二
2013/03/19 HTML / CSS
【HTML5】3D模型--百行代码实现旋转立体魔方实例
2016/12/16 HTML / CSS
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
Kiehl’s科颜氏西班牙官方网站:源自美国的植物护肤品牌
2020/02/22 全球购物
澳大利亚著名的纺织品品牌:Canningvale
2020/05/05 全球购物
教师实习的自我鉴定
2013/10/26 职场文书
电气工程及自动化专业自荐书范文
2013/12/18 职场文书
工厂仓管员岗位职责
2014/01/01 职场文书
岗位聘任书范文
2014/03/29 职场文书
三下乡活动心得体会
2016/01/23 职场文书
演讲稿之开卷有益
2019/08/07 职场文书