vue nextTick的简化版

以下内容来源于通义千问 的回答

在 Vue.js 中,$nextTick 的核心功能是在下次 DOM 更新循环结束之后执行延迟回调。这是因为 Vue 使用异步更新队列来优化渲染性能,当数据发生变化时,并不会立即更新 DOM,而是在同一事件循环结束时批量更新。

要实现一个类似的工具函数,可以参考 Vue.js 源码中 nextTick 的基本思路,主要依赖于 Promise 和浏览器的异步机制(例如 MutationObserver、Promise.resolve().then() 或 setTimeout(fn, 0)来保证回调在 DOM 更新之后执行。

简化版的模拟实现

dart 复制代码
function nextTickLikeVue(callback) {
  let timerFunc;

  if (typeof Promise !== 'undefined' && Promise.toString().indexOf('[native code]') !== -1) {
    // 如果环境支持原生 Promises
    timerFunc = () => Promise.resolve().then(callback);
  } else if (typeof MutationObserver !== 'undefined' && typeof window !== 'undefined') {
    // 如果环境支持 MutationObserver
    let obs;
    const queue = [];
    const observer = new MutationObserver(() => {
      callback();
      queue.forEach(cb => cb());
      queue.length = 0;
    });
    timerFunc = (cb) => {
      if (queue) {
        queue.push(cb);
      } else {
        callback();
      }
      if (!obs) {
        obs = observer.observe(document.body, { childList: true, subtree: true });
      }
      return () => {
        if (queue) {
          const index = queue.indexOf(cb);
          if (index > -1) queue.splice(index, 1);
        }
        if (queue.length === 0) {
          observer.disconnect();
        }
      };
    };
  } else if (typeof setTimeout !== 'undefined') {
    // 最后一种情况,如果以上都不支持,则降级使用 setTimeout
    timerFunc = (cb) => setTimeout(cb, 0);
  } else {
    throw new Error('No suitable method found for deferred execution of the callback.');
  }

  // 执行 timerFunc,返回清理函数(如果有)
  return timerFunc(callback);
}

// 使用示例:
nextTickLikeVue(() => {
  console.log('DOM 已经更新');
});
相关推荐
hunterandroid14 分钟前
HarmonyOS HUKS 密钥全生命周期实战:生成、轮换与失效处理
前端·华为
damoluomu16 分钟前
SSG 的后台怎么补:Node.js 生态里的三条路(番外二)
javascript·css·typescript·node.js·html
东鹏特饮23 分钟前
贪吃蛇小游戏html
前端·javascript·html
溪语流沙25 分钟前
【每天一个CSS | Day23】边框上有一道光在跑的流光呼吸卡片
前端·css
小马不起床27 分钟前
零基础玩转 FastAPI_10:前端登录、权限与布局
前端·状态模式·fastapi
程序员Sunday34 分钟前
JavaScript 深拷贝和浅拷贝有什么区别?structuredClone 能替代 JSON 拷贝吗?
前端·javascript
ShineWinsu1 小时前
对于CSS:选择器的解析
前端·css·面试·html·web·选择器·网页
m0_587383001 小时前
碰碰好评卡功能落地实战 从需求梳理到上线部署全流程实操指南
java·linux·服务器·前端·javascript·vue.js·人工智能
Pu_Nine_91 小时前
Vue‑Flow 从零入门实战|AI‑Agent 拓扑图开发
前端·javascript·vue.js
keyipatience1 小时前
CSS 学习(1):语法、引入方式、选择器、字体与背景
前端·css·html