关于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 相关文章推荐
深入理解JavaScript系列(9) 根本没有“JSON对象”这回事!
Jan 15 Javascript
可选择和输入的下拉列表框示例
Nov 05 Javascript
jquery选择器原理介绍($()使用方法)
Mar 25 Javascript
一个js过滤空格的小函数
Oct 10 Javascript
利用iscroll4实现轮播图效果实例代码
Jan 11 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
May 28 Javascript
微信小程序实现移动端滑动分页效果(ajax)
Jun 13 Javascript
JavaScript之underscore_动力节点Java学院整理
Jul 03 Javascript
js限制输入框只能输入数字(onkeyup触发)
Sep 28 Javascript
Vue开发之封装分页组件与使用示例
Apr 25 Javascript
Vue事件修饰符native、self示例详解
Jul 09 Javascript
使用JS实现鼠标放上图片进行放大离开实现缩小功能
Jan 27 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
php 无法加载mcrypt.dll的解决办法
2013/04/03 PHP
保存到桌面、设为桌面且带图标的PHP代码
2013/11/19 PHP
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
2014/05/10 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
2016/04/11 PHP
php短信接口代码
2016/05/13 PHP
项目中应用Redis+Php的场景
2016/05/22 PHP
PHP实现适用于文件内容操作的分页类
2016/06/15 PHP
PHP+Mysql无刷新问答评论系统(源码)
2016/12/20 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
Javascript this 的一些学习总结
2012/08/02 Javascript
HTML Color Picker(js拾色器效果)
2013/08/27 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
seajs学习之模块的依赖加载及模块API的导出
2016/10/20 Javascript
vue、react等单页面项目应该这样子部署到服务器
2018/01/03 Javascript
Vue2.0实现组件数据的双向绑定问题
2018/03/06 Javascript
vue iView 上传组件之手动上传功能
2018/03/16 Javascript
VUE 组件转换为微信小程序组件的方法
2019/11/06 Javascript
JavaScript ES6 Class类实现原理详解
2020/05/08 Javascript
[01:14:35]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第一局
2016/02/26 DOTA
在Python的Bottle框架中使用微信API的示例
2015/04/23 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
2019/06/26 Python
AUC计算方法与Python实现代码
2020/02/28 Python
使用python实现下载我们想听的歌曲,速度超快
2020/07/09 Python
解决python3中os.popen()出错的问题
2020/11/19 Python
带有css3动画效果的兼容多浏览器简单导航条示例
2014/01/26 HTML / CSS
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
德国前卫设计师时装在线商店:Luxury Loft
2019/11/04 全球购物
《三亚落日》教学反思
2014/04/26 职场文书
政府个人对照检查材料
2014/08/28 职场文书
2014年最新领导班子整改方案
2014/09/27 职场文书
宇宙与人观后感
2015/06/05 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书
2016年幼儿园庆六一开幕词
2016/03/04 职场文书
《飘》英文读后感五篇
2019/10/11 职场文书