vue中updated重复加载问题怎么解决

父组件传了一个属性我需要用這个属性发请求,如果把请求放在mounted里就会只执行一次以后再触发更新,子组件不会重新渲染如果把请求放在beforeUpdate和updated里 就会无限发请求;

}

    本文继续探索中的坑关于的生命周期和异步加载相关处理的文章还比较少,可能是自己没有用谷歌而用百度的缘故吧关于异步操作和生命周期,会牵扯到浏览器的单線程处理机制以及ES中的promise对象,有兴趣的可以事先了解一下再看下去当然我自己对单线程的处理机制可能了解的也不是很深,写的不对请指正。

    关于本文中生命周期的理解一切以实际出发,为什么要强调这个因为实际情况和官方API有些出入,当然我会说明发生这种情況的两种合理的解释

    首先,要明确一件事我在做开发的时候,用的是-cli脚手架工具搭建的环境如果是初学者,请务必!!!不要往下看了因为下面的内容会让你对的生命周期造成误解。

如果你对生命周期的概念还比较模糊请顺序阅读

    挂载dom前(beforemount),说实话如果你真嘚是新手的话,挂载两个字可能不是很理解因为我之前也觉得说这么深奥搞鸡毛,我根本听不懂好吧当然我现在觉得这不是说的很对嗎!那我通俗的解释一下,挂载前就是生成了一堆虚拟的dom,你可以理解为一个json格式的字符串如下所示,生成的虚拟dom还没有解析双大括號里面的内容只是单纯的放着。

    挂载dom完毕(mounted)根据上面的说法,这一步骤就好理解了就是说dom中的各种特性如双大括号绑定数据之类嘚都搞定了,而且我把它放到html文档流中去了

    销毁完毕 ,关于销毁的触发你可以尝试用v-if,这是坠简单的同时你也能发现v-if和v-show的本质区别叻,当然在单页面应用中(-router)你也可以用“跳转页面”实现上一页面的组件销毁,了解一下就行

    更新视图完毕,这两个周期都在更新數据时触发是数据驱动模版最重要的一环。

    关于这八个生命周期先聊一下个人的理解,其实我觉得他的设计初衷跟人的生老病死是一樣的前六个对应的分别是

    出生前,出生学校阶段,学以致用阶段准备后事,入土为安

    至于触发更新就不在这六个阶段之内了

    那么,这六个阶段是不是按顺序执行的呢可以说是,也可以说不是

    先说为什么是,来看我网上抄来的一段代码

ponent也就是其中的一个子页面嘚组件实例,而不是全局的

    好的,现在知道哪儿出了问题但是,官网并没有给为什么子组件初始化的时候在挂载dom前这个生命周期为什麼没有虚拟dom的理由那只能猜了(当然啃源码只坠吼滴)。

    1.个人认为比较扯淡的理由在官方论坛看到的,但讲的还不错如果你想获取$el,你可以去mounted状态获取所以不用beforeMount状态就好了,在实际开发过程中确实很少使用这个生命周期,因此觉得这么解决好像也能敷衍过去

刚財已经说到,-router作为单页面应用每个页面其实就是一个组件,而且每个页面中的this指向本身也就是子页面自己,而不是组件的父级当然伱可以通过this.$parent.$parent(这里我没有打错,就是要找父级的父级没搞明白为什么,有大佬知道的告诉我下)去访问全局的当你访问this.$parent.$parent.$el的时候你可以发现beforeMount嘚时候子组件并没有被挂载,作为单页面应用每一个子页面的虚拟dom应该交由他的父级去处理,因此在子组件内部的beforeMount状态中还没有关于$el的描述也是情理之中的

    关于另外两个状态,更新数据和更新dom完毕在检测到数据改变时就会触发,但搜集大部分使用者的建议是用watch、computed等方法去监控或处理数据,尽量不要在这两个状态去变更数据我同意大部分人的看法,所以这两个状态就不详细介绍了实际生产过程中吔很少用到。

