iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue实现关联页面多级跳转(页面下钻)功能的完整实例
  • 612
分享到

Vue实现关联页面多级跳转(页面下钻)功能的完整实例

2024-04-02 19:04:59 612人浏览 安东尼
摘要

背景 在项目开发过程中,经常会遇到从上一个页面跳转到下一个页面的需求,俗称 下钻 。比如在概览页面的数据,需要查看详情,点击某个图表或按钮,即可跳转到详情页面查看详情数据。 目前为

背景

项目开发过程中,经常会遇到从上一个页面跳转到下一个页面的需求,俗称 下钻 。比如在概览页面的数据,需要查看详情,点击某个图表或按钮,即可跳转到详情页面查看详情数据。

目前为止,我们的项目中还没有一个统一的页面跳转方法,实现页面跳转的方式也因人而异,并且现有的很多项目只能在两个页面之间来回跳转,基本没有完整的实现多个页面互相跳转的功能。

关联页面跳转做为项目的常用功能,并且执行的都是重复性高的代码逻辑,非常有必要把相关的逻辑抽出来,封装成简单易用的公共方法和公共组件。

目的

统一各个项目的关联跳转方法逻辑,封装成简单易用的公共组件。

方案设计

首先,分析一下关联页面跳转大概的逻辑步骤:

  1. 进入 页面 A ;
  2. 从 页面A 跳转到 页面 B ;
  3. 进入 页面 B ;
  4. 返回 页面 A ;
  5. 进入 页面 A ,即重新回到步骤 1 开始。

然后,对以上步骤进行细分:

  1. 假设步骤 1 是正常进入页面,这时候没有逻辑需要处理;
  2. 步骤 2 需要从 页面 A 跳转到 页面 B ,要实现这一步,就必需知道 页面 B 的路由地址,通过 VueRouter 跳转到 页面 B 的路由地址。并且如果 页面 B 需要的一些查询数据,就要把 页面 B 的数据保存起来,等到步骤 3 使用;
  3. 进入 页面B 后,如果要获取 页面 A 传过来的一些查询数据,就要先判断是不是从 页面 A 跳转过来的,如果是,就从保存数据的地方获取 页面 A 传过来的数据;
  4. 从 页面 B 返回 页面 A ,就必需知道 页面 A 的路由地址,通过 VueRouter 跳转到 页面 A 的路由地址。这里的路由地址,需要在步骤 2 跳转之前进行保存,这里才可以取到;
  5. 可以发现,步骤1和步骤5都是进入 页面 A ,但是执行的逻辑却不一样,所以, 页面 A 如果要恢复跳转到 页面 B 之前的一些数据,就要先判断是不是从 页面 B 跳转回来的,如果是,就从保存数据的地方获取跳转之前 页面 A 的数据;这里的跳转之前的数据,需要在步骤 2 跳转之前进行保存,这里才可以取到。

接下来,为了实现上述的逻辑,我们先确定用来保存 页面 A 和 页面 B 的数据的方法,这里采用的是 VUEX 。再梳理一下以上逻辑步骤,画出流程图。

流程图

源页面

目标页面

具体实现

源页面跳转到目标页面

这一步的逻辑写在 VUEX 中,每次需要进行这一步操作,直接调 VUEX 中对应的方法即可。具体实现逻辑,就是先把源页面和目标页面的标识添加到路由参数上(目的是为了区分当前页面是进行的目标页面还是返回的源页面),再保存源页面和目标页面的数据,然后进行路由跳转。

在 store.js 中添加两个以下两个变量:


tgtPageParams: {}, // 关联跳转的目标页面数据(只保留一项数据)
srcPageParams: [], // 关联跳转的源页面数据(数组类型,保留多个页面的数据,可以多层返回,直到返回初始页面)

然后添加以下方法:


// 关联跳转,跳转到目标页面,并保存源页面和目标页面的数据到 Vuex
GoTargetPage(state, options) {
  // 在源页面的 query 添加 tgtPageName 标识,记住目标页面
  options.srcParams.query = Object.assign({}, options.srcParams.query, { tgtPageName: options.tgtParams.name });
  // 在目标页面的 query 添加 srcPageName 标识,记住源页面
  options.tgtParams.query = Object.assign({}, options.tgtParams.query, { srcPageName: options.srcParams.name });

  state.srcPageParams.push(options.srcParams); // 保存源页面数据
  state.tgtPageParams = options.tgtParams; // 保存目标页面数据

  router.push({ name: options.tgtParams.name, query: options.tgtParams.query }); // 跳转到目标页面
},

