关于vue3默认把所有onSomething当作v-on事件绑定的思考


Posted in Javascript onMay 15, 2020

最近在重新看vue3的rfcs,发现一个细节,原话如下:

props that start with on are handled as v-on bindings, with everything after on being converted to all-lowercase as the event name (more on this below)

也就是说,以后如果你在传递props的时候,以 on 开头的props,如果在组件上没有做props的声明,那么会被当作事件绑定到组件的根节点上。

究其原因,我大致概括了两点:

  • 兼容vue2中的v-on.native
  • vue3的vnode声明把props拍平了,为了区分事件和其他props,就统一把所有的on开通的props默认作为事件绑定

为此,我开了一个issue来讨论这个问题,issue地址 。我关心的主要有两点:

  • 这是对functional component的严重限制
  • 是否会导致一些令人括困惑的误解

先讲第一点

vue3中可以直接通过 function() {} 来声明函数组件了,这是一个便利性的非常大的提升。在以前,你要声明组件,你必须要:

{
  functinal: true,
  props: {},
  render() {}
}

这最大的提升来自不需要声明props,为什么说这是提升,因为这让我们开发HOC变得更方便了。现在我们可以通过 ...rest 的方式把HOC不关心的props直接向下传递了。

但是现在因为这个默认限制,我们不得不在HOC中声明所有可能的他要扩展的组件以 on 开头的props。举个例子,我们有如下组件:

{
  props: {
    name: String,
    onChange: Function
  }
}

而我们的HOC的功能是在 name 前面加上 prefix ,对于这个HOC我们需要关心的只是 name 和他自己的props: prefix 。所以他的声明应该如下:

{
  props: {
    name: String,
    prefix: String
  }
}

然后在render中他可以这么做:

{
  render() {
    const {name, prefix, ...rest} = props
    return <WrapperedComponent name={`${prefix}-${name}`} {...rest} />
  }
}

也就是对于HOC来说,他是不需要关心他扩展的组件其他的props的,但是在这种情况下,如果我们不在HOC中声明,那么在使用的时候传入的 onChange 会自动绑定到root节点,而不是作为props传递下去。

第二点:令人困惑的使用

举个例子,如果我有一个组件:

{
  props: {
    onChange: Function
  },
  methods: {
    handleInput() {
      // do someting
      // 并且根据情况触发`onChange`
    } 
  },
  render() {
    return <input onInput={this.handleInput} />
  }
}

很显然我是想要封装 input 的变化,在满足某些条件的时候才对外抛出新的value。但是如果这个时候有人就是不看文档,直接传递了 onInput ,那么这时候 input 事件会直接绑定到节点上,那么这也是可以触发的。

如果我们的测试用例太少或者不仔细,很可能反应不过来他们的区别。这显然是作为组件开发者的我们不希望出现的,但我们又无法限制这种行为。

总结

不得不说,我在考虑这两个问题的时候是有一定的 React思维 在里面的。因为个人来说我是比较喜欢React的API设计的,非常的简洁,其对于组件的使用也更趋于极致,就是一切皆组件(连 redirect 这样的行为都定义成了组件)。

而vue是一直在跟随react的,相信这点大家也不会否认。vue3更新的hooks(Composition)API,Suspense等明显是借鉴的React的概念。

但同时我又是很看好vue3的,我一直觉得vue2这样的API设计以及 .vue 文件的开发模式都是为了吸引中低级用户而准备的,甚至舍弃了一些高级API特性(比如HOC在vue中就很难实现,并且普及率相当低)。

而vue3的hooks API以及其对JSX的更好支持,还有更纯粹的 functional component ,让我一度看到了vue在工程方面更激进的变化。

但是 v-on 的默认行为,却又是一次那么明显的 替用户做决定 的行为。其实要解决这个问题很简单,可以完全不考虑 v-on ,把所有传递的参数作为props,如果组件开发者真的要在根节点上绑定事件,他可以实现的时候绑定,我们不应该在使用组件的场景下需要考虑在组件内部的节点上做一些事情,这样做的副作用实在太大了。

