关于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 相关文章推荐
jquery加载页面的方法(页面加载完成就执行)
Jun 21 Javascript
JavaScript中的parse()方法使用简介
Jun 12 Javascript
浅谈node.js中async异步编程
Oct 22 Javascript
jquery自定义右键菜单、全选、不连续选择
Mar 01 Javascript
JavaScript类型系统之布尔Boolean类型详解
Jun 26 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
Jan 23 Javascript
JavaScript装饰器函数(Decorator)实例详解
Mar 30 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
Sep 21 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
Sep 14 Javascript
微信小程序第三方框架对比 之 wepy / mpvue / taro
Apr 10 Javascript
ES6 Symbol数据类型的应用实例分析
Jun 26 Javascript
vue组件中节流函数的失效的原因和解决方法
Dec 02 Vue.js
对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
smarty静态实验表明,网络上是错的~呵呵
2006/11/25 PHP
dedecms防止FCK乱格式化你的代码的修改方法
2007/03/17 PHP
php+mysql 实现身份验证代码
2010/03/24 PHP
基于PHP-FPM进程池探秘
2017/10/17 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
PHP后门隐藏的一些技巧总结
2020/11/04 PHP
随机显示经典句子或诗歌的javascript脚本
2007/08/04 Javascript
jQuery 表单验证扩展代码(二)
2010/10/20 Javascript
js对象关系图 方便dom操作
2012/03/18 Javascript
手机号码,密码正则验证
2014/09/04 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
2015/10/02 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
2016/07/08 Javascript
修改jquery中dialog的title属性方法(推荐)
2016/08/26 Javascript
jquery控制页面的展开和隐藏实现方法(推荐)
2016/10/15 Javascript
webpack入门必知必会
2017/01/16 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
angularjs定时任务的设置与清除示例
2017/06/02 Javascript
jQuery选择器之属性筛选选择器用法详解
2017/09/19 jQuery
实现两个文本框同时输入的实例
2017/09/25 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
vue-for循环嵌套操作示例
2019/01/28 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
Vue使用鼠标在Canvas上绘制矩形
2020/12/24 Vue.js
Python实现抓取页面上链接的简单爬虫分享
2015/01/21 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
2020/08/22 Python
如何用Python 加密文件
2020/09/10 Python
宝拉珍选官方旗舰店:2%水杨酸精华液,收缩毛孔粗大和祛痘
2018/07/01 全球购物
牧马人澳大利亚官网:Wrangler澳大利亚
2019/10/08 全球购物
Linux面试经常问的文件系统操作命令
2015/11/05 面试题
95%的面试官都会问到的50道Java线程题,附答案
2012/08/03 面试题
八一建军节感言
2014/02/28 职场文书
喷漆工的岗位职责
2014/03/17 职场文书
小学见习报告
2015/06/23 职场文书
MySQL sql_mode的使用详解
2021/05/08 MySQL