this.$nextTick(() => {
console.log(‘nextTick回调:’, this.$refs.firstBtn.innerText); // => ‘最后更新’
});
// 也可以作为一个 Promise 使用, 即不传回调
this.$nextTick().then(() => {
console.log(‘nextTick作为Promise:’, this.$refs.firstBtn.innerText); // => ‘最后更新’
});
// 想要立即使用更新后的DOM。这样不行,因为设置message后DOM还没有更新
console.log(‘直接获取:’, this.$refs.firstBtn.innerText); // => ‘未更新’
console.log(‘啥也不干,就是玩。’);
},
},
};
复制代码
点击按钮,打印出来的结果为:
直接获取: 未更新
啥也不干,就是玩。
nextTick回调: 最后更新
nextTick作为Promise: 最后更新
复制代码
从以上例子可以发现:
-
我们多次更改了testMsg的值,但最终只能拿到
this.testMsg = '最后更新'
; -
在更改之后直接获取DOM数据的时候,因为此时DOM还没有更新,所以只能拿到更新前的DOM数据
未更新
-
无论是在
nextTick
回调函数还是then函数中的方法,都会在当前方法内所有同步代码执行完毕之后再执行,然后就能拿到更新后的DOM数据了
这是什么原因呢?
原理
JS运行机制(Event Loop)
JS事件循环(Event Loop)
JS执行是单线程的,它是基于事件循环的。
-
所有同步任务都在主线程上执行,形成一个执行栈。
-
主线程之外,会存在一个任务队列,只要异步任务有了结果,就在任务队列中放置一个事件。
-
当执行栈中的所有同步任务执行完后,就会读取任务队列。那些对应的异步任务,会结束等待状态,进入执行栈。
-
主线程不断重复第三步。
这里主线程的执行过程就是一个tick,而所有的异步结果都是通过任务队列来调度。Event Loop 分为宏任务和微任务,无论是执行宏任务还是微任务,完成后都会进入到一下tick,并在两个tick之间进行UI渲染。
Vue更新策略
同样,Vue 是异步执行 DOM 更新的。更新过程如下:
-
一旦观察到数据变化,Vue 就会开启一个队列,然后把在同一个事件循环 (event loop) 当中观察到数据变化的 watcher 推送进这个队列。
-
如果这个 watcher 被触发多次,只会被推送到队列一次。这种缓冲行为可以有效的去掉重复数据造成的不必要的计算和 DOM 操作。
-
而在下一个事件循环时,Vue 会清空队列,并进行必要的 DOM 更新。
所以,当你设置 this.testMsg = '再次更新';
时,DOM 并不会马上更新,即使你用一个for循环来动态改变数据100次,其实它只会应用最后一次改变。而在异步队列被清空后,也就是下一个事件循环开始时执行更新时才会进行必要的 DOM 更新。
因此,为了确保得到更新后的DOM,所以设置了 Vue.nextTick()
; 可以在数据变化之后立即使用 Vue.nextTick(callback)
,这样回调函数 callback
在 DOM 更新完成后就会调用。
二、Vue.nextTick() 应用场景 应用场景")
需要在视图更新之后,基于新的视图进行操作。
1. 初始化绑定或操作DOM
在 created()钩子函数执行的时候 DOM 其实并未进行任何渲染,同样mounted() 不会承诺所有的子组件也都一起被挂载。而此时进行 DOM 操作无异于徒劳,所以如果你希望等到整个视图都渲染完毕, 一定要将 DOM 操作的 js 代码放进 Vue.nextTick()
的回调函数中。
created() {
// 不使用this.$nextTick()方法会报错
that.$nextTick(() => {
that.$refs.firstBtn.innerHTML = “created 中更改了按钮内容”; //写入到 DOM 元素
});
}
复制代码
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
最后
中年危机是真实存在的,即便有技术傍身,还是难免对自己的生存能力产生质疑和焦虑,这些年职业发展,一直在寻求消除焦虑的依靠。
-
技术要深入到什么程度?
-
做久了技术总要转型管理?
-
我能做什么,我想做什么?
-
一技之长,就是深耕你的专业技能,你的专业技术。(重点)
-
独立做事,当你的一技之长达到一定深度的时候,需要开始思考如何独立做事。(创业)
-
拥有事业,选择一份使命,带领团队实现它。(创业)
一技之长分五个层次
-
栈内技术 - 是指你的前端专业领域技术
-
栈外技术 - 是指栈内技术的上下游,领域外的相关专业知识
-
工程经验 - 是建设专业技术体系的“解决方案”
-
带人做事 - 是对团队协作能力的要求
-
业界发声 - 工作经验总结对外分享,与他人交流
永远不要放弃一技之长,它值得你长期
信仰持有
。
主要内容包括html,css,html5,css3,JavaScript,正则表达式,函数,BOM,DOM,jQuery,AJAX,vue 等等。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
(https://img-blog.csdnimg.cn/img_convert/44bc3d1e2743a7cf1e94e28026aedf8d.png)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-BlodnBw4-1712777969398)]