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

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

时间2025-09-19 13:08:37分类IT科技浏览5974
导读:前言...

前言

学习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
python中左对齐,居中对齐(python上下文管理器如何实现类)