nextTick




let queue = [];
let has = {};
let pending = false;
function queueWatcher(watcher) {
    const id = watcher.id;  //对watcher进行去重
    if (has[id] == null) {
        queue.push(watcher);  //并且将watcher存在队列中
        has[id] = true;

        // 等待所有同步代码执行完毕后在执行
        if (!pending) {  //如果还没清空队列,就不要再开定时器了。 防抖处理 多次调用只处理一次
            /* setTimeout(() => {
                queue.forEach(watcher => watcher.run());
                queue = []; //清空watcher队列,为了下次使用
                has = {};  //清空标识的id
                pending=false;
            }, 0); */
            nextTick(flushScheduleQueue);
            pending = true;
        }
    }
    queue.push(watcher);
}
let queue = [];

function flushScheduleQueue(){
    queue.forEach(watcher => {watcher.run();watcher.cb()});
    queue = []; //清空watcher队列,为了下次使用
    has = {};  //清空标识的id
    pending=false;
}

const callbacks=[];
let pending=false;
function flushCallbacks(){
    while(callbacks.length){
        let cb=callbacks.pop();
        cb();
    }
    pending=false;  // 标识已经执行完毕
}
let timerFunc;

if(Promise){
    timerFunc=()=>{
        Promise.resolve().then(flushCallbacks);  //异步处理更新
    }
}else if(MutationObserver){ //可以监控dom变化,监控完毕后是异步更新
    let observe=new MutationObserver(flushCallbacks);
    let textNode=document.createTextNode(1);
    observe.observe(textNode,{characterData:true});
    timerFunc=()=>{
        textNode.textContent=2;  //文中的内容改成2
    }
}else if(setImmediate){
    timerFunc=()=>{
        setImmediate(flushCallbacks);
    }
}else{
    timerFunc=()=>{
        setTimeout(flushCallbacks);
    }
}




export function nextTick(cb){ //因为内部都会调用nextTick 用户也会调用,但是异步只需一次。
    callback.push(cb);
    if(!pending){
        // vue3 里的nextTick原理就是promise.then 没有做兼容性处理了。
        timerFunc(); //这个方法是异步方法 做了兼容处理
        pending=true;
    }
    
}


export function stateMixin(Vue){
    Vue.prototype.$nextTick=function(cb){
        console.log(cb);
    }
}


// 数据更新完成之后,调用vm.$nextTick(()=>{})   异步批量更新 标识当前是否处理
// console.log(vm.$el.innerHTML);  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vues

刚好遇见你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值