vueRouter的afterEach如何才能不阻塞DOM的更新?

作者站长头像
站长
· 阅读数 15

目前我有一个需求:进入某个页面时,要提示用户当前页面下的新增功能,内容是文字和gif。目前设计的是新增提示的时候按照页面路由来配置,我再路由的afterEach钩子中判断是否需要弹出提示框。问题在于每个新功能提示可以设置开始和截止时间,同时用户点击“已了解”后,不再弹出本次显示的提示,但是当有更新的功能时还是要弹出。那么我在“判断是否需要弹出提示框”这一步时就需要调后台接口拿数据进行判断,但是实测这样会直接阻塞DOM更新,待处理完毕之后才渲染页面,目前陷入瓶颈,想不到解决方案。

回复
1个回答
avatar
test
2024-07-11

Vue Router 的 afterEach 钩子并不会阻塞 DOM 更新,因为它是在导航完成时被调用的。你在 afterEach 钩子中的异步操作可能会导致用户感知到延迟。为了解决这个问题,你可以将获取提示数据的逻辑从 afterEach 移到组件内部,并在组件的 created 或 mounted 生命周期钩子中进行异步请求。这样做可以让页面先渲染,然后再显示提示框。

步骤如下:

在 Vuex 或一个全局状态管理器中存储提示数据,以便在不同组件间共享。移除 afterEach 中的提示框逻辑。在需要显示提示的组件中,添加 created 或 mounted 生命周期钩子,并在其中调用后端接口获取提示数据。根据接口返回的数据判断是否需要显示提示框,如果需要则显示。这是一个简单的示例:


// store.js
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    newFeatureInfo: null,
  },
  mutations: {
    setNewFeatureInfo(state, info) {
      state.newFeatureInfo = info;
    },
  },
  actions: {
    async fetchNewFeatureInfo({ commit }) {
      // 请求后端接口获取数据
      const response = await axios.get('/api/new-feature-info');
      commit('setNewFeatureInfo', response.data);
    },
  },
});
// YourComponent.vue
<template>
  <!-- 页面内容 -->
  <div>
    <!-- 在这里根据条件显示提示框 -->
    <NewFeaturePopup v-if="showPopup" @close="closePopup" />
  </div>
</template>

<script>
import { mapState, mapActions } from 'vuex';
import NewFeaturePopup from './NewFeaturePopup.vue';

export default {
  components: {
    NewFeaturePopup,
  },
  data() {
    return {
      showPopup: false,
    };
  },
  computed: {
    ...mapState(['newFeatureInfo']),
  },
  methods: {
    ...mapActions(['fetchNewFeatureInfo']),
    closePopup() {
      this.showPopup = false;
    },
  },
  async created() {
    await this.fetchNewFeatureInfo();
    // 根据 newFeatureInfo 判断是否需要显示提示框
    if (this.newFeatureInfo && /* 其他条件 */) {
      this.showPopup = true;
    }
  },
};
</script>

通过这种方式,你可以在不阻塞 DOM 更新的情况下获取提示数据,并在需要的时候显示提示框。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容