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实现相同内容合并单元格的代码
Jan 12 Javascript
jquery form表单序列化为对象的示例代码
Mar 05 Javascript
js获取表格的行数和列数的方法
Oct 23 Javascript
Node.js文件操作方法汇总
Mar 22 Javascript
vue axios 二次封装的示例代码
Dec 08 Javascript
Vue2.X 通过AJAX动态更新数据
Jul 17 Javascript
对angularJs中ng-style动态改变样式的实例讲解
Sep 30 Javascript
分享一个vue项目“脚手架”项目的实现步骤
May 26 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
Nov 01 Javascript
JavaScript实现京东放大镜效果
Dec 03 Javascript
JQuery常用选择器功能与用法实例分析
Dec 23 jQuery
使用PDF.js渲染canvas实现预览pdf的效果示例
Apr 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
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
解决phpmyadmin 乱码,支持gb2312和utf-8
2006/11/20 PHP
php在文件指定行中写入代码的方法
2012/05/23 PHP
Laravel框架搜索分页功能示例
2019/02/01 PHP
Laravel 错误提示本地化的实现
2019/10/22 PHP
Laravel实现通过blade模板引擎渲染视图
2019/10/25 PHP
javascript 嵌套的函数(作用域链)
2010/03/15 Javascript
这些年、我收集的JQuery代码小结
2012/08/01 Javascript
javascript history对象(历史记录)使用方法(实现浏览器前进后退)
2014/01/07 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
jQuery插件实现适用于移动端的地址选择器
2016/02/18 Javascript
webpack中引用jquery的简单实现
2016/06/08 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
2017/01/13 Javascript
node.js入门学习之url模块
2017/02/25 Javascript
socket.io实现在线群聊功能
2017/04/07 Javascript
Angular2 组件间通过@Input @Output通讯示例
2017/08/24 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
2017/09/06 jQuery
vue2.0 父组件给子组件传递数据的方法
2018/01/15 Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
2018/08/30 Javascript
JS数组实现分类统计实例代码
2018/09/30 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
2019/09/14 Javascript
Websocket 向指定用户发消息的方法
2020/01/09 Javascript
[07:43]《辉夜杯》公开赛晋级外卡赛战队—TRG训练生活探秘
2015/12/11 DOTA
Python生成器generator用法示例
2018/08/10 Python
详解python中的数据类型和控制流
2019/08/08 Python
如何利用python给图片添加半透明水印
2019/09/06 Python
python模块hashlib(加密服务)知识点讲解
2019/11/25 Python
初始化了一个没有run()方法的线程类,是否会出错?
2014/03/27 面试题
如何清空Session
2015/02/23 面试题
小学生成长感言
2014/01/30 职场文书
小学英语教学反思
2014/01/30 职场文书
建筑工程材料员岗位职责
2015/04/11 职场文书
转学证明范本
2015/06/19 职场文书
初中生物教学反思
2016/02/20 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
Nginx 过滤静态资源文件的访问日志的实现
2021/03/31 Servers