目标页面返回源页面

这一步的逻辑写在 VUEX 中,每次需要进行这一步操作,直接调 VUEX 中对应的方法即可。具体实现逻辑,就是从 state.srcPageParams 中取到源页面的数据(包括路由地址和参数),然后进行路由跳转。

在 VUEX 中添加以下方法:


// 关联跳转,跳转回源页面
goSourcePage(state, vm) {
  let obj = state.srcPageParams.slice(-1)[0]; // 取数组的最后一项
  // 如果 Vuex 有上一页的数据,则根据 Vuex 的数据返回上一面
  if (obj && Object.keys(obj).length > 0) {
    router.push({ name: obj.name, query: obj.query }); // 进行跳转
  }
  // 如果 Vuex 中没有上一页的数据,但是路由上有上一页的标志,则根据路由标志返回上一页(这是为了防止在详情页中刷新时,Vuex 数据丢失,无法返回上一页的问题)
  else if (vm && vm.$route.query.srcPageName) {
    router.push({ name: vm.$route.query.srcPageName });
  }
},

进入目标页面使用VUEX数据/返回源页面恢复VUEX数据

这一步的逻辑是把上面方案设计中的 步骤 3 和 步骤 5 合并起来了,写在公共函数文件中,每次需要进行这一步操作,直接调 Vue.prototype 中对应的方法即可。具体实现逻辑是:判断当前页面是源页面还是目标页面,如果是目标页面,那就使用源页面传过来的数据,如果是源页面,就恢复跳转之前的数据。

在公共函数文件 utils.js 中添加以下方法,并挂载到 Vue.prototype 上:



$changeVueData: (vm) => {
  let tgtParams = store.state.tgtPageParams;
  let srcParams = vm.$store.state.srcPageParams.slice(-1)[0] || {}; // 取最后一个元素值
  let name = vm.$route.name;
  let query = vm.$deepCopyJSON(vm.$route.query); // 这里深拷贝是因为 $route.query 需要更新

  // 判断当前页是 目标页面 还是 源页面
  // 判断条件是 先判断路由名是否一致,再判断指定的 query 的属性值是否也一致
  let isTgtPage = tgtParams.name === name &&
    (tgtParams.checkKeys ? tgtParams.checkKeys.every(key => tgtParams.query[key] === query[key]) : true);
  let isSrcPage = srcParams.name === name &&
    (srcParams.checkKeys ? srcParams.checkKeys.every(key => srcParams.query[key] === query[key]) : true);

  // 如果当前页面是目标页面
  if (isTgtPage) {
    Object.assign(vm.$data, tgtParams.data || {}); // 将 源页面传过来的数据 更新到当前页面的 data(),以便页面进行查询
  }
  // 如果当前页面是源页面
  if (isSrcPage) {
    Object.assign(vm.$data, srcParams.data || {}); // 跳转前保存的数据 更新到当前页面的 data(),以便页面进行还原
    store.commit('popSourcePage'); // 将 srcPageParams 的最后一项数据删除
    // 源页面关联跳转逻辑结束后,清除掉当前页路由上的目标页标识,防止刷新页面有问题
    delete query.tgtPageName;
    vm.$router.push({ name, query });
  }
},

返回上一页按钮

为了更方便的使用关联跳转功能,把返回上一页按钮封装成了一个组件,具体实现代码如下:


// back-button.vue
<template>
  <button class="primary-btn return-btn" v-if="showBackBtn" @click="backFn">
    <i class="return-icon"></i>{{ backText }}
  </button>
</template>
<script>
export default {
  name: 'back-button',
  props: {
    // 返回上一页的文字
    backText: {
      type: String,
      default: () => '上一步'
    },
    // 返回上一页的函数
    backFn: {
      type: Function,
      default: () => {}
    }
  },
  data() {
    return {
      showBackBtn: false,
    };
  },
  mounted() {
    this.setBackBtnShow();
  },
  activated() {
    this.setBackBtnShow();
  },
  methods: {
    // 更新返回上一页按钮的状态
    setBackBtnShow() {
      this.$nextTick(() => {
        let srcPage = this.$store.state.srcPageParams.slice(-1)[0];
        this.showBackBtn = Boolean(srcPage && Object.keys(srcPage).length > 0);
      });
    },
  },
};
</script>
<style scoped lang="sCSS">
</style>

