前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vue小技巧—nextTick

vue小技巧—nextTick

作者头像
前端逗逗飞
发布2021-04-30 10:34:40
5090
发布2021-04-30 10:34:40
举报

nextTick

在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的DOM。

使用方法
this.$nextTick(function(){// 更新了dom})
vue2.1.0后返回了Promise对象,所以可以使用.then()或者结合async await语法糖使用
复制代码
使用场景

在弹出对话框的同时通过ref获取内嵌表格的实例。需等待此次DOM更新完毕,表格组件被挂载到父组件上才能正确获取。这时候就需要结合this.$nextTick使用。

async onOpenDialog() {
      this.model.visible = true
      // undefined
      console.log(this.$refs.form)
      setTimeout(function() {
      // window
        console.log(this)
      }, 100)
      this.$nextTick(function() {
        // parent vm 有疑惑吗?
        console.log(this)
        // form vm
        console.log(this.$refs.form)
      })
      await this.$nextTick()
      // form vm
      console.log(this.$refs.form)
      this.$nextTick().then((vm)=>{
      // parent vm
      console.log(vm)
      // form vm
      	console.log(this.$refs.form)
      })
    }
复制代码
源码解析
function nextTick (cb, ctx) {
    var _resolve;
      // 放入回调函数,等待DOM重新渲染完毕后执行
    callbacks.push(function () {
      if (cb) {
        try {
          // 修改执行上下文,指向当前页面实例
          // 所以在我们没有使用箭头函数的前提下,this指向仍然正确
          cb.call(ctx);
        } catch (e) {
          handleError(e, ctx, 'nextTick');
        }
      } else if (_resolve) {
        _resolve(ctx);
      }
    });
    if (!pending) {
      pending = true;
      timerFunc();
    }
    // $flow-disable-line
    if (!cb && typeof Promise !== 'undefined') {
      return new Promise(function (resolve) {
        _resolve = resolve;
      })
    }
    }
// 原型链上,挂载此方法
Vue.prototype.$nextTick = function (fn) {
      //参数1:回调函数,参数二:页面实例执行上下文
      return nextTick(fn, this)
    };
复制代码
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • nextTick
    • 使用方法
      • 使用场景
        • 源码解析
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档