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 相关文章推荐
用javascript实现在小方框中浏览大图的代码
Aug 14 Javascript
javascript 面向对象全新理练之数据的封装
Dec 03 Javascript
JavaScript中的排序算法代码
Feb 22 Javascript
Javascript毫秒数用法实例
Feb 05 Javascript
详解vue组件化开发-vuex状态管理库
Apr 10 Javascript
使用ajax的post同步执行(实现方法)
Dec 21 Javascript
Vue实现点击后文字变色切换方法
Feb 11 Javascript
解决使用vue.js路由后失效的问题
Mar 17 Javascript
Vue登录注册并保持登录状态的方法
Aug 17 Javascript
vue里input根据value改变背景色的实例
Sep 29 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
Dec 04 Javascript
在vue项目中promise解决回调地狱和并发请求的问题
Nov 09 Javascript
利用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
采集邮箱的php代码(抓取网页中的邮箱地址)
2012/07/17 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
CI框架简单邮件发送类实例
2016/05/18 PHP
PHP中时间加减函数strtotime用法分析
2017/04/26 PHP
详解PHP的抽象类和抽象方法以及接口总结
2019/03/15 PHP
Extjs优化(一)删除冗余代码提高运行速度
2013/04/15 Javascript
邮箱下拉自动填充选择示例代码附图
2014/04/03 Javascript
js propertychange和oninput事件
2014/09/28 Javascript
js实现图片漂浮效果的方法
2015/03/02 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
2015/08/27 Javascript
纯css下拉菜单 无需js
2016/08/15 Javascript
JavaScript日期选择功能示例
2017/01/16 Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
2017/03/13 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
webpack4+react多页面架构的实现
2018/10/25 Javascript
vue移动端屏幕适配详解
2019/04/30 Javascript
Vue的编码技巧与规范使用详解
2019/08/28 Javascript
Python栈类实例分析
2015/06/15 Python
Python多进程与服务器并发原理及用法实例分析
2018/08/21 Python
对PyQt5中的菜单栏和工具栏实例详解
2019/06/20 Python
Python socket连接中的粘包、精确传输问题实例分析
2020/03/24 Python
Python 生成短8位唯一id实战教程
2021/01/13 Python
美国著名的团购网站:Woot
2016/08/02 全球购物
浅谈react路由传参的几种方式
2021/03/23 Javascript
商务日语毕业生自荐信范文
2013/11/14 职场文书
测绘工程个人的自我评价
2013/11/23 职场文书
计算机专业学生的自我评价
2013/12/15 职场文书
企业管理部经理岗位职责
2013/12/24 职场文书
抄作业检讨书
2014/02/17 职场文书
2014年大学生党课心得体会范文
2014/03/29 职场文书
敲诈同学钱财检讨书范文
2014/11/18 职场文书
小学五一劳动节活动总结
2015/02/09 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
小学体育组工作总结
2015/08/13 职场文书
三年级作文之小小梦想
2019/12/06 职场文书
python数据可视化JupyterLab实用扩展程序Mito
2021/11/20 Python