vue动态路由刷新丢失解决方案

本文介绍了解决Vue.js中动态路由刷新导致空白页或404错误的方法。通过使用本地存储结合Vuex来记录和判断页面刷新状态,并提供具体的代码实现方案。

问题出现的问题

  1. 动态路由添加刷新页面出现空白页面或者404页面

因为界面刷新导致动态路由丢失,所以是空页面或者404

  1. 我添加动态路由了怎么还剩刷新依旧是空白页面呢?

因为动态路由添加后需要是新导航才会生效

解决方案

需要判断当前页面是否刷新了

  1. 本地存一个当前访问页面的路由下次刷新用来判断当前是否是页面刷新
  2. 使用vuex来存储动态路由数据,如果是空就是刷新页面了

案例

  1. 使用本地存储 使用路由拦截器跳转之后存数据
//存访问路由
router.afterEach((to, from) => {
  localStorage.setItem("new",to.path)
  })
//处理动态路由
router.beforeEach((to, from, next) => {
 if(localStorage.getItem('new')){
        var path: any = localStorage.getItem('new')
        if (path == to.path) { //动态路由页面的刷新事件
          // localStorage.removeItem('new')
          store.commit('setBaseRouters')
          router.replace({...to});
        }
      }
})
  1. vuex处理更简单 需要添加路由拦截进行逻辑处理
router.beforeEach((to, from, next) => {
  store.commit('loginModule/isLogin')
  const isloginPage: boolean = getFilterRouterName((to.name as string));
  let state: any = store.state
  if (isloginPage || state.loginModule.isLogin) {
    if (state.baseRouters.length==0) {
      store.commit('setBaseRouters')
      router.replace({...to});
    }
    next()
  }
  else {
    next({ name: LOGIN })
  }
  if (to.matched.length === 0) {
    // ElMessage.warning("当前路由不存在");
    /**
     * user_type :customer
      user_type :  supplier
     */
      //只有登录了才进入这个逻辑判断
      if(state.loginModule.isLogin){
        if(localStorage.getItem('userinfo')){
                let data = JSON.parse(localStorage.getItem('userinfo'))
        if (data.user_type == 'customer') {
        //这里处理如果访问项目根路径访问的
          if (to.path == '/admin/') {
            router.replace(import.meta.env.VITE_BASE + "/***");
          }
        } else {
          next({ name: PRODUCT })
        }
        }
    
      }
    
  }
})
Vue 2 中,动态路由刷新丢失通常是由于路由信息未持久化到服务器或本地存储导致的。以下是常见原因和解决方案: --- ### **原因分析** 1. **前端路由未持久化**:动态添加的路由仅保存在内存中,刷新后重置。 2. **后端未配置路由回退**:未处理前端路由的404情况,导致刷新后返回默认页面(如`index.html`)。 3. **路由守卫逻辑缺失**:未在应用初始化时重新注册动态路由。 --- ### **解决方案** #### 1. **前端持久化动态路由** 在 `router/index.js` 中,将动态路由存储在本地(如 `localStorage` 或 `Vuex`),并在应用启动时重新注册: ```javascript // router/index.js import Vue from 'vue'; import Router from 'vue-router'; Vue.use(Router); // 静态路由 const constantRoutes = [ { path: '/login', component: () => import('@/views/Login') } ]; const router = new Router({ mode: 'history', routes: constantRoutes }); // 动态路由(示例) const asyncRoutes = [ { path: '/dashboard', component: () => import('@/views/Dashboard') } ]; // 从本地存储恢复动态路由(可选) function initDynamicRoutes() { const savedRoutes = localStorage.getItem('dynamicRoutes'); if (savedRoutes) { const routes = JSON.parse(savedRoutes); routes.forEach(route => router.addRoute(route)); } else { asyncRoutes.forEach(route => router.addRoute(route)); } } // 在应用启动时调用(如main.js) initDynamicRoutes(); export default router; ``` #### 2. **后端配置路由回退** 确保服务器(如 Nginx、Apache)将所有前端路由请求重定向到 `index.html`: ```nginx # Nginx 示例 location / { try_files $uri $uri/ /index.html; } ``` #### 3. **结合路由守卫重新注册** 在全局前置守卫中检查用户权限并动态添加路由: ```javascript // router/index.js router.beforeEach((to, from, next) => { if (isLoggedIn() && !hasDynamicRoutes) { fetchUserRoutes().then(routes => { routes.forEach(route => router.addRoute(route)); hasDynamicRoutes = true; next({ ...to, replace: true }); // 重新跳转以触发新路由 }); } else { next(); } }); ``` #### 4. **使用 Vuex 持久化状态** 通过 `vuex-persistedstate` 插件保存路由状态: ```javascript // store/index.js import createPersistedState from 'vuex-persistedstate'; export default new Vuex.Store({ plugins: [createPersistedState()], state: { dynamicRoutes: [] }, mutations: { setDynamicRoutes(state, routes) { state.dynamicRoutes = routes; } } }); ``` --- ### **注意事项** - **安全性**:动态路由可能暴露敏感路径,需结合权限验证。 - **性能**:频繁操作路由可能影响性能,建议初始化时一次性加载。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值