随着vue3.0的发布,vue-router发布了4.0版本,文档 很明了,提供了vue2路由到vue3的变化和写法指导。

  vue2:

// transition
<transition name="van-fade">
<router-view />
</transition> // keep-alive
<keep-alive>
<router-view v-if="this.$route.meat.keepAlive"></router-view>
</keep-alive>
<keep-alive v-if="!this.$router.meta.keepAlive"></keep-alive>

  vue3:

  <router-view v-slot="{ Component, route }">
<transition :name="route.meta.transitionName">
<keep-alive v-if="route.meta.keepAlive">
<component :is="Component" />
</keep-alive>
<component :is="Component" v-else />
</transition>
</router-view>

  需要使用 v-slot API来传入渲染的comp和route对象,而不再用this.$route

  route.js写法大体没啥变化,写在最后的未匹配上路由的rediect,需要用正则来匹配

  {
// path: '/*',
path: '/:pathMatch(.*)*',
redirect: '/',
},

  监听路由前进后退实现transtion的动画效果,查了许多资料都有点不太完善,有用数组存住history 每次手动push和pop然后比对的,有用storage的,有用子路由‘/’来对比的...

  我的方式:

  

// route
router.beforeEach((to, from) => { const toDepth = to.path.split('/').length;
const fromDepth = from.path.split('/').length; to.meta.transitionName =
toDepth > fromDepth ?
'slide-left' :
(to.path === store.state.pushPath ?
'slide-left' :
'slide-right'); }); // store
state: {
pushPath: '',
},
mutations: {
setPushPath(state, payload) {
state.pushPath = payload;
},
}, // util
export const push = (path: string, params?: Record<string, string | number>): void => {
store.commit('setPushPath', path);
router.push({ path, params });
};

  每次跳转使用自己简单封装的路由api,记录是前进还是后退。 可还行


  更新一下,这种 v-if 的方式,其实是有问题的,太久没登录博客了,项目里面已经发现了问题改用 include 方式,没有更新到文章。

  原因是一旦有新打开的页面 , 会重新加载keep-alive组件 , 丢失所有缓存,导致回退页面的时候还是会走mounted,重新加载页面。

  那么,就用 include 吧!

  执行 watch 路由的操作,可以在app.vue里面写watch方式,也可以就在route里面的 beforeEach 方法里面去修改数组,通过store来绑定传值。

// route
router.beforeEach((to, from, next) => { const toDepth = to.path.split('/').length;
const fromDepth = from.path.split('/').length; // to.meta.transitionName =
// toDepth > fromDepth ?
// 'van-slide-left' :
// (to.path === store.state.pushPath ?
// 'van-slide-left' :
// 'van-slide-right');
const isPush = toDepth > fromDepth || to.path === store.state.pushPath;
to.meta.transitionName = isPush ? 'van-slide-left' : 'van-slide-right'; if (to.meta.keepAlive) {
store.commit('addIncludes', to.name);
} if (from.meta.keepAlive && !isPush) {
store.commit('minusIncludes', from.name);
} next();
}); // store
state: {
pushPath: '',
include: []
},
mutations: {
setPushPath(state, payload) {
state.pushPath = payload;
},
addIncludes(state, payload) {
if (!state.include.includes(payload)) {
state.include.push(payload);
}
},
minusIncludes(state, payload) {
const index = state.include.indexOf(payload);
if (index !== -1) {
state.include.splice(index, 1);
}
},
},

