关于vue源码flushSchedulerQueue函数queue。sort使用疑惑
先看源码:function flushSchedulerQueue () { currentFlushTimestamp = getNow() flushing = true let watcher, id // Sort queue before flush. // This ensures that: // 1. Components are updated from parent to child. (because parent is always // created before the child) // 2. A component"s user watchers are run before its render watcher (because // user watchers are created before the render watcher) // 3. If a component is destroyed during a parent component"s watcher run, // its watchers can be skipped. queue.sort((a, b) => a.id - b.id) // do not cache length because more watchers might be pushed // as we run existing watchers for (index = 0; index < queue.length; index++) { watcher = queue[index] if (watcher.before) { watcher.before() } id = watcher.id has[id] = null watcher.run() // in dev build, check and stop circular updates. if (process.env.NODE_ENV !== "production" && has[id] != null) { circular[id] = (circular[id] || 0) + 1 if (circular[id] > MAX_UPDATE_COUNT) { warn( "You may have an infinite update loop " + ( watcher.user ? `in watcher with expression "${watcher.expression}"` : `in a component render function.` ), watcher.vm ) break } } }
这个方法主要是用来执行微任务后回调相关逻辑,queue里缓存了要等待更新的watcher列表,并且将queue按照从小到大进行排序。 queue.sort((a, b) => a.id - b.id)
问题来了,为什么要对queue进行排序?
搜索出来的结果基本上是从英文里翻译过来:组件的更新由父到子;因为父组件的创建过程是先于子的,所以 watcher 的创建也是先父后子,执行顺序也应该保持先父后子。 用户的自定义 watcher 要优先于渲染 watcher 执行;因为用户自定义 watcher 是在渲染 watcher 之前创建的。 如果一个组件在父组件的 watcher 执行期间被销毁,那么它对应的 watcher 执行都可以被跳过,所以父组件的 watcher 应该先执行。
看到这样的回答,有点似懂非懂的感觉,果断用实例来验证下:
断点queue.sort
此时,queue里保存着子组件渲染watcher(称 s)和主渲染watcher(称 p),排序之后的顺序为:[p, s]
其中s这个watcher运行之后,在run函数里边就断掉了!
watcher源文件摘取代码:run () { // 此时的active已经为false if (this.active) { const value = this.get() if ( value !== this.value || // Deep watchers and watchers on Object/Arrays should fire even // when the value is the same, because the value may // have mutated. isObject(value) || this.deep ) { // set new value const oldValue = this.value this.value = value if (this.user) { const info = `callback for watcher "${this.expression}"` invokeWithErrorHandling(this.cb, this.vm, [value, oldValue], this.vm, info) } else { this.cb.call(this.vm, value, oldValue) } } } }
这个active其实是在主渲染watcher执行中被change掉 了,这样可以避免子组件的渲染watcher少执行很多代码啊,节省了很多的性能开销!
以上是个人的一点见解,欢迎留言讨论,喜欢请记得关注哦!
手机拍照修图软件哪个好?在手机拍照修图软件要好用的,有很多软件,比如微商水印相机非常的高清,功能也特别多,它可以拒图,换背景等,效果很好。手机拍照修图我最常用的就是snapseed,操作简单,后期效果好!
华为手机免费联网是真的吗?感谢您的阅读!我已经被我的父母,问过很多次。他们在一些短视频上看到所谓的华为手机免费连网,到底是不是真的?我必须要告诉大家,这些东西都是假的。天下没有免费的午餐,即使所谓的免费联网
孕妇在孕期什么时候睡觉最好?孕妇在孕期什么时候睡觉最好?怀孕是一件非常辛苦的事情,对于孕妇来说,保持充足的睡眠,是至关重要的。一般来说,孕妇晚上89点上床是最理想的,然后早上78点起床,这时候空气清新,非常适
如何在两三个月内从150斤减到135斤?谢邀,体重从150降到135,也就相当于降低体重的10,相对来说还是比较容易的。关键是提问者能不能坚持调节饮食和运动。首先计算一下自己身体每天最低基础代谢量,简单计算就行,每天摄入
现在经常会有孩子自杀,为什么?现在孩子的自杀情况越来越多,我认为有三个原因1,小孩早熟,信息接受过度,容易受部分不好的信息所侵蚀。当今时代,接受信息太多容易,小孩早早地就能接触到手机,并通过手机获取各种不同的信
职场上你做过哪些作死的事,但没有被开除?我是工人。某一天,有位师傅找我说厂里给某某,带坏分子冒。你给他凑点材料。我看着他心想,你们闹矛盾几十年了,没有材料凑,现在拿我当枪使,纯粹胡闹。没有想到几天过后,厂大书记到车间找我
90版一百元值多少钱?1990年100元价格关于1990年100元值多少钱,我们可以从品相,号码和冠号上去判断。一。从品相上判断1990年100元值多少钱。全品相1980年100元市场价格大的在1500
什么牌子的手机处理器比较好?骁龙麒麟联发科还是其他的?自第一款智能手机初代iPhone问世,手机处理器已经走过了10个年头的风风雨雨,主频也从最开始的的16MHz提升到如今的3GHz,目前市面上手机芯片除了几大巨头海思麒麟,高通骁龙,
45岁的男士,适合戴什么样的手表?资深腕表爱好者,玩表自媒体人,我就是邹三山,致力于为你提供有态度,有深度,有温度的腕表服务帮助。更多手表知识请搜索邹三山的玩表秘术这本电子书。首选就是劳力士潜航者系列黑水鬼,不仅有
割双眼皮需要住院吗?该注意什么?你好,双眼皮手术是不需要住院的,术后的双眼皮处会感到麻木没有知觉,还会感觉有点像肉条的形状。这种属于正常现象,不用过于担心。双眼皮手术尤其是全切双眼皮手术,术后有极少数的求美者可能
事业单位可以异地调动吗?条件是什么?可以的,条件是你有才或有财。是金子在哪里都能被看到,因为你有刺眼的光芒,成事在天,谋事在人。路在人走,事在人为,业在人创。条件是有足够大的领导帮你运作可以,调入地单位主管部门和人社