虽然目前看来尤老师会听取我的意见的可能性是非常小的,但我还是抱有一点简单的期望吧。

到此这篇关于关于vue3默认把所有onSomething当作v-on事件绑定的思考的文章就介绍到这了,更多相关vue3 onSomething当作v-on事件绑定内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
跨浏览器开发经验总结(四) 怎么写入剪贴板
May 13 Javascript
javascript代码编写需要注意的7个小细节小结
Sep 21 Javascript
早该知道的7个JavaScript技巧
Mar 27 Javascript
动态读取JSON解析键值对的方法
Jun 03 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
Feb 26 Javascript
图片旋转、鼠标滚轮缩放、镜像、切换图片js代码
Dec 13 Javascript
Easyui的组合框的取值与赋值
Oct 28 Javascript
Easyui Tree获取当前选择节点的所有顶级父节点
Feb 14 Javascript
Angular2搜索和重置按钮过场动画
May 24 Javascript
小程序实现留言板
Nov 02 Javascript
小程序点击图片实现png转jpg
Oct 22 Javascript
浅谈实现在线预览PDF的几种解决办法
Aug 10 Javascript
js实现简单贪吃蛇游戏
May 15 #Javascript
Javascript执行流程细节原理解析
May 14 #Javascript
使用npm命令提示: 'npm' 不是内部或外部命令,也不是可运行的程序的处理方法
May 14 #Javascript
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
May 14 #Javascript
vue组件系列之TagsInput详解
May 14 #Javascript
ant-design-vue按需加载的坑的解决
May 14 #Javascript
JavaScript数组排序功能简单实现
May 14 #Javascript
You might like
PHP编程中八种常见的文件操作方式
2006/11/19 PHP
php笔记之:初探PHPcms模块开发介绍
2013/04/26 PHP
PHP以mysqli方式连接类完整代码实例
2014/07/15 PHP
PHP获取当前所在目录位置的方法
2014/11/26 PHP
PHP实现事件机制的方法
2015/07/10 PHP
关于js new Date() 出现NaN 的分析
2012/10/23 Javascript
javascript scrollTop正解使用方法
2013/11/14 Javascript
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
js实现可兼容IE、FF、Chrome、Opera及Safari的音乐播放器
2015/02/11 Javascript
JS实现动态给图片添加边框的方法
2015/04/01 Javascript
使用PHP+JavaScript将HTML页面转换为图片的实例分享
2016/04/18 Javascript
使用BootStrapValidator完成前端输入验证
2016/09/28 Javascript
bootstrap的3级菜单样式,支持母版页保留打开状态实现方法
2016/11/10 Javascript
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
详解如何理解vue的key属性
2019/04/14 Javascript
ES6对象操作实例详解
2020/05/23 Javascript
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
[45:15]Optic vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
[36:16]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.19
2020/12/24 DOTA
python实现dnspod自动更新dns解析的方法
2014/02/14 Python
使用C语言扩展Python程序的简单入门指引
2015/04/14 Python
解决DataFrame排序sort的问题
2018/06/07 Python
python使用tornado实现简单爬虫
2018/07/28 Python
python 绘制拟合曲线并加指定点标识的实现
2019/07/10 Python
Python获取一个用户名的组ID过程解析
2019/09/03 Python
Python代码一键转Jar包及Java调用Python新姿势
2020/03/10 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
2020/06/18 Python
用于ETL的Python数据转换工具详解
2020/07/21 Python
Python如何telnet到网络设备
2021/02/18 Python
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
行政执法队伍作风整顿剖析材料
2014/10/11 职场文书
办公楼租房协议书范本
2014/11/25 职场文书
入党函调证明材料
2014/12/24 职场文书
Nest.js参数校验和自定义返回数据格式详解
2021/03/29 Javascript
基于Python实现的购物商城管理系统
2021/04/27 Python
Redis高并发防止秒杀超卖实战源码解决方案
2021/11/01 Redis