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定义背景动态切换效果的方法
Mar 23 Javascript
简述JavaScript对传统文档对象模型的支持
Jun 16 Javascript
JavaScript对象学习小结
Sep 02 Javascript
js窗口关闭提示信息(兼容IE和firefox)
Oct 23 Javascript
Bootstrap富文本组件wysiwyg数据保存到mysql的方法
May 09 Javascript
简单的vue-resourse获取json并应用到模板示例
Feb 10 Javascript
vue 运用mock数据的示例代码
Nov 07 Javascript
element ui table 增加筛选的方法示例
Nov 02 Javascript
JavaScript ES6中的简写语法总结与使用技巧
Dec 30 Javascript
layui动态渲染生成select的option值方法
Sep 23 Javascript
layui prompt 设置允许空白提交的方法
Sep 24 Javascript
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
分页显示Oracle数据库记录的类之一
2006/10/09 PHP
使用PHP Socket写的POP3类
2013/10/30 PHP
PHP的Yii框架入门使用教程
2016/02/15 PHP
php版阿里云OSS图片上传类详解
2016/12/01 PHP
JavaScript 检测浏览器和操作系统的脚本
2008/12/26 Javascript
javascript 流畅动画实现原理
2009/09/08 Javascript
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
2009/12/02 Javascript
JQuery1.6 使用方法三
2011/11/23 Javascript
jquery sortable的拖动方法示例详解
2014/01/16 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
2015/03/03 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
2016/07/04 Javascript
各式各样的导航条效果css3结合jquery代码实现
2016/09/17 Javascript
javascript 内置对象及常见API详细介绍
2016/11/01 Javascript
Bootstrap表单使用方法详解
2017/02/17 Javascript
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
Vuex 入门教程
2018/01/10 Javascript
vue 组件高级用法实例详解
2018/04/11 Javascript
浅析Vue中拆分视图层代码的5点建议
2019/08/15 Javascript
在Webpack中用url-loader处理图片和字体的问题
2020/04/28 Javascript
[03:30]完美盛典趣味短片 CSGO2019年度名场面
2019/12/07 DOTA
python实现文件路径和url相互转换的方法
2015/07/06 Python
Python数据结构之顺序表的实现代码示例
2017/11/15 Python
pandas 将list切分后存入DataFrame中的实例
2018/07/03 Python
python实现拼接图片
2020/03/23 Python
Python搭建Keras CNN模型破解网站验证码的实现
2020/04/07 Python
jupyter notebook运行命令显示[*](解决办法)
2020/05/18 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
英国领先的珍珠首饰品牌:Orchira
2016/09/11 全球购物
洗煤厂厂长岗位职责
2014/01/03 职场文书
护理个人求职信范文
2014/01/08 职场文书
乡镇纠风工作实施方案
2014/03/22 职场文书
班级口号大全
2014/06/09 职场文书
物联网工程专业推荐信
2014/09/08 职场文书
2016八一建军节慰问信
2015/11/30 职场文书
golang定时器
2022/04/14 Golang