vue中获取v-for异步数据dom的完美解决方案
问题描述每次加载界面时,在 mounted阶段,只能获取普通dom(指静态渲染的dom),获取不到v-for的dom,尽管使用$nextTick也获取不到,虽然使用setTimeOut能解决,但这种方法真的很low,作为程序员要追求完美,下面我们看看怎么完美解决这个问题。原因在v-for里的数据是异步获取的,里面的id或者class也都是动态绑定的,而mounted阶段只是实例挂载完成,这时候异步
问题描述
每次加载界面时,在 mounted
阶段,只能获取普通dom(指静态渲染的dom),获取不到v-for的dom,尽管使用$nextTick
也获取不到,虽然使用setTimeOut
能解决,但这种方法真的很low,作为程序员要追求完美,下面我们看看怎么完美解决这个问题。
原因
在v-for里的数据是异步获取的,里面的id或者class也都是动态绑定的,而mounted阶段只是实例挂载完成,这时候异步请求的数据大概率还没请求完成,从而v-for要渲染的dom肯定也还没开始渲染,这时候连异步请求的数据都获取不到,更别说需要异步数据来渲染的dom了。
而$nextTick
是指整个视图渲染完成,注意这里不包含异步请求的数据,在整个视图渲染完成时异步数据未必能请求到。所以调用$nextTick
其实也没什么两样。
解决思路及方案
第一种并不是很完美的方案:使用updated钩子
updated 阶段是完成了数据更新到 DOM 的阶段(对加载回来的数据进行处理),此时,在使用document等获取dom是可以得到的。
updated 与 mounted 不同的是,在每一次的 DOM 结构更新,Vue.js 都会调用一次 updated 钩子函数!而 mounted 钩子函数仅仅只执行一次而已。
但是,本人不推荐这么做,因为如果项目中数据更新很频繁,虚拟dom也会跟着经常更新,如果在updated中获取dom,会造成操作过于频繁的问题,也就会多多少少影响程序性能。在vue官方也有提到。
完美解决的方案:在异步数据获取完成时调用$nextTick
获取dom
想获取异步请求数据渲染的dom就一定得等到数据接收到后再进行相应的操作。而有同学就问了,为什么在获取到数据后还要调$nextTick
呢?
因为获取到数据之后v-for去动态渲染dom肯定也是需要一定时间的,不可能马上就能渲染完成,所以在获取到异步数据之后再等整个视图渲染完成时去获取dom是最好的选择。那要在created
或者mounted
或者在watch
中获取就看个人选择了。
在created
或者mounted
中需要在获取完数据后在then
或者await
接受返回的数据再调用$nextTick
获取dom,在watch中就直接监视请求的数据,数据改变就说明获取到了,就可以调用$nextTick
获取dom了。
更多推荐
所有评论(0)