vue.js 源代码学习笔记 ----- core scedule.js-程序员宅基地

技术标签: ViewUI  javascript  

/* @flow */

import type Watcher from './watcher'
import config from '../config'
import { callHook } from '../instance/lifecycle'

import { warn, nextTick, devtools } from
'../util/index' const queue: Array<Watcher> = [] let has: { [key: number]: ?true } = {} let circular: { [key: number]: number } = {} let waiting = false let flushing = false let index = 0 /**
* Reset the scheduler's state.
*/ function resetSchedulerState () { queue.length = 0 has = {} if (process.env.NODE_ENV !== 'production') { circular = {} } waiting = flushing = false } /** * Flush both queues and run the watchers. */ function flushSchedulerQueue () { flushing = true let watcher, id, vm // 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] 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] > config._maxUpdateCount) { warn( 'You may have an infinite update loop ' + ( watcher.user ? `in watcher with expression "${watcher.expression}"` : `in a component render function.` ), watcher.vm ) break } } } // reset scheduler before updated hook called const oldQueue = queue.slice() resetSchedulerState() // call updated hooks index = oldQueue.length while (index--) { watcher = oldQueue[index] vm = watcher.vm if (vm._watcher === watcher && vm._isMounted) { callHook(vm, 'updated') } } // devtool hook /* istanbul ignore if */ if (devtools && config.devtools) { devtools.emit('flush') } } /** * Push a watcher into the watcher queue. * Jobs with duplicate IDs will be skipped unless it's * pushed when the queue is being flushed. */ export function queueWatcher (watcher: Watcher) { const id = watcher.id if (has[id] == null) { has[id] = true if (!flushing) { queue.push(watcher) } else { // if already flushing, splice the watcher based on its id // if already past its id, it will be run next immediately. let i = queue.length - 1 while (i >= 0 && queue[i].id > watcher.id) { i-- } queue.splice(Math.max(i, index) + 1, 0, watcher) } // queue the flush if (!waiting) { waiting = true nextTick(flushSchedulerQueue) } } }

 

这个方法主要用来保存watcher形成一个事件队列, 并且调用nextTick 执行watcher的run方法

转载于:https://www.cnblogs.com/dhsz/p/7111656.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30883777/article/details/98494185

智能推荐

【Mac】Mac电脑充电小板、充电器不亮或者接触不良、发黑、针头缩进_mac 电源头充电接口就是电源小板吗-程序员宅基地

文章浏览阅读2.7k次。同理安装过程是相反的,而且我这里反了一个错误,忘记安装排线了,导致一直没好,最后安装排线就正常了。后来经过我验证是电池充电小板问题。红色框框里面是充电小板,然后充电器可以看到是不亮的。我的mac电脑用久了,最近有点小毛病,最近充不上电了,主要表现如下。卸掉螺丝后,然后卸掉一个充电线,然后根据如下图,把这几个卸掉。这是当初的样子,该电脑比较老了,型号是A466。我们需要先卸掉排线,然后卸掉如下螺丝。打开如下,然后倾斜的撬动这个充电小板。_mac 电源头充电接口就是电源小板吗

ffmpeg-nvenc_nvencoder 流程-程序员宅基地

文章浏览阅读4.3k次,点赞2次,收藏4次。nvenc.c是一个用nvidia来执行的代码,下面简单分析nvenc编码的基本流程, 主要关注与nvenc底层相关的接口调用,也就是下图所示AVCodec_nvencoder 流程

Allegro PCB -如何做自定义焊盘_allegro画圆焊盘-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏4次。1、如何创建自定义焊盘,比如这种形状的焊盘。(1)、打开PCB Editor –>Allegro PCB Design ->New,在类型中选择Shape symbol,并输入名字,比如test,点击OK。(2)、点击Setup -> Parameter Editor,进行页面尺寸及栅格点设置。(3)、点击..._allegro画圆焊盘

虚拟化架构种类、特点及优势_分别简述寄居虚拟化、裸金属虚拟化、操作系统虚拟化、函数库虚拟化的特点。-程序员宅基地

文章浏览阅读1.9k次。(ECS Bare Metal Instance)是一种可弹性伸缩的高性能计算服务,计算性能与传统物理机无差别,具有安全物理隔离的特点,分钟级的交付周期将提供给您实时的业务响应能力。操作系统虚拟化架构把单个的操作系统划分为多个容器,使用容器管理器来进行管理。裸金属虚拟化架构指直接在硬件上面安装虚拟化软件,再在其上安装操作系统和应用,依赖虚拟层内核和服务器控制台进行管理。寄居虚拟化架构指在宿主操作系统之上安装和运行虚拟化程序,依赖于宿主操作系统对设备的支持和物理资源的管理。_分别简述寄居虚拟化、裸金属虚拟化、操作系统虚拟化、函数库虚拟化的特点。

2023贵州省职业院校技能大赛大数据技术与应用专业样题_贵州省大数据技能竞赛题目-程序员宅基地

文章浏览阅读727次。2023贵州省职业院校技能大赛大数据技术与应用专业样题_贵州省大数据技能竞赛题目

C#红黑树实现代码-程序员宅基地

文章浏览阅读1.3k次。在学习红黑树之前,最好已经学习过AVL树了,因为二者的实现方式是有很大程度类似的(左旋和右旋),但是只不过二叉平衡树是在每次加入节点时,需要计算该节点的左右子树高度差,如果高度差大于一则旋转调节使其平衡;而红黑树是在每次加入节点时计算红黑节点之间的关系,如果关系错误,则通过旋转和改变颜色来调节树的结构。总之,AVL树也好,RB树也好,都只不过是一种优化二叉查找树的高级方式而已。下面是C#实..._c#红黑树

随便推点

K8S集群单节点安装详细配置 以及部署nginx服务最佳实践_you can also perform this action in beforehand usi-程序员宅基地

文章浏览阅读2k次。概述kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。传统的应用部署方式是通过插件或脚本来安装应用。......_you can also perform this action in beforehand using 'kubeadm config images

大学计算机系最努力的同学都是如何学习的?_读完 深入理解计算机系统 阅读顺序-程序员宅基地

文章浏览阅读1.1w次,点赞141次,收藏423次。大家好,我是小林哥。经常会有读者跟小林发私信,说我的图解系统和图解网络在面试中帮到他们,而且不少都是拿到了一线的大厂。于是,我就在想,能不能邀请这些优秀的读者来分享他面试心得和学习经验。因为小林读者里肯定还有很多是在校生,我相信这些过来人的经验会帮助到你们,也让大家能提前知道如何准备,少走一些弯路,磨平校招的信息差,不至于到大四才知道校招这些事情。说干就干,然后就有了这个「读者牛逼系列」,真心希望这里的每一位牛逼读者的经历,能够影响到你,给你带来启发和价值。今天来跟大家分享的是一位我影响很深刻的读_读完 深入理解计算机系统 阅读顺序

(2010.03.07)JAVA RPG星星小镇0.5_5 .0p:/>x'; 墆 娶爔 8hwz bk6t0il 符蜂開da日-程序员宅基地

文章浏览阅读1.8k次。基本操作: 移动:← → ↓ ↑ 对话:空格键/回车键 运行环境:Windows/LinuxJRE 1.6或以上(不装跑不了) JRE下载地址:http://www.java.com/zh_CN/download/manual.jsp 注意:游戏处在开发阶段,仅体验 StarTown v0.5 英文版 1.添加游戏专用数据库 2.添加fps控制游戏运行的速度 3.改善人物行走 本次更新添加了一_5 .0p:/>x'; 墆 娶爔 8hwz bk6t0il 符蜂開da日

视屏快进快退按小片段进行_快进时显示快进片段-程序员宅基地

文章浏览阅读603次。视屏按照后台下发的模块(片段节点)快进或快退protected void prev() { isFastSeeking = true; if (isLoopSegmeng) { isLoopSegmeng = false; playMenuView.setPlayLoopSegmengBackgroud(isLoopSe_快进时显示快进片段

crmeb 电商系统 小程序商城系统接口_crmeb如何对接小程序接口-程序员宅基地

文章浏览阅读1.3k次。公用响应公用响应首页接口获取用户token获取首页数据获取商品详情页评论列表获取商品搜索历史搜索商品获取商品分类获取商品通过分类id商品收藏商品取消收藏添加到购物车我的购物车变化购物车数量删除购物车用户点击立即购买下单用户创建订单页面用户地址 获取用户地址 设置默认用户地址删除用户地址添加讨论区 列表问题详情页用户删除问题详情页评论用户添加问题..._crmeb如何对接小程序接口

好玩的dos命令——————星球大战_dos命令星球-程序员宅基地

文章浏览阅读1w次,点赞5次,收藏6次。在dos命令行下输入:telnet towel.blinkenlights.nl_dos命令星球