首页IT科技mount和climb(简单易懂 关于nextTick()的理解)

mount和climb(简单易懂 关于nextTick()的理解)

时间2025-08-03 13:53:09分类IT科技浏览4926
导读:前言...

前言

学习Vue的过程中                ,大家肯定都使用过nextTick()                    ,关于nextTick()的使用时机       ,大家肯定都知道            ,那么它的工作原理是怎样的呢                     ,本文就简单说一下它的nextTick()的工作原理            。

nextTick的使用时机

首先记住:nextTick所指定的回调会在浏览器更新DOM完毕之后再执行                       。

举个例子:

在我自己做的一个单页面应用中          ,我有一个需求        ,当从后端请求回数据后                      ,马上就对页面进行更新        。比如             ,我要点击操作里的删除操作    ,前端删除数据后就向后端发请求                       ,后端删除数据后返回数据                ,如果我们想马上显示到页面上,应该怎么做呢?

可能好多人会像我第一次做那样                    ,比如我这个页面是用 v-for 遍历data这个数据显示出来的                    ,可能好多人就会直接把前端返回的数据直接重新赋值给data         。但是这样是绝对不行的!这样只会导致数据其实是变了    ,但是视图是不会变的                ,因为vue更新dom是异步的                    ,无法通过同步代码赋值后马上去更新页面                      。所以即使删除成功了页面也不会显示出来            。即使显示删除成功       ,页面也不会更新      。

如何更新

我们的需求是            ,请求回数据后马上更新页面                     ,首先理解几个点                     。

1            、vue更新Dom是异步更新                。

如图官网的描述          ,解释一下这段话        ,直接看可能有些懵                      ,前两句话             ,关于同步和异步    ,以及提到的"事件循环"                       ,这就要从JS的运行机制说起                ,戳我前往   。第三句话,“如果同一个 watcher 被多次触发                    ,只会被推入到队列中一次                ”                    ,这是什么意思呢    ,也在我的文章中可找到                ,戳我前往                    。

2                       、理解执行时机

读完上面两篇文章                    ,大家应该就知道宏任务和微任务了把       ,而nextTick内部就是调用宏任务和微任务来完成事件调用的机制            ,让nextTick里的回调在一个事件循环的最后执行                    。为什么要在最后呢?在最后即意味着在所有异步任务之后                     ,记得上一点吗          ,“vue更新Dom是异步更新                    ”        ,而我们又把nextTick里的回调放在了所有异步任务的最后                      ,这样就解释了最开始那句话             ,nextTick所指定的回调会在浏览器更新DOM完毕之后再执行。

3        、回到例子实现需求

我们想要实现需求    ,本例我们采用热更新                       ,即只更新局部组件                。

我直接把我的子组件全放在router-view里的                ,通过变化v-if来实现组件更新                        。

看到这里可能有人会问,这不就是先把v-if设为false                    ,再设置为true来实现吗                    ,要不要nextTick都一样    ,那么这样想就大错特错了    。

还记得刚才说的“如果同一个 watcher 被多次触发                ,只会被推入到队列中一次       ”                    ,那篇文章已经解释过了       ,vue会把所有代码都执行了再去渲染页面            ,所以我们这两条this.$isRouterAlive = false 和 this.$isRouterAlive = true                     ,相当于只执行了最后一条等于true          ,false都没执行过        ,所以相当于还是什么都没做                      ,原始是true             ,现在还是true            。

加了个nextTick就不一样了    ,这段代码就相当于告诉vue                       ,vue你先帮我执行 this.$isRouterAlive = false                ,先不要管我nextTick里的东西,你去渲染完了最后再来执行我nextTick里的代码                       。

这样一说大家是不是就比较明白了                    ,this.$isRouterAlive = true 是在页面渲染过后 再执行的                    ,所以我们肉眼看其实已删除货物    ,页面马上就更新了                ,其实其中经过了先把router-view里的子组件取消掉                    ,即v-if = false       ,然后再让 v-if = true            ,那么v-if大家都知道就是创建                     ,相当于router-view里的内容被重新创建了          ,所以此时的数据也是最新的        。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
穿越火线下载不了怎么办(穿越火线下载安装成功后玩不了是怎么回事?) OpenCV安装(python OpenCV中的阈值是什么)