Vue单页应用路由返回参数记忆处理方式(推荐)

背景

目前很多应用都是单页应用的开发模式,关于路由返回记录上次查询条件或结果的实现方式都大同小异,各有各的实现方法,导致不同项目看起来都很乱,甚至于同一个项目不同终端使用不同的方式去实现,所以需要把这样的功能给插件化,以及代码规范化起来,能让开发者更方便的更改,及阅读。

实现思路

  • 规范化生命周期
    • $backEnter(data):子页面返回进入,传入记录的参数
    • $backOther():其它页面进入,无参数
    • $backLeave() { return {...} }:页面离开,返回需要记录的参数
  • 监听 VueRouter 的路由进入及离开方法
    • vm.beforeRouteLeave(to, from, next):页面离开
    • vm.beforeRouteEnter(to, from, next):页面进入
  • 通过 VueMixin 注入代码
  • 存储 表单参数 通过 SessionStorage 来存储避免不同应用标签数据混淆

插件代码

# mixin/backStorage.js

const Storage = window.sessionStorage;
const SetRouteParam = function (routers = []) {
  return {
    // 离开列表进入详情 缓存参数
    beforeRouteLeave(to, from, next) {
      if (routers?.includes(to.name)) {
        const params = this.$backLeave ? this.$backLeave(to, from, routers) : {};
        Storage.setItem(`${from.name}Params`, JSON.stringify(params));
      } else {
        Storage.removeItem(`${from.name}Params`);
      }
      next();
    },
    // 不是从详情进入当前列表  清除缓存
    beforeRouteEnter(to, from, next) {
      next(vm => {
        // 判断来源是详情的就把缓存的参数赋值给当前列表
        if (routers?.includes(from.name)) {
          try {
            vm.$backEnter && vm.$backEnter(JSON.parse(Storage.getItem(`${to.name}Params`)));
          } catch (error) {
            vm.$backOther && vm.$backOther();
          }
        } else {
          Storage.removeItem(`${to.name}Params`);
          vm.$backOther && vm.$backOther();
        }
      });
    }
  };
};
export default SetRouteParam;

调用方式(例如某路由页面)

import BackStorage from '@/mixin/BackStorage';

export default {
  mixins: [BackStorage(['AttendanceViewDetail'])], # 传入子页面路由用于判断
  data() {
    return {
      search: {
        xxx: '',
        ddd: ''
      },
      pager: {
        page: 1,
        limit: 10,
        totalCount: 0
      },
    };
  },
  methods: {

    /** 路由# 返回进入 */
    async $backEnter({ search, pager }) { # 传入记录参数
      this.search = search;
      this.pager = pager;
      this.netGetList();
    },

    /** 路由# 正常进入 */
    async $backOther() {
      this.netGetList();
    },

    /** 路由# 离开页面 */
    $backLeave() {
      return { search: this.search, pager: this.pager }; # 返回记录参数
    },
  },
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Vue Router 是 Vue.js 官方的路由管理器,用于实现应用 (SPA) 的路由功能。如果在使用 Vue Router 过程中出现路由跳转不起作用的情况,可能是以下几个原因导致的。 1. 路由配置错误:首先要检查路由配置是否正确。在 vue-router 的配置文件中,定义了路由的路径(path)和对应的组件(component),确保路径和组件名称正确匹配。 2. 路由链接错误:在模板中使用 router-link 指令生成链接时,确保链接的 to 属性与路由配置中的路径匹配。如果 to 属性是一个变量,也要确保该变量的值与路由配置相匹配。 3. 缺少路由出口:在初始化 Vue 实例时,需要在模板中配置一个 router-view 标签用于显示匹配到的组件。如果没有在模板中添加此标签,跳转时组件将无法显示。 4. 路由模式设置错误:Vue Router 支持多种路由模式,包括 hash 模式和 history 模式。如果未正确设置路由模式,可能导致路由无法正常跳转。在创建 Vue Router 实例时,可以使用 mode 选项指定路由模式。 5. 路由守卫阻止跳转:Vue Router 提供了路由守卫功能,可以在路由跳转前进行一些操作,如判断用户是否登录等。如果在路由守卫中返回 false 或调用 next(false) 阻止路由跳转,就会导致路由不起作用。检查路由守卫的逻辑是否正确。 6. 其他原因:如果以上情况都没有发生,可能是其他代码逻辑或结构问题导致的。可以仔细检查代码,或者提供更多具体的错误信息,以便进一步分析和解决问题。 总之,当遇到 Vue Router 路由跳转不起作用的问题时,一定要认真排查问题的可能原因,逐个排除错误,以找到正确的解决方法。 ### 回答2: 当Vue Router的路由跳转不起作用时,可以考虑以下一些可能的原因和解决方案: 1. 确保Vue Router已正确安装和配置。首先,需要在项目中安装Vue Router,并将其作为Vue实例的插件来使用。在Vue实例中应该有一个路由器对象,其中包含路由规则和要跳转的路径。 2. 检查路由路径是否正确。确保要跳转的路径在路由规则中存在,并且路径与实际跳转时使用的路径相匹配。可以使用路由对象的`push`或`replace`方法来进行路由跳转,这些方法可以接收一个路径参数。 3. 确保路由器视图被正确渲染。在Vue组件中,应该有一个包含`<router-view>`标记的容器,这是用于显示路由组件的地方。如果路由没有正确显示,可能是因为没有正确放置`<router-view>`标记。 4. 检查路由的钩子函数是否正确使用。Vue Router提供了几个钩子函数,例如`beforeEach`和`beforeResolve`,可以用于在路由跳转之前进行某些操作,如验证用户身份等。如果这些钩子函数中的逻辑有问题,可能会导致路由跳转不起作用。 5. 检查浏览器的控制台输出。当发生路由错误时,通常会在浏览器的控制台中显示相关错误信息。通过查看控制台输出,可以更好地了解问题的具体原因。 总结:当Vue Router的路由跳转不起作用时,可以先检查Vue Router的安装和配置是否正确,然后检查路径是否正确,确保正确渲染路由视图,检查路由的钩子函数和浏览器控制台输出,以找出问题所在并解决。 ### 回答3: 当vue-router的路由跳转不起作用时,可能有以下几个原因: 1. 路由路径配置错误:检查路由配置文件中的路径是否正确。确保路径前面没有多余的斜杠或其他字符,并且完全匹配路由路径。 2. 没有使用router-link组件:如果没有使用对应的router-link组件,直接在代码中使用`router.push()`或`this.$router.push()`方法进行跳转是无效的。 3. 路由实例未创建:在使用路由跳转之前,需要确保已经创建了Vue Router实例,并将其注入到Vue实例中。示例代码如下: ```js import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) const router = new VueRouter({ routes: [ // 路由配置 ] }) new Vue({ router, // 其他Vue实例配置 }).$mount('#app') ``` 4. 路由跳转方式错误:在使用`router.push()`方法进行跳转时,需要传入一个对象参数,示例代码如下: ```js this.$router.push({ path: '/example' }) ``` 如果需要在路由跳转中传递参数,可以使用`query`或者`params`选项,如: ```js // 使用query传递参数 this.$router.push({ path: '/example', query: { id: 1 } }) // 使用params传递参数 this.$router.push({ path: '/example', params: { id: 1 } }) ``` 5. 浏览器不支持HTML5 History模式:如果使用了HTML5 History模式进行路由跳转,在一些不支持HTML5 History API的浏览器中会导致路由跳转失败。可以尝试切换为Hash模式,或者使用polyfill来解决兼容性问题。 这些是常见的导致vue-router路由跳转失败的原因,通过检查以上几个方面可以尝试解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值