用Vue 2.X大概两年了。这两年我在公司的代码里面就写了一个Watcher.(当时可能比较弱没有想到办法避免Watcher)我现在越来越觉得Watcher是没用的东西,应该在VUE里面删掉。我觉得代
顺晟科技
2021-06-19 08:04:13
151
用Vue 2.X大概两年了。这两年我在公司的代码里面就写了一个Watcher.(当时可能比较弱没有想到办法避免Watcher)我现在越来越觉得Watcher是没用的东西,应该在VUE里面删掉。我觉得代码逻辑应该全部用Event驱动,而且所有的Watchers都可以用Event改写。用了Watcher的组件特点就是逻辑一团乱,内部充满了暗示,有些逻辑不明确必须加注释。举个例子,如果有多个Watcher相互依赖,它们的顺序还很重要(这就属于暗示的逻辑)。Watcher给后期维护带来很多麻烦,逻辑不清楚,数据流不明确。Watcher自带的暗示是:任何地方都可以改变目标变量。的Watcher使用根本不对而且没有必要,变化应该必须明确指定是什么event带来的,否则这个watcher的自带暗示给后期维护带来很多麻烦,需要仔细读代码才能知道是谁改变了目标变量。在我看来,使用Watcher是一个坏习惯。应该使用Vue-like的代码, 比如改变KEY强制重载,使用v-if配合created/mounted hook 正确初始化变量。不知道你们有什么看法?
顺晟科技:
watcher确实是有些麻烦,特别是需要在不同组件之间同步对象数据的时候,会带来预料之外的循环监听调用。不过在普通场景下用起来还是很方便的。
问题是,并不是所有的状态更新都来自一个 event 啊。比如我要实现一个时钟组件,要监听什么事件?
我就说watcher全换成event,或者生命周期hook。其它无所谓。你也可以走向完全相反的极端,不用event。全用watcher监控各种变量。看看乱不乱。显然不行。watcher就是有它先天的缺陷。如果完全可以被替换,不用没有任何问题。Vue设计了watcher不代表就是一定正确的,设计者并没想好怎么用。举个例子,var当时换成let 加const,当时所有人包括设计者以及各种大牛都认为,那必须是用let来替换掉var。现在发现其实let用不上,为了减少mutation,全用const。
引用类型,当然用const了,为啥要用let?ref、reactive等都是引用类型,用const不是很正常的吗?
对呀。我只是解释了一下event。又没说全用event。也没有说,只能用event。
另外组件之间也用事件驱动,比如子组件内部数据准备好之后,调用父组件的事件(或者方法function),通知父组件:数据准备好了,你可以干活了。
又如,多个事件触发同一个二次状态更新,难道更新逻辑写两遍?DRY 原则不要了吗。
你用 let 也没关系啊。let/const 主要解决 scope 的问题,是不是常量问题不大。
「为了减少 mutation」是哪儿来的?而且即使用 const,对象属性的修改依然不受限制。
以及我依然没明白你说的 event 是指什么。
问题是,并不是所有状态的变化都以事件为源头啊,比如我上面说的计时器。
「watcher 就是有它先天的缺陷」,愿闻其详?
确实有点麻烦,不过vue的核心就是数据驱动呀,数据驱动必须监听数据的变化。你改成event了,那么数据驱动咋办?
框架只提供给你实现功能可能需要的能力具体如何实现,或者代码整理,全都靠自己和团队
以及,老实说我并不确定我明白了你说的问题。
类似于 Vue.set 。就是数据在变动的时候,不用立即反应,等都准备好了之后,触发一个事件之后,再反应即可。
你……在说 React?
event就是传统的事件驱动,比如常见的,按下按钮触发click事件,input有change、input等事件,select有change事件。
父组件准备好数据之后,通过子组件的事件(方法)通知:我的数据准备好了,你可以干活了。