vue3使用路由keep-alive和监听路由实现transition的更多相关文章

  1. Vue2路由跳转传参,获取路由参数,Vue监听路由

    1 this.$router.push({ 2 // name:路由组件名 3 name: routeName, 4 query: { 5 mapId:this.mapId 6 } 7 }) 8 9 ...

  2. vue 在.vue文件里监听路由

    监听路由  watch   $route vue项目中的App.vue 文件 <template> <div id="app"> <!--includ ...

  3. vue监听路由的变化,跳转到同一个页面时,Url改变但视图未重新加载问题

    引入:https://q.cnblogs.com/q/88214/ 解决方法: 添加路由监听,路由改变时执行监听方法 methods:{ fetchData(){ console.log('路由发送变 ...

  4. AngularJS监听路由变化

    使用AngularJS时,当路由发生改变时,我们需要做某些处理,此时可以监听路由事件,常用的是$routeStartChange, $routeChangeSuccess.完整例子如下: <!D ...

  5. angular的路由和监听路由的变化和用户超时的监听

    先看两篇博客:http://camnpr.com/javascript/1652.html 这一篇博客是重点中的重点:                   http://www.tuicool.com ...

  6. angular 全局 监听路由变化

    app.run(['$rootScope', '$location', function($rootScope, $location) { /* 监听路由的状态变化 */ $rootScope.$on ...

  7. Angular 监听路由变化事件

    摘要: $stateChangeStart- 当模板开始解析之前触发 $rootScope.$on('$stateChangeStart', function(event, toState, toPa ...

  8. Angular 监听路由变化

    var app = angular.module('Mywind',['ui.router']) //Angular 监听路由变化 function run($ionicPlatform, $loca ...

  9. vue中监听路由参数变化

    今天遇到一个这样的业务场景:在同一个路由下,只改变路由后面的参数值, 比如在这个页面  /aaa?id=1 ,在这个页面中点击一个按钮后 跳转到 /aaa?id=2 , 但从“/aaa?id=1”到“ ...

  10. vue 如何通过监听路由变化给父级路由菜单添加active样式

    1.项目需求:在项目开发中,多级菜单的情况下,勾选子菜单时,需要在父级菜单添加active样式. 2.遇到的问题:一级路由菜单的话,点击当前路由会自动在路由标签上添加router-link-exact ...

随机推荐

  1. TienChin 渠道管理-配置字典常量

    在字典管理当中添加渠道状态 channel_status:渠道状态 分别为: 正常,键值为1,回显样式为 success 禁用,键值为0,回显样式为 info !> 有个注意点:Vue3 当中 ...

  2. 6.2 Windows驱动开发:内核枚举SSSDT表基址

    在Windows内核中,SSSDT(System Service Shadow Descriptor Table)是SSDT(System Service Descriptor Table)的一种变种 ...

  3. 10.5 认识XEDParse汇编引擎

    XEDParse 是一款开源的x86指令编码库,该库用于将MASM语法的汇编指令级转换为对等的机器码,并以XED格式输出,目前该库支持x86.x64平台下的汇编编码,XEDParse的特点是高效.准确 ...

  4. 还没发布就来了?iPhone 15系列机型价格配置图曝光

    明天凌晨1点,iPhone 15系列就将正式发布,不过在发布前夕,有网友根据此前的各种爆料,制作了一张有关新iPhone的各型号价格和配置的图片,虽然这并不是官方公布的图片,但是也或多或少包含了人们对 ...

  5. 5个.NET开源且强大的快速开发框架(帮助你提高生产效率)

    中台Admin(Admin.Core) 中台Admin(Admin.Core)是前后端分离权限管理系统,前端 UI 基于Vue3开发,后端 Api 基于.NET 8.0开发.支持多租户.接口权限.数据 ...

  6. 升腾C92 刷 OpenWrt 作旁路由设置 DNS 服务、扩容分区、设置 swap

    最新博客文章链接 文字更新时间:2024/02/04 一直知道 OpenWrt 经常拿来做软路由软件.最近买了个二手小主机升腾 C92 来做旁路由服务器,其被归为瘦客户机一类,感觉和工控机差不多,现价 ...

  7. 小知识:使用MOS下载Oracle介质快速参考

    之前对选Release.Patch Set.PSU都有专门的文档,现在早已简化,针对这些以及之后RU.RUR等都包含在MOS文档:2118136.2 Assistant: Download Refer ...

  8. GCD,乘法逆元

    最大公约数 公约数:几个整数共有的约数.($ \pm 1是任何整数的公约数$) 最大公约数:显而易见,所有公约数中最大的那个. 欧几里得算法 为了求最大公约数(常记为GCD),我们常用欧几里得算法.以 ...

  9. 2023年多校联训NOIP层测试4+洛谷 8 月月赛 I & RiOI Round 2

    2023年多校联训NOIP层测试4 爆零了 T1 幸运数字 \(0pts\) 首先考虑一个结论: \(4\) 的倍数一定满足最后两位能被 \(4\) 整除. 从 \(1\) 进行输入,方便处理.若枚举 ...

  10. NC200179 Colorful Tree

    题目链接 题目 题目描述 A tree structure with some colors associated with its vertices and a sequence of comman ...