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 已经更新');
});
相关推荐
莪_幻尘2 小时前
4 个 3D 游戏,总体积 3.82MB:拆解 Claude 的 one-shot 工程链路
前端·ai编程·three.js
Highcharts.js2 小时前
Highcharts智能数据分析平台Orbit 多语言配置技术文档
java·前端·javascript·highcharts·orbit·智能数据分析·设置文档
ABAP-張旺3 小时前
SAP ABAP 实战:SAP GUI上做 HTML 看板报表
前端·html·sap·abap
时间的情敌3 小时前
Cesium 建筑单体化、3DTiles 分类、楼层显隐、分户高亮(BIM + 倾斜孪生高频)
前端·3d·cesium
IT_陈寒3 小时前
JavaScript项目实战经验分享:从内存泄漏到性能优化的血泪史
前端·人工智能·后端
计算机毕设定制辅导-无忧学长4 小时前
《基于Spring Boot的迷游哈游戏综合服务平台的开发》
java·vue.js·spring boot·mysql·迷游哈游戏综合服务平台
恋猫de小郭5 小时前
Flutter 3.50 & Dart 3.14 发布,快来看看有什么更新吧
android·前端·flutter
非优秀程序员12 小时前
第10章 千团出世|《互联网产品恩仇录》
前端
非优秀程序员12 小时前
第11章 小高在对面|《互联网产品恩仇录》
前端
非优秀程序员12 小时前
第14章 只剩美团|《互联网产品恩仇录》
前端