Vue.js中该如何自己维护路由跳转记录


Posted in Javascript onMay 19, 2019

前言

在Vue的项目中,如果我们想要做返回、回退操作时,一般会调用router.go(n)这个api,但是实际操作中,使用这个api有风险,就是会让用户跳出当前应用,因为它记录的是浏览器的访问记录,而不是你当前应用的访问记录,这是非常可怕的事情。

解决方案就是,我们自己来维护一份history跳转记录。

案例与使用场景

代码地址:https://github.com/dora-zc/mini-vue-mall (本地下载)

这是一个基于Vue.js的小型商城案例,应用场景:

  1. 自己实现一个Vue插件src/utils/history.js,通过堆栈的方式维护页面跳转的历史记录,控制返回跳转
  2. 点击返回按钮是出栈操作
  3. 在全局路由router.js 中,实例化路由前,通过原型扩展router的back()方法
  4. 在全局afterEach中存放历史记录

代码实现

实现history插件,维护历史记录

// src/utils/history.js

const History = {
 _history: [], // 历史记录堆栈
 install(Vue) {
  // 提供Vue插件所需安装方法
  Object.defineProperty(Vue.prototype, '$routerHistory', {
   get() {
    return History;
   }
  })
 },
 push(path) { // 入栈
  this._history.push(path);
 },
 pop() {
  this._history.pop();
 },
 canBack(){
  return this._history.length > 1;
 }

}
export default History;

在路由实例化之前,扩展back()方法

// src/router.js

import Vue from 'vue'
import Router from 'vue-router'
import History from './utils/history';

Vue.use(Router);
Vue.use(History);

// 实例化之前,扩展Router
Router.prototype.goBack = function () {
 this.isBack = true;
 this.back();
}

在路由全局afterEach中记录跳转历史

// src/router.js

// afterEach记录历史记录
router.afterEach((to, from) => {
 if (router.isBack) {
 // 后退
 History.pop();
 router.isBack = false;
 router.transitionName = 'route-back';
 } else {
 History.push(to.path);
 router.transitionName = 'route-forward';
 }
})

在公用Header组件中使用

// Hearder.vue

<template>
 <div class="header">
 <h1>{{title}}</h1>
 <i v-if="$routerHistory.canBack()" @click="back"></i>
 <div class="extend">
  <slot></slot>
 </div>
 </div>
</template>

<script>
export default {
 props: {
 title: {
  type: String,
  default: ""
 }
 },
 methods: {
 back() {
  this.$router.goBack();
 }
 }
};
</script>

完整代码请查看:https://github.com/dora-zc/mini-vue-mall(本地下载)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jquery实现不包含当前项的选择器实例
Jun 25 Javascript
Node.js实现JS文件合并小工具
Feb 02 Javascript
详解JavaScript中双等号引起的隐性类型转换
May 30 Javascript
基于JavaScript实现轮播图代码
Jul 14 Javascript
ionic实现滑动的三种方式
Aug 27 Javascript
js学习总结之DOM2兼容处理this问题的解决方法
Jul 27 Javascript
vue组件父与子通信详解(一)
Nov 07 Javascript
vue.js整合mint-ui里的轮播图实例代码
Dec 27 Javascript
vue2.0页面前进刷新回退不刷新的实现方法
Jul 31 Javascript
JavaScript函数重载操作实例浅析
May 02 Javascript
jQuery cookie的公共方法封装和使用示例
Jun 01 jQuery
深入了解Vue动态组件和异步组件
Jan 26 Vue.js
利用Vue实现一个markdown编辑器实例代码
May 19 #Javascript
小程序实现搜索界面 小程序实现推荐搜索列表效果
May 18 #Javascript
微信小程序实现搜索指定景点周边美食、酒店
May 18 #Javascript
vue+高德地图写地图选址组件的方法
May 18 #Javascript
微信小程序实现搜索功能并跳转搜索结果页面
May 18 #Javascript
js实现图片推拉门效果代码实例
May 18 #Javascript
微信小程序代码上传、审核发布小程序
May 18 #Javascript
You might like
简单的页面缓冲技术
2006/10/09 PHP
深入phpMyAdmin的安装与配置的详细步骤
2013/05/07 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
js变换显示图片的实例
2013/04/16 Javascript
jquery仿京东导航/仿淘宝商城左侧分类导航下拉菜单效果
2013/04/24 Javascript
jQuery Validate验证框架经典大全
2015/09/23 Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
2015/09/23 Javascript
纯JS代码实现气泡效果
2016/05/04 Javascript
webix+springmvc session超时跳转登录页面
2016/10/30 Javascript
一个非常好用的文字滚动的案例,鼠标悬浮可暂停[两种方案任选]
2016/12/01 Javascript
详解nodejs 文本操作模块-fs模块(三)
2016/12/22 NodeJs
微信小程序 自动登陆PHP源码实例(源码下载)
2017/05/08 Javascript
详解Angular路由 ng-route和ui-router的区别
2017/05/22 Javascript
轻松学习JavaScript函数中的 Rest 参数
2019/05/30 Javascript
Vue多环境代理配置方法思路详解
2019/06/21 Javascript
Vue简单实现原理详解
2020/05/07 Javascript
JavaScript实现猜数字游戏
2020/05/20 Javascript
详解JavaScript 的执行机制
2020/09/18 Javascript
Python迭代用法实例教程
2014/09/08 Python
Python简单实现enum功能的方法
2016/04/25 Python
python list元素为tuple时的排序方法
2018/04/18 Python
从请求到响应过程中django都做了哪些处理
2018/08/01 Python
python实现在多维数组中挑选符合条件的全部元素
2019/11/26 Python
python关于调用函数外的变量实例
2019/12/26 Python
详解CSS3中字体平滑处理和抗锯齿渲染
2017/03/29 HTML / CSS
世界首屈一指的钓鱼用品商店:TackleDirect
2016/07/26 全球购物
教师现实表现材料
2014/02/14 职场文书
财务会计自荐信范文
2014/02/21 职场文书
致青春观后感
2015/06/09 职场文书
行为规范主题班会
2015/08/13 职场文书
任命书格式模板
2015/09/22 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书
python如何进行基准测试
2021/04/26 Python
SQL注入篇学习之盲注/宽字节注入
2022/03/03 MySQL
asyncio异步编程之Task对象详解
2022/03/13 Python
TypeScript实用技巧 Nominal Typing名义类型详解
2022/09/23 Javascript