我不敢保证上面那部分说的是对的但我敢保证你继续往下看会发现更多错

    刚才我说道,的生命周期可以是顺序执行的也鈳以不是,刚才讲的是顺序执行的情况下面来说一说异步数据加载的原理以及带来的各种负面影响。

    先上一段代码在刚才的基础上+一兩句

setTimeout(() => { //这里只是为了偷懒用了ES6的箭头函数,如果是普通函数请注意this指针修改中请不要滥用箭头函数,出了问题找都找不到

请配合官方异步哽新原理和打印结果细细体会建议先把个人理解的通俗版的看完,再看官方的解释

可能你还没有注意到 异步执行 DOM 更新。呮要观察到数据变化 将开启一个队列,并缓冲在同一事件循环中发生的所有数据改变如果同一个 watcher 被多次触发,只会被推入到队列中一佽这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作上非常重要。然后在下一个的事件循环“tick”中, 刷新队列并执行实际 (已去偅的)

首先可以注意到的点就是程序并不会顺序执行,怎么说呢我们可以从控制台打印看到,在执行代码的时候并没有去管定时器里發生了什么事情,甚至我已经设置了0延时他依旧会去顺序执行其他生命周期,看起来就像跳过了这些异步加载当我们访问接口的时候,这时我们就开启了一个异步加载发生的事情和上面的差不多。因此可以确定的一个点就是生命周期中的任何异步操作,都不会按照順序执行他会在非异步操作结束后执行,因此书写这部分代码的时候请注意里面的逻辑不要和顺序挂钩要确保任何异步操作即使最后執行,之前的程序也不会发生异常从而阻塞整个进程

    这样说起来可能有点复杂,这里我举一个用起来特特特特别蛋疼的地方你们就明白叻.

//假装接口返回了一些信息给你如一个人,然后你把这些信息赋值给了this实力

    你(哔哔哔)是不是瞎我明明在created的时候把person信息给你了呀,伱竟然说你mounted阶段解析数据的时候解析不出来菜鸡!

发生这个问题的原因就是,访问接口是一个异步操作当程序顺序执行生命周期的时候,并不会理你这个异步操作打个比方,生命周期和异步操作就像浏览器的两个工厂两个工厂以及里面的车间可以一起开工,但是生命周期车间享有我没完工,你异步操作就必须等我搞完的权利因此,不管异步操作是否可以在生命周期结束前执行回调他都只能乖乖的排在后面等待。因此当解析器解析到this.person.name.firstName的时候他还真是个undefined,所以遇到类似问题没别的办法,你只能乖乖的把变量的所有字段预先定義好(当然你也可以不理会报错因为从结果上来看,程序还是会正确执行但程序员或多或少都有点强迫症,看到那种红色字体就浑身難受)至于为什么要这样管理,就跟浏览器的单线程处理机制有关了你可以理解为,这两个工厂有一个共同的管理员(处理器)这個管理员同时只能管理一个工厂,而且这个管理员特别偏心他都是等javaScript普通操作全部完工了,再去处理异步车间的事情因为异步车间往往比普通车间消耗的时间要长,这就好像小学时候老师从隔壁办公室进教室抓讲话的人每次就抓我,哪怕我有时候没讲话就很气,但昰并没有什么办法~

如果把所有的异步操作看作一个工厂的话那么不同的异步操作就好像工厂里不同的车间,他们可以同时干活而且同┅个车间里的活只汇报一次,哪怕你老是改订单量但最终这个车间汇报的都是最后的结果,不会因为你改了一百次订单量我就汇报一百次,那管理员没那么空同时车间汇报也按照订单完成顺序排队,即便同时完成也要等管理员处理完其中一个,下一个才能进去这僦是单线程的蛋疼之处,当然单线程也有很多好处有兴趣的可以自己了解一下。

    关于生命周期和异步加载就理解到这儿有错可以提醒峩,毕竟我也是个小白~

}

请教怎么解决的,同一个问题

登录后参与交流、获取后续更新提醒

}

我要回帖

更多关于 vue demo 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信