vue3使用keep alive实现前进更新后退销毁

目录
  • keep alive实现前进更新后退销毁
    • 具体实现思路:
      • 使用vuex保存include数组
      • 在beforeEach中添加name
      • include使用

keep alive实现前进更新后退销毁

想要实现前进更新后退销毁,核心在操作keep-alive的include。
具体做法就是当进入新页面时将页面name保存,再次进入就将它之后的name删除。

具体实现思路:

正常情况下页面是线性前进的:

A->B->C->D

include数组数据[A,B,C,D]

当再次进入C,就认为是D返回C

include数组数据[A,B,C]

D页面就被销毁了,从而实现了后退销毁

使用vuex保存include数组

const keep = {
    namespaced: true,
    state: () => {
        return {
            include: [],
        }
    },
    getters: {
        include(state) {
            return state.include
        },
    },
    mutations: {
        add(state, name) {
            let b = false
            let i = 0
            for (; i < state.include.length; ++i) {
                let e = state.include[i]
                if (e == name) {
                    b = true
                    break
                }
            }
            if (!b) {
                state.include.push(name)
            } else {
                state.include.splice(i + 1)
            }
        }
    },
    actions: {
    }
}
export default keep

在beforeEach中添加name

import store from "../store"
router.beforeEach((to, from,next) => {
// 页面name要和route 的name一样
  store.commit("keep/add", to.name)
  next()
})

include使用

<template>
  <router-view v-slot="{ Component }">
    <keep-alive :include="includeList">
      <component :is="Component" />
    </keep-alive>
  </router-view>
</template>
<script>
export default {
  computed: {
    includeList() {
      return this.$store.getters["keep/include"].join(",");
    },
  },
};
</script>

当然还有页面循环跳转的情况,一般是详情页

A->A->A->A 或A->B->C->A->B->C

这种情况如果不需要保存页面,就用wacth监控$route变化 重新请求接口

如果需要保存页面,就用动态路由addRoute添加新的路由

A1->A2->A3->A4

import time from "../views/time"
function copyObj(obj) {
    if (typeof obj == "object") {
        if (Array.isArray(obj)) {
            let arr = [];
            for (let item of obj) {
                arr.push(Object.assign(copyObj(item)));
            }
            return arr;
        } else if (obj == null) {
            return null;
        } else {
            let obj1 = {};
            for (let index in obj) {
                obj1[index] = copyObj((obj[index]));
            }
            return obj1;
        }
    } else if (typeof obj == "function") {
        return Object.assign(obj);
    } else if (typeof obj == undefined) {
        return undefined;
    } else {
        return obj;
    }
}
window.pushTime = function () {
    let t = new Date().getTime();
    let path = `/time/${t}`;
    // 深复制component
    time = copyObj(time)
    // component name要和route 的name一样
    time.name = path
    this.$router.addRoute({
        path,
        name: path,
        component: time,
    });
    this.$router.push({
        path,
    });
}

vue2用vue-navigation 非常好用

以上就是vue3使用keep alive实现前进更新后退销毁的详细内容,更多关于vue3 keep alive更新销毁的资料请关注我们其它相关文章!

(0)

