IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 结合vuex实现自定义路由回退按钮 -> 正文阅读

[JavaScript知识库]结合vuex实现自定义路由回退按钮

结合vuex实现自定义路由回退按钮

简洁版,只提供思路,代码简单,追求看懂。

使用vuex创建数组,存储每次路由跳转的path,模拟路由历史记录的push,pop,replace等操作,回退按钮根据此数组来实现相关逻辑。

以下为路由表代码

export default new Router({
  routes: [
    {path:"/main",name:"main",component:Main},
    {path:"/details",name:"details",component:Details},
    {path:"/profile",name:"profile",component:Profile},
    {path:"/",redirect:"/main"},
  ],
  mode:'history'
})

三个简单的页面 分别为首页main 个人页profile 详情页details
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
去详情页,个人页为push方式跳转,去首页为replace 返回二字可点击进行回退功能

首页 个人页 详情页 代码如下

  methods: {
    go(path) {
      this.$store.commit("changeOprate",{type:'push'})
      this.$router.push({
        name: path,
      });
    },
  },
 
   methods: {
    go(path) {
      if (path == "main") {
        this.$store.commit("changeOprate", { type: "replace" });
        this.$store.commit("popRouterArr", {index:1})
        this.$router.replace({
          name: path,
        });
      } else {
        this.$store.commit("changeOprate", { type: "push" });
        this.$router.push({
          name: path,
        });
      }
    },
  },
  
    go(path) {
      if (path == "main") {
        this.$store.commit("changeOprate", { type: "replace" });
        this.$store.commit("popRouterArr", {index:1})
        this.$router.replace({
          name: path,
        });
      } else {
        this.$store.commit("changeOprate", { type: "push" });
        this.$router.push({
          name: path,
        });
      }
    },

vue store代码:

import Vuex from "vuex"
Vue.use(Vuex)
export default new Vuex.Store({
  state:{routerArr:[],routerOprate:''}, //记录存储路由的数组 以及跳转方式的记录
  mutations:{
  //添加一条记录
    pushRouterArr(state,{path}) {
      state.routerArr.push(path)
    },
    //替换末尾的一条记录
    replaceRouterArr(state,{path}) {
      state.routerArr[state.routerArr.length-1] = path
    },
    //删除最后一条记录
    popOneRouterArr(state) {
      state.routerArr.length = state.routerArr.length-1
    },
    //当数组中出现重复path值时 ,回退按钮只根据第一次path值出现的位置进行回退,回退成功后需要以当前位置截取整个数组
    popRouterArr(state,{index}) {
      // if (param.index > 0) {return}
      state.routerArr.length = index
    },
   
    changeOprate(state,{type}){
      state.routerOprate = type
    }
  },
  getters: {
    getRouterArr(state) {
      return state.routerArr
    },
    getRouterOprate(state) {
      return state.routerOprate
    },
  }
})

回退按钮放在app.vue中

<template>
  <div id="app">
    <header @click="back">返回</header>
    <router-view />
  </div>
</template>

在app.vue中对route进行监听

 watch: {
    $route(to, from) {
      let len = this.getRouterArr.length;
      if (len === 0) { //加载页面后第一次进行路由跳转时
        if (this.getRouterOprate === "push") {
         //向数组中添加两条记录
          let path = from.path;
          this.pushRouterArr({ path });
          path = to.path;
          this.pushRouterArr({ path });
        } else if (this.getRouterOprate === "replace") {
          let path = to.path;
          this.pushRouterArr({ path });
        }
      } else {
        if (
        //处理浏览器返回按钮
          from.path === this.getRouterArr[len - 1] &&
          to.path === this.getRouterArr[len - 2] &&
          this.getRouterOprate !== "push" &&
          this.getRouterOprate !== "replace"
        ) {
          console.log(123456567756);
          this.popOneRouterArr();
          return;
        }
        if (this.getRouterOprate === "back") {
          // 此间处理回退事件
          let adaptResult = {};
          this.getRouterArr.forEach((item, index, list) => {
            if (to.path === item) {
              adaptResult.index = index - list.length + 1;
              return;
            }
          });
          let index = adaptResult.index;
          this.popRouterArray({ index });
        } else if (this.getRouterOprate === "replace") {
          this.changeOprate({ type: "" });
          let path = to.path;
          this.replaceRouterArr({ path });
        } else if (this.getRouterOprate === "push") {
          this.changeOprate({ type: "" });
          let path = to.path;
          this.pushRouterArr({ path });
        }
      }
      console.log(this.getRouterArr);
    },
  },
  computed: {
    ...mapGetters(["getRouterArr", "getRouterOprate"]),
  },
  methods: {
    back() {
    //路有记录为1或0时不进行回退
      if (this.getRouterArr.length <= 1) {
        return;
      } else {
      //根据数组计算回退位置location 同时计算数组截断位置
        let x = this.getRouterArr[this.getRouterArr.length - 1];
        console.log(x);
        let location = 1;
        let index = 0;
        for (let i = 0; i < this.getRouterArr.length; i++) {
          if (x == this.getRouterArr[i]) {
            location = this.getRouterArr.length - i;
            index = i;
            break
          }
        }
        this.$router.go(-location);
        //进行数组的截取操作
        if (index > 0) {
          this.popRouterArr({ index });
        } else {
          this.popOneRouterArr();
        }
      }
    },
    ...mapMutations([
      "popOneRouterArr",
      "pushRouterArr",
      "replaceRouterArr",
      "popRouterArr",
      "changeOprate",
    ]),
  },

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-14 10:46:04  更:2021-07-14 10:46:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 0:20:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码