容错部分

考虑到关联跳转的过程中,有可能用户会突然中断,或者刷新页面等异常操作,设计了部分容错机制:


// 根组件 App.vue

watch: {
  // 监听,当路由发生变化的时候执行
  $route(to, from) {
    // 如果即不是源页面,也不是目标页面,则清空 Vuex 中保存的数据
    // 防止在关联跳转的过程中切换菜单或者进行其他操作,导致 Vuex 中有上一次关联跳转残留的数据
    if (!to.query.srcPageName && !to.query.tgtPageName) {
      this.$store.commit('clearTargetPage');
      this.$store.commit('clearSourcePage');
    }
  },
},

使用示例

根据上述方案设计部分的步骤:

步骤 1 和步骤 5 ,进入 页面 A ,逻辑在同个页面,代码如下:


// 页面 A.vue

mounted() {
  vm = this;
  vm.$changeVueData(vm); // 关联跳转相关页面,每次进入页面,必需执行 $changeVueData 函数,具体用法参考调用方法的注释

  vm.ready();
},

步骤 2,从 页面A 跳转到 页面 B ,代码如下:

// 页面 A.vue

methods: {
  // 跳转到 B 页面
  goUserSituation: function (name) {
    let srcParams = {
      name: vm.$route.name,
      query: vm.$route.query
    };
    let tgtParams = {
      name: 'user-situation',
      data: {
        checkedSystem: name
      }
    };
    vm.$goTargetPage(srcParams, tgtParams);
  },
},


步骤 3,进入 页面 B ,代码如下:


// 页面 B.vue

mounted() {
  vm = this;
  vm.$changeVueData(vm); // 关联跳转相关页面,每次进入页面,必需执行 $changeVueData 函数,具体用法参考调用方法的注释

  vm.ready();
},

步骤 4,返回 页面 A ,代码如下:

// 页面 B.vue

<template>
  <div>
    <backButton :backFn="$goSourcePage"></backButton>
    
  </div>
</template>


总结

本文详细介绍了关联页面多级跳转(页面下钻)功能的实现,核心思想便是通过 VUEX 全局状态管理,保存关联跳转源页面和目标页面的数据,在跳转之前,把需要的数据保存起来,跳转到目标页面时,把目标页面需要的数据从 VUEX 中获取,跳转回源页面时,把源页面的数据从 VUEX 中恢复。

把这几个关键动作,封装成通用方法和组件,即统一了各个项目的关联页面跳转方式,也提高了代码的质量,更有利于后期维护。另外,文章中的容错部分,只写了一部分,如果后续需要继续完善该功能,可以把容错部分完善一下。

到此这篇关于Vue实现关联页面多级跳转(页面下钻)功能的文章就介绍到这了,更多相关Vue关联页面多级跳转内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue实现关联页面多级跳转(页面下钻)功能的完整实例