相关推荐

  • 关于keep-alive路由多级嵌套不生效的解决方案

    目录 问题 定位问题 解决方案 额外的问题及题解 问题 发现了一个问题,多级嵌套的路由缓存页面没有生效.网上其实有一些是把路由拍平,然后再去处理菜单,但是我觉得还不如从根源上去解决这个问题.顺带了解一下keep-alive的工作原理. 实际就是根据组件的名称,如果即将渲染的组件名称命中存在缓存数组,那么直接取缓存里的组件进行渲染.同时,这个命中缓存是带有父子组件关联关系的 以下会根据本图做讲解 定位问题 keep-alive实际就是根据组件的名称,如果即将渲染的组件名称命中存在缓存数组,那么直接

  • vue关于点击详情页面keep-alive的缓存问题

    目录 点击详情页面keep-alive的缓存问题 vue中路由表单缓存(keep-alive) 页面效果 父组件代码 被缓存组件代码 点击详情页面keep-alive的缓存问题 今天有个列表 点击以后 进入详情 然后在返回,再点击其他的列表数据,详情页面请求的还是上一次请求的id 除非刷新才会请求现在的. 这样子对用户体验感是非常不好滴,查了半天资料 发现了activated这个api 解决有些不需要被缓存的组件页面 设置 activated 即可以再次进行事件的响应 vue中路由表单缓存(ke

  • vue中keep-alive组件实现多级嵌套路由的缓存

    目录 现状(问题): 探索方案: 实现方式 现状(问题): keep-alive 组件对第三级及以上级的路由页面缓存失效 探索方案: 方案1.直接将路由扁平化配置,都放在一级或二级路由中方案2.再一层缓存组件用来过渡,并将其name配置到include中 实现方式 方案1不需要例子,按规则配置路由就行重点介绍方案2因为我用了vue-element-admin做了架构,并且项目中我将菜单和路由全部通过服务端返回做了统一配置,所以我只能用方案2来实现. 直接看原有代码(问题代码) // src/la

  • Vue动态组件和keep-alive组件实例详解

    目录 动态组件 格式 注意点 使用效果 目录结构 操作 效果 小结 keep-alive组件 使用背景 解决方法 使用keep-alive组件 小结 keep-alive组件-指定缓存 语法 注意: 总结 动态组件 多个组件使用同一个挂载点,并可以动态切换,这就是动态组件. 格式 <component :is="comName"></component> 注意点 is只能是动态属性,:is="组件注册后的标签名字符串或data变量" 不能直接

  • Vue设置keepAlive不生效问题及解决

    目录 设置keepAlive不生效 1.在App.vue中的设置 2.在router中的index.js设置 keep-alive缓存组件不生效的坑 坑出现背景 坑的原因 代码如下 设置keepAlive不生效 如演示,Vue页面导航回退后页面重新刷新了,搜索条件及结果都重置了,对于页面需要频繁切换的系统来说,体验不佳,我们希望页面第一次打开时加载,此后回退不再刷新 查阅了Vue官网后,发现vue2.0提供了一个keep-alive组件. 1.在App.vue中的设置 <template> &

  • 使用react-activation实现keepAlive支持返回传参

    目录 介绍 代码 1.安装react-activation 2.给路由增加meta 3.根组件中渲染 4.跳转指定页面的时候才缓存 5.抽离逻辑到自定义hooks 6. 从详情页返回列表页的时候,控制列表页是否刷新,即返回传参 使用: 相关文档 介绍 这个项目是一个商城的后台管理系统,用umi2.0搭建,状态管理使用dva,想要实现类似vue keep-alive的效果. 具体表现为: 从列表页A跳转A的详情页,列表页A缓存 详情页没做任何操作,跳回列表页A,列表页A不刷新,列表页A页码不变 详

  • vue3使用keep alive实现前进更新后退销毁

    目录 keep alive实现前进更新后退销毁 具体实现思路: 使用vuex保存include数组 在beforeEach中添加name include使用 keep alive实现前进更新后退销毁 想要实现前进更新后退销毁,核心在操作keep-alive的include.具体做法就是当进入新页面时将页面name保存,再次进入就将它之后的name删除. 具体实现思路: 正常情况下页面是线性前进的: A->B->C->D include数组数据[A,B,C,D] 当再次进入C,就认为是D返

  • vue3使用vuex实现页面实时更新数据实例教程(setup)

    目录 前言 1.项目引入vue 2.main.js引入vuex 3.新建store文件夹 3.在传输数据的页面引入vuex (api.js) 4.渲染页面 总结 前言 我项目中使用ws获取数据,因为数据是不断更新的,vue页面只更新一次就不更新了,然后暂时只能想到vuex来保存更新状态,页面监听数据实现实时更新.下面是我测试时用的数据,没有用ws,用的是定时器模拟定时发送数据. 1.项目引入vue npm i vuex 2.main.js引入vuex import { createApp } f

  • vue3.0 上手体验

    vue3.0 beta 版本已经发布有一阵子了,是时候上手体验一波了- 注意,本文所有演示都是基于 vue3.0 beta 版本,不保证后续正式版 api 不改动.等官方文档出来后,以官网为准. 环境搭建 直接使用脚手架,如果本地没有安装的可以执行脚手架安装命令: npm install -g @vue/cli 如果本地安装过的,可以尝试更新一下: npm update -g @vue/cli 测试 vue-cli 版本: vue -V @vue/cli 4.4.1 接下来创建一个vue项目:

  • Vue3为什么这么快

    总所周知,程序员追求的就是一个字:快!(当然不是什么都追求快的,有些事情快起来是不行滴) 昨天Vue3.0正式发布了,激动的心,颤抖的手,摸了摸我的头发,嗯~还好. 据说Vue3.0相比Vue2.x在性能上提升了1.2~2倍,为啥他就这么快呢? vue3.0做了以下事情 diff算法优化 静态提升(hoistStatic) 事件侦听器缓存(cacheHandlers) SSR优化(看心情更新) diff算法优化 Vue2.x的diff算法 vue2.x的diff算法叫做全量比较,顾名思义,就是当

  • 详解Vue3 Teleport 的实践及原理

    Vue3 的组合式 API 以及基于 Proxy 响应式原理已经有很多文章介绍过了,除了这些比较亮眼的更新,Vue3 还新增了一个内置组件: Teleport.这个组件的作用主要用来将模板内的 DOM 元素移动到其他位置. 使用场景 业务开发的过程中,我们经常会封装一些常用的组件,例如 Modal 组件.相信大家在使用 Modal 组件的过程中,经常会遇到一个问题,那就是 Modal 的定位问题. 话不多说,我们先写一个简单的 Modal 组件. <!-- Modal.vue --> <

  • 使用Vite+Vue3+Vant全家桶快速构建项目步骤详解

    目录 引言 一.vue3全家桶模板介绍 1.版本依赖 2.全家桶内置集成 二.安装 tive-cli 命令行工具 三.生成项目 四.项目体验 引言 随着Vue3 和 Vite 版本的不断更新完善,开发体验有了质的飞跃.因此,越来越多的大厂也逐步拥抱 Vue3. 利用Vite 脚手架工具可以很轻松生成以 Vue3 为模板的项目,但是作为Vue全家桶的 vue-router.vuex.axios等成员,需要自己一个一个去配置.于是便自行开发了本文讲到的 tive-cli 脚手架模板工具,只需短短几个

  • Vue3.0版本强势升级点特性详解

    目录 一.Composition API: 组合API/注入API 二.自定义渲染API(Custom Renderer API) vue2.x架构问题 三.更先进的组件 Fragment组件 Suspense组件 四.更好的TS支持 五.更快的开发体验(vite开发构建工具) 六.按需编译,体积比Vue2.x更小(Tree shaking) 七.性能比2.x快1.2-2倍 diff算法的优化 render阶段的静态提升(render阶段指生成虚拟dom树的阶段) 事件侦听缓存 减少创建组件实例

  • Vue3.2单文件组件setup的语法糖与新特性总结

    目录 前言 setup语法糖 一.基本用法 二.data和methods 三.计算属性computed 四.监听器watch.watchEffect 五.自定义指令directive 六.import导入的内容可直接使用 七.声明props和emits 八.父组件获取子组件的数据 九.provide和inject传值 十.路由useRoute和useRouter 十一.对await异步的支持 十三.全局属性globalProperties 十四.生命周期 十五.与普通的script标签一起使用

  • vue更新数据却不渲染页面的解决

    目录 vue更新数据却不渲染页面 1.Vue不能检测通过数组索引直接修改一个数组项 2.选择功能选中时赋值了,但没渲染页面 3.路由参数变化时 4.在异步更新执行之前操作DOM数据不会变化 5.获取后台返回的数组进行排序处理了,页面内容却不排序 vue页面的渲染过程 vue加载时文件的执行顺序 vue内部页面的执行顺序 vue中各选项及钩子函数执行顺序 vue更新数据却不渲染页面 1.Vue不能检测通过数组索引直接修改一个数组项 原因:由于JavaScript的限制,Vue不能检测数组和对象的变

  • Python开发之城堡保卫战游戏的实现

    目录 实现功能 用到的编程知识 代码如下 部分运行截图 实现功能 1:敌人的绵绵不断的前进,拿着各种各样的武器(叉子,斧头,宝剑),挥动武器攻击我方城堡,对我方城堡造成伤害! 2:我方城堡发现敌人可手动点击鼠标左键来发起子弹攻击,对日人造成致命伤害,让其死亡! 3:完备的数据显示,攻击敌人获取金币,累计得分,当前管卡的级别,我方城堡生命值的显示等等,击杀敌人获取的金币可以兑换额外属性来装备回复加强我方堡垒! 4:项目的布局界面优美干净,结合添加的纯音乐游戏背景和攻击音效以及实时的动画显示(如我方

随机推荐