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中的集合及效率
Jan 08 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
Mar 10 Javascript
Javascript表单验证要注意的事项
Sep 29 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
May 10 Javascript
JS扩展类,克隆对象与混合类实例分析
Nov 26 Javascript
使用JavaScript实现点击循环切换图片效果
Sep 03 Javascript
js实现动态改变radio状态的方法
Feb 28 Javascript
jQuery pjax 应用简单示例
Sep 20 jQuery
node省市区三级数据性能测评实例分析
Nov 06 Javascript
Vue的click事件防抖和节流处理详解
Nov 13 Javascript
js正则匹配markdown里的图片标签的实现
Mar 24 Javascript
JS如何使用剪贴板操作Clipboard API
May 17 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
Dedecms常用函数解析
2008/02/01 PHP
php session应用实例 登录验证
2009/03/16 PHP
PHP源码分析之变量的存储过程分解
2014/07/03 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
使用Zookeeper分布式部署PHP应用程序
2019/03/15 PHP
PHP时间函数使用详解
2019/03/21 PHP
javascript 24小时弹出一次的代码(利用cookies)
2009/09/03 Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
JS模式之简单的订阅者和发布者模式完整实例
2015/06/30 Javascript
javascript学习总结之js使用技巧
2015/09/02 Javascript
九种原生js动画效果
2015/11/11 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
微信小程序实现带参数的分享功能(两种方法)
2019/05/17 Javascript
微信小程序 子级页面返回父级并把子级参数带回父级实现方法
2019/08/22 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
python字符类型的一些方法小结
2016/05/16 Python
使用Python绘制图表大全总结
2017/02/11 Python
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
python 自动去除空行的实例
2018/07/24 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
Python-jenkins 获取job构建信息方式
2020/05/12 Python
详解FireFox下Canvas使用图像合成绘制SVG的Bug
2019/07/10 HTML / CSS
FitFlop澳大利亚官网:英国符合人体工学的鞋类品牌
2017/06/05 全球购物
惠普香港官方商店:HP香港
2019/04/30 全球购物
求职简历中个人的自我评价
2013/12/25 职场文书
建筑班组长岗位职责
2014/01/02 职场文书
大学生职业生涯规划方案
2014/01/03 职场文书
好军嫂事迹材料
2014/01/15 职场文书
十八大演讲稿
2014/05/22 职场文书
有关环保的标语
2014/06/13 职场文书
2014年教师德育工作总结
2014/11/10 职场文书
股东协议书范本2016
2016/03/21 职场文书
Django REST framework 限流功能的使用
2021/06/24 Python
SQL Server中常用截取字符串函数介绍
2022/03/16 SQL Server