本文链接: https://www.lsjlt.com/news/121853.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue实现关联页面多级跳转(页面下钻)功能的完整实例
    背景 在项目开发过程中,经常会遇到从上一个页面跳转到下一个页面的需求,俗称 下钻 。比如在概览页面的数据,需要查看详情,点击某个图表或按钮,即可跳转到详情页面查看详情数据。 目前为...
    99+
    2024-04-02
  • Vue如何实现关联页面多级跳转功能
    小编给大家分享一下Vue如何实现关联页面多级跳转功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!背景在项目开发过程中,经常会遇到从上一个页面跳转到下一个页面的需...
    99+
    2023-06-14
  • vue实现三级页面跳转功能
    问题描述:在二级页面点击按钮,打开新的标签页 实现: 在router目录下的index.js文件添加对应组件 { path: '/offices', compon...
    99+
    2023-10-18
    vue三级页面跳转 vue页面跳转
  • PHP代码示例:实现页面跳转功能
    在PHP中,我们可以使用header()函数来实现页面跳转功能。下面是一个简单的示例:<php   // 检查某个条件是否满足,例如用户是否登录   if (!isset...
    99+
    2024-03-07
    php 示例 页面跳转
  • html5怎么实现页面跳转功能
    本篇内容主要讲解“html5怎么实现页面跳转功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“html5怎么实现页面跳转功能”吧! ...
    99+
    2024-04-02
  • html怎么实现页面跳转功能
    这篇文章主要讲解了“html怎么实现页面跳转功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“html怎么实现页面跳转功能”吧! ...
    99+
    2024-04-02
  • Ajax post实现请求跳转页面功能
    本篇内容主要讲解“Ajax post实现请求跳转页面功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Ajax post实现请求跳转页面功能”吧!最近因为公司需...
    99+
    2024-04-02
  • JavaScript怎么实现网页传参跳转页面功能
    随着互联网的快速发展,越来越多的网页需要将信息从一个页面传递到另一个页面。传统的方法是使用GET或POST请求,但这种方式需要服务器端的支持,并且不能直接跳转页面。而JavaScript实现网页传参跳转页面,无需服务器支持,可以直接跳转到目...
    99+
    2023-05-14
  • 怎么使用ThinkPHP实现页面跳转到首页功能
    今天小编给大家分享一下怎么使用ThinkPHP实现页面跳转到首页功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。配置路由在...
    99+
    2023-07-05
  • 如何在 Golang 中实现页面跳转功能
    在 Golang 中实现页面跳转功能通常涉及 Web 开发领域,主要是通过使用路由实现页面之间的跳转。下面将具体介绍如何在 Golang 中实现页面跳转功能,并提供代码示例。 首先,我...
    99+
    2024-03-06
    页面 golang 跳转
  • PyQt5实现界面(页面)跳转的示例代码
    网上关于PyQt5的教程很少,特别是界面跳转这一块儿,自己研究了半天,下来和大家分享一下 一、首先是主界面 # -*- coding: utf-8 -*- # Form im...
    99+
    2024-04-02
  • vue项目实现页面跳转的方法
    目录1.创建一个vue-cli默认项目(仅包含babel)2.进入创建文件3.检查配置4.创建views文件夹5.设置APP.vue6.进行main.js的配置7.运行结果问题描述:...
    99+
    2024-04-02
  • require.js与bootstrap结合怎么实现页面登录和页面跳转功能
    这篇文章主要介绍了require.js与bootstrap结合怎么实现页面登录和页面跳转功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。页...
    99+
    2024-04-02
  • 使用javascript实现页面跳转的案例
    这篇文章主要介绍使用javascript实现页面跳转的案例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!js页面跳转方法:1、使用“location.href="URL"”;2、使用“locati...
    99+
    2023-06-14
  • PHP实现跳转至上级页面的方法
    PHP实现跳转至上级页面的方法 在网页开发过程中,经常需要实现跳转至上级页面的功能,这对于增强用户体验和页面导航非常重要。在PHP中,实现跳转至上级页面的方法有多种,下面我们将介绍其中...
    99+
    2024-03-09
    php 跳转 上级
  • jquery如何实现点击按钮跳转页面功能
    今天小编给大家分享一下jquery如何实现点击按钮跳转页面功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先,在 HTM...
    99+
    2023-07-05
  • 微信小程序怎么实现页面跳转功能
    这篇“微信小程序怎么实现页面跳转功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“微信小程序怎么实现页面跳转功能”文章吧。实...
    99+
    2023-07-05
  • vue3配置router路由并实现页面跳转功能
    目录1、安装vue-router2、根目录下新建router文件夹,下面新建index.js文件和routes.js2.1文件中引入vue方法、配置页面具体路径3、main.js文件...
    99+
    2023-05-17
    vue3页面跳转 vue3配置router路由
  • jquery怎么实现点击按钮跳转页面功能
    在网站开发中,经常会有一些需要使用到按钮(button)来实现页面跳转的场景。今天我们就来讲一下如何使用 jQuery 实现点击按钮进行页面跳转的功能。首先,在 HTML 文件头部 加入 jQuery 库,代码如下:<script s...
    99+
    2023-05-14
  • php实现一个页面跳转到其它页面的方法示例
    这篇文章将为大家详细讲解有关php实现一个页面跳转到其它页面的方法示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。php实现一个页面跳转到其它页面的方法:在php脚本中添加代码【header("...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作