vue大量循环影响页面渲染

这边记录分享一个最近在工作中遇到的问题

在没有获取后端接口的前提下,在mounted中写了大量的操作,将一个变量设置为true,在执行了大量的循环之后,再将这个值置为false,但是打印出来这个值都是正常的,但是页面渲染中这个值并没有改变。

在想几种办法之后,我发现将循环和置为false的操作放在setTimeOut中之后才能渲染正确,变量的值改变时间打印出来很短,所以问题出在页面的渲染上,我查找了很多之后发现了问题所在。

vue页面渲染机制

vue页面的渲染时间在一个宏任务结束之后或者在另一个微任务开始之前。

宏任务和微任务

宏任务有哪些

setTimeout,setInterval,Ajax,DOM事件等

微任务有哪些

Promise(的.then等回调函数),async/await等

例如:

console.log('start');          // 1
function foo(){
   console.log('foo');           
}
foo()                          // 2
setTimeout(function() {        //异步代码中的宏任务,先挂起
   console.log('setTimeout'); // 7
},1000)
new Promise(resolve =>{
   console.log('promise');    // 3
   resolve()
})
   .then(function() {        //异步代码中的微任务,先挂起
       console.log('promise1');// 5
   })
   .then(function() {        //异步代码中的微任务,先挂起
       console.log('promise2');// 6
   })
console.log('end');            // 4

执行的结果为

start
foo
promise
end
promise1
promise2
setTimeout
宏任务会先执行,然后是微任务,setTimeout是异步宏任务,会被当做新的宏任务去执行,而新的宏任务开始前会先把之前的微任务执行完,所以才有这样的结果。

所以当我在mounted中没有执行上述的宏任务或者微任务时,所以循环内的操作都将被看做是一整个宏任务,而且在循环之后并没其他宏任务,所以页面渲染在循环执行之前,渲染出现问题。所以这里我使用setTimeOut包裹起来循环,此部分是新的宏任务,所以页面会再次进行渲染,显示就正常了

### 关于 `v-for` 渲染过程中断的解决方案 当处理大量数据时,`v-for` 循环可能会导致性能问题甚至渲染中断。一种有效的替代方法是采用虚拟滚动技术来优化列表渲染。 #### 使用 `Akryum/vue-virtual-scroller` 对于大规模的数据集,`Akryum/vue-virtual-scroller` 提供了一种高效的解决方案[^1]。此库仅渲染当前视窗内的元素,从而显著减少DOM操作并提高应用响应速度: ```html <template> <RecycleScroller class="scroller" :items="bigList" :item-size="30" key-field="id" v-slot="{ item }"> <div class="item">{{ item.label }}</div> </RecycleScroller> </template> <script> import { RecycleScroller } from 'vue-virtual-scroller' export default { components: { RecycleScroller, }, data() { return { bigList: Array.from({ length: 1000 }, (_, index) => ({ id: index, label: `Item ${index}` })) } } } </script> ``` 通过这种方式,即使面对成千上万条记录也能保持流畅用户体验的同时避免了传统 `v-for` 带来的潜在风险。 此外,在某些场景下如果不需要如此复杂的组件也可以考虑分页加载或是懒加载策略来减轻一次性渲染的压力;而对于简单的页面内定位需求,则可借助像 `vue-scrollto` 这样的轻量级插件实现平滑过渡效果而不影响整体架构稳定性[^2]。 ### 配合 Vue Router 实现更优体验 值得注意的是,在构建单页应用程序(SPA)时合理运用 `vue-router` 能够进一步提升导航效率以及状态管理能力[^3]。例如可以在切换不同路由前预先获取所需资源或者设置合适的守卫防止不必要的重复计算等措施均有助于改善由频繁更新引起的卡顿现象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值