路由切换,页面卡顿问题处理

185 阅读1分钟

使用 this.$nextTick 可以确保 DOM 更新完成后再执行后续操作,从而减少页面卡顿和提高性能。具体来说:

  • DOM 更新时机:在 Vue 中,数据变化不会立即反映到 DOM 上,而是会在下一个“tick”中进行批量更新。如果你在数据变化后立即执行路由跳转,可能会导致 DOM 尚未完全更新,从而引发不必要的重绘或回流。
  • 减少重绘和回流:通过 this.$nextTick 确保 DOM 更新完成后才进行路由跳转,可以避免在 DOM 未完全更新时进行操作,减少不必要的重绘和回流,从而提升性能。
  • 优化用户体验:确保用户看到的界面是最新状态,避免了由于 DOM 更新不及时导致的视觉卡顿或闪烁问题。

具体代码示例

其中部分代码中,clickMenuclickChildMenu 方法都使用了 this.$nextTick 来确保 DOM 更新完成后再进行路由跳转:

clickMenu: debounce(function (menu) {
  this.childMenus = menu.children ? menu.children.filter(item => item.meta && !item.meta.hidden) : []
  this.$router.push({ name: this.childMenus.length ? this.childMenus[0].name : menu.name })
}, 300),
clickChildMenu: debounce(function (item) {
  this.$router.push({ name: item.name })
}, 300),
clickMenu: debounce(function (menu) {
  // console.time()
  // 使用 find 方法替代 filter 方法
  const firstVisibleChild = menu.children ? menu.children.find(item => item.meta && !item.meta.hidden) : null
  this.$nextTick(() => {
    this.$router.push({ name: firstVisibleChild ? firstVisibleChild.name : menu.name })
  })
  // console.timeEnd()
}, 100),
clickChildMenu: debounce(function (item) {
  // console.time()
  this.$nextTick(() => {
    this.$router.push({ name: item.name })
  })
  // console.timeEnd()
}, 100),

总结

使用 this.$nextTick 的好处在于它确保了 DOM 更新的同步性,减少了不必要的重绘和回流,从而提升了页面跳转的速度和整体性能。