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方法和技巧大全
Dec 27 Javascript
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
Dec 27 Javascript
页面调用单个swf文件,嵌套出多个方法。
Nov 21 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
Jun 17 Javascript
Angular实现form自动布局
Jan 28 Javascript
JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题
Aug 03 Javascript
node.js express安装及示例网站搭建方法(分享)
Aug 22 Javascript
利用Vue.js实现checkbox的全选反选效果
Jan 18 Javascript
JQ图片文件上传之前预览功能的简单实例(分享)
Nov 12 Javascript
老生常谈JS中的继承及实现代码
Jul 06 Javascript
vue实现的双向数据绑定操作示例
Dec 04 Javascript
JavaScript中arguments的使用方法详解
Dec 20 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中使用mktime获取时间戳的一个黑色幽默分析
2012/05/31 PHP
Server.HTMLEncode让代码在页面里显示为源代码
2013/12/08 PHP
PHP修改session_id示例代码
2014/01/08 PHP
php处理单文件、多文件上传代码分享
2016/08/24 PHP
Yii核心验证器api详解
2016/11/23 PHP
php图像处理函数imagecopyresampled用法详解
2016/12/02 PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
2019/04/10 PHP
JQuery的ajax基础上的超强GridView展示
2009/09/18 Javascript
ExtJS下grid的一些属性说明
2009/12/13 Javascript
javascript仿php的print_r函数输出json数据
2013/09/13 Javascript
jQuery实现鼠标单击网页文字后在文本框显示的方法
2015/05/06 Javascript
浅谈js的url解析函数封装
2016/06/28 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
canvas+gif.js打造自己的数字雨头像的示例代码
2017/10/26 Javascript
Vue中的组件及路由使用实例代码详解
2019/05/22 Javascript
[01:20]辉夜杯背景故事宣传片《辉夜传说》
2015/12/25 DOTA
Python中文分词实现方法(安装pymmseg)
2016/06/14 Python
通过源码分析Python中的切片赋值
2017/05/08 Python
利用Python操作消息队列RabbitMQ的方法教程
2017/07/19 Python
python画图——实现在图上标注上具体数值的方法
2019/07/08 Python
django 实现简单的插入视频
2020/04/07 Python
python logging 重复写日志问题解决办法详解
2020/08/04 Python
CSS3制作酷炫的三维相册效果
2016/07/01 HTML / CSS
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
Html5+CSS3+EL表达式问题小结
2020/12/19 HTML / CSS
火山动力Java笔试题
2014/06/26 面试题
高三英语教学反思
2014/01/13 职场文书
贯彻学习两会心得体会范文
2014/03/17 职场文书
班主任对学生的评语
2014/04/26 职场文书
IT工程师岗位职责
2014/07/04 职场文书
党政领导班子群众路线对照检查材料思想汇报
2014/09/27 职场文书
党的群众路线教育实践活动专题组织生活会发言材料
2014/10/17 职场文书
个人工作总结范文2014
2014/11/07 职场文书
2016年植树节红领巾广播稿
2015/12/17 职场文书
检讨书范文
2019/04/16 职场文书
Win10鼠标宏怎么设置?win10系统鼠标宏的设置方法
2022/08/14 数码科技