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 相关文章推荐
IE和Mozilla的兼容性汇总event
Aug 12 Javascript
Js 订制自己的AlertBox(信息提示框)
Jan 09 Javascript
比较搞笑的js陷阱题
Feb 07 Javascript
浅谈JavaScript Date日期和时间对象
Dec 29 Javascript
JavaScript模仿Pinterest实现图片预加载功能
Oct 25 Javascript
除Console.log()外更多的Javascript调试命令
Jan 24 Javascript
Vue2.x Todo之自定义指令实现自动聚焦的方法
Jan 08 Javascript
express框架中使用jwt实现验证的方法
Aug 25 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
Sep 02 Javascript
微信小程序 自定义弹窗实现过程(附代码)
Dec 05 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
Jan 11 jQuery
JavaScript实现烟花绽放动画效果
Aug 04 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函数)
2006/10/09 PHP
织梦sitemap地图实时推送给百度的教程
2015/08/03 PHP
Symfony2学习笔记之插件格式分析
2016/03/17 PHP
PHP学习笔记之php文件操作
2016/06/03 PHP
解决 FireFox 下[使用event很麻烦] 的问题.
2006/08/22 Javascript
事件模型在各浏览器中存在差异
2010/10/20 Javascript
js 操作select和option常用代码整理
2012/12/13 Javascript
js模仿jquery的写法示例代码
2013/06/16 Javascript
屏蔽相应键盘按钮操作
2014/03/10 Javascript
php,js,css字符串截取的办法集锦
2014/09/26 Javascript
Javascript编写2048小游戏
2015/07/07 Javascript
JavaScript中关联原型链属性特性
2016/02/13 Javascript
JS实现的颜色实时渐变效果完整实例
2016/03/25 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
jQuery图片轮播功能实例代码
2017/01/29 Javascript
详解vue-router和vue-cli以及组件之间的传值
2017/07/04 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
浅析Vue 生命周期
2018/06/21 Javascript
创建Vue项目以及引入Iview的方法示例
2018/12/03 Javascript
Node.js HTTP服务器中的文件、图片上传的方法
2019/09/23 Javascript
vue实现移动端拖动排序
2020/08/21 Javascript
Python2.5/2.6实用教程 入门基础篇
2009/11/29 Python
在Python的Flask框架中验证注册用户的Email的方法
2015/09/02 Python
python模拟表单提交登录图书馆
2018/04/27 Python
对python制作自己的数据集实例讲解
2018/12/12 Python
python使用sklearn实现决策树的方法示例
2019/09/12 Python
只要五步 就可以用HTML5/CSS3快速制作便签贴特效(图)
2012/06/04 HTML / CSS
Shopee越南:东南亚与台湾电商平台
2019/02/03 全球购物
干部行政关系介绍信
2014/01/17 职场文书
环保志愿者活动总结
2014/06/27 职场文书
感谢信的格式
2015/01/21 职场文书
学校财务管理制度
2015/08/04 职场文书
通知怎么写?
2019/04/17 职场文书
少年的你:世界上没有如果,要在第一次就勇敢的反抗
2019/11/20 职场文书
Django实现在线无水印抖音视频下载(附源码及地址)
2021/05/06 Python
Python中的变量与常量
2021/11/11 Python