Vue用户进行页面切换(路由跳转)时,动态改变路由的动画(transition效果)

2023-11-09

当我们在使用Vue-Router时,为了用户有更好的视觉效果及体验,我们通常需要实现基于路由的动态过渡效果

这里写图片描述

github:https://github.com/Rise-Devin/FullStack-Product-Transport-User

在Vue中,<router-view> 是基本的动态组件,所以我们可以用 <transition> 组件给它添加一些过渡效果:
<transition>
  <router-view></router-view>
</transition>

不了解组件效果的同学可以先看一下<transition>的功能介绍:https://cn.vuejs.org/v2/guide/transitions.html

过渡效果需要导入animate.css,可到https://daneden.github.io/animate.css/下载

如果我们只需要单纯的给定一个过渡效果时,只需要给name属性赋一个固定的值即可 或 利用enter-active-class、leave-active-class
<template>
  <div id="app">
    <transition  name="custom-classes-transition"  enter-active-class="animated slideInRight" leave-active-class="animated slideOutLeft" >
     	<router-view></router-view> 
    </transition>
  </div>
</template>

<script>
export default {
  name: 'app',
  data () {
    return {
      msg: ''
    }
  },
}
</script>

<style scoped>
	#app{
    height: 100%;
    width:100%;
  }
  .animated{
    animation-duration: 0.4s;
  }
  #app div{
      position:absolute;
  }
</style>

但大多数时候我们都是需要动态改变过渡效果,这里我介绍两种实现方式,经测试都是可用的。

  • 第一种: watch $route 决定使用哪种过渡
<template>
  <div>
  <transition :name="transitionName">
    <router-view class="child-view"></router-view>
  </transition>
  </div>
</template>

  export default {
    data () {
      return {
        transitionName: 'slide-left',
        pathList:[]
      }
    },
    watch:{
      '$route'(to,from){
        console.log(from.path)
        if(this.pathList.includes(to.path))
        {

            const index = (this.pathList.findIndex(()=>{
                return from.path
            }))
            this.pathList.splice(index,1)
            console.log(index)
            this.$router.isBack=true;
        }
        else
        {
            this.pathList.push(to.path)
            this.$router.isBack=false;
        }
        if(to.path==='/start')  // 'start'为首页
        {
            this.$router.isBack=true;
            this.pathList = []
        }
        let isBack = this.$router.isBack
        console.log(isBack)
         console.log(this.pathList)
        if (isBack) {
          this.transitionName = 'slide-left'
        } else {
          this.transitionName = 'slide-right'
        }
       
        this.$router.isBack = false
        }
    }
  }
</script>
<style>
.slide-left-enter-active {
  transition: all .3s ease;
}
.slide-left-leave-active {
  transition: all .8s ease  ;
}
.slide-left-enter, 
/* .slide-fade-leave-active for below version 2.1.8 */ {
  transform: translateX(100%);
  opacity: 0;
}
.slide-left-leave-to{
 transform: translateX(-100%);
  opacity: 0;
}

.slide-right-enter-active {
  transition: all .3s ease;
}
.slide-right-leave-active {
  transition: all .8s ease  ;
}
.slide-right-enter, 
/* .slide-fade-leave-active for below version 2.1.8 */ {
  transform: translateX(-100%);
  opacity: 0;
}
.slide-right-leave-to{
    transform: translateX(100%);
    opacity: 0;
}</style>
  • 第二种: 通过vue-router的钩子函数进行监听,请不要忽略next
<template>
  <div>
  <transition :name="transitionName">
    <router-view class="child-view"></router-view>
  </transition>
  </div>
</template>

<script>
  export default {
    data () {
      return {
        transitionName: 'slide-left'
      }
    },
    beforeRouteUpdate (to, from, next) {
      console.log(to,from)
        if(this.$route.path!='/home') //假设name为home的路由都使用`slide-left`,其它的路由都为`slider-right`
        {
            this.$router.isBack=true;
        }
      let isBack = this.$router.isBack
      if (isBack) {
        this.transitionName = 'slide-right'
      } else {
        this.transitionName = 'slide-left'
      }
      this.$router.isBack = false
      next()
    }
  }
</script>
<style>
.slide-left-enter-active {
  transition: all .3s ease;
}
.slide-left-leave-active {
  transition: all .8s ease  ;
}
.slide-left-enter, 
/* .slide-fade-leave-active for below version 2.1.8 */ {
  transform: translateX(100%);
  opacity: 0;
}
.slide-left-leave-to{
 transform: translateX(-100%);
  opacity: 0;
}

.slide-right-enter-active {
  transition: all .3s ease;
}
.slide-right-leave-active {
  transition: all .8s ease  ;
}
.slide-right-enter, 
/* .slide-fade-leave-active for below version 2.1.8 */ {
  transform: translateX(-100%);
  opacity: 0;
}
.slide-right-leave-to{
    transform: translateX(100%);
    opacity: 0;
}</style>

如果觉得我的文章对你有帮助,欢迎关注我的blog

相关知识点

【Javascript】深入理解async/await的实现,Generator+Promise = Async/Await
【Javascript】深入理解this作用域问题以及new运算符对this作用域的影响
【Javascript】手写运算符new创建实例并实现js继承

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue用户进行页面切换(路由跳转)时,动态改变路由的动画(transition效果) 的相关文章

随机推荐

  • VS2008 常用快捷键

    VS2008常用快捷键 1 怎样调整代码排版的格式 选择 编辑 gt 高级 gt 设置文档的格式 或 编辑 gt 高级 gt 设置选中代码的格式 格式化cs代码 自动对齐 Ctrl k f 格式化aspx代码 Ctrl k d 2 怎样跳转
  • 除雾霾去朦胧增强色彩对比清晰画面调色插件 ClearPlus v2.1 Win/Mac AE/PR插件中文汉化版安装与使用

    插件介绍 ClearPlus是一款功能强大的AE超级色彩去雾插件 旨在增强包括模糊 水下和弱光视频在内的素材 它也是增强天空的理想选择 轻松灵活地使颜色变得时尚 阴影 高光使您可以在保持自然外观的同时调整图像的不同部分 阴影滑块和除雾滑块可
  • 成功解决:ModuleNotFoundError: No module named ‘amp_C‘

    在使用transformers时 在调用Trainer的时候遇到了这个问题 原因是apex包有问题 这里有解决apex安装包的多一些教程 https blog csdn net Xidian185 article details 12274
  • react讲解(组件,生命周期以及受控组件)

    文章目录 前言 一 组件的通信原理 state 和 setState 二 组件分类 1 类组件 2 组件中父子组件的通信 代码示例 A组件代码 B组件代码 2 跨组件通信 A组件代码如下 C组件代码如下 三 组件的生命周期
  • Elasticsearch内存那些事儿

    Elasticsearch 内存分配设置详解 前言 该给 ES 分配多少内存 为什么是给 ES 分配服务器的一半内存 为什么内存使用率不断升高 没有释放 为何经常有某个 field 的数据量超出内存限制的异常 为何感觉上没多少数据 也会经常
  • TCP协议 ---可靠传输的各种机制

    目录 一 可靠 确认应答机制 保证数据可靠 有序的到达对端 超时重传机制 二 效率 2 1 提高自身发送数据量 滑动窗口机制 滑动窗口的发送缓冲区是环形队列 滑动窗口的大小会变化吗 滑动窗口的nb之处 滑动窗口丢包问题 2 2 对方的接受能
  • twrp3.3.0刷n9002_【笔刷】iPad Procreate5.0新笔刷分享,巨好用!

    01 Procreate 趣味复古蜡笔纹理笔刷15款 适用软件 Procreate5 0以上 适用系统 ipad系统 笔刷格式 brushset 素材大小 93MB 笔刷视频演示 赠送15款笔刷 29款色卡 一张纸张背景 02 Procre
  • 树莓派Pico

    9 2 在MS Windows上构建 在Microsoft Windows 10或Windows 11上安装工具链与其他平台有些不同 然而安装后 RP2040的构建代码基本类似 Tips 什么是工具链 工具链是指一系列软件 逐个使用这一系列
  • docker run中-v参数的用法解释

    作用 挂载宿主机的一个目录 如 docker run it v 宿主机目录 容器目录 镜像名 bin bash 这里 it是参数作用是 i 以交互模式运行容器 通常与 t 同时使用 t 为容器重新分配一个伪输入终端 通常与 i 同时使用 就
  • keil编译时候产生的错误(Error: L6200E: Symbol....)解决方法

    今天分享一个自己在做实验时候发现的一个错误问题 查了一下网上也有人遇到这样的问题 就拿出来分享了一下自己遇到的情况 首先看keil的错误提示 如图所示 可以看到两个报错为 Error L6200E Symbol usart3 init mu
  • CV Code

    点击我爱计算机视觉标星 更快获取CVML新技术 计算机视觉技术发展迅速 很多时候 可悲的不是我们没有努力 而是没有跟上时代的步伐 努力coding终于出来结果了 却发现早就有人开源了 效果还比自己写的好 CV君汇总了最近过去的一周新出的开源
  • 【Matlab】将Matlab里的几个变量一个存成csv文件

    注意 几个变量类型可以不同 但是长度必须相同 举例说明 1 比如说在workspace里已经有两个变量 a和b如图 每个变量为1列 想把这两个变量存成一个csv文件 2 先给这两个变量名起个名字 分别为A B 存入 datacolumns
  • 数据属性类型

    数据集由数据对象组成 一个数据对象代表一个实体 数据对象又称样本 实例 数据点或对象 属性 attribute 是一个数据字段 表示数据对象的一个特征 属性向量 或特征向量 是用来描述一个给定对象的一组属性 属性有不同类型 标称属性 nom
  • python面试题

    文章目录 Python面试基础题小汇总 1 Python是如何进行内存管理的 2 什么是lambda函数 它有什么好处 3 Python里面如何实现tuple和list的转换 4 请写出一段Python代码实现删除一个list里面的重复元素
  • 常用的运算放大器电路

    在线仿真网站 http scratch trtos com circuitjs html 一 反向比例放大电路 二 同向比例放大电路 三 电压跟随器 四 反向求和运算电路 五 同向求和运算电路 六 加减法运算放大器 七 差分放大器 八 积分
  • 关于自制CMSIS_DAP离线下载器下载算法的代码说明:“0xE00ABE00, 0x062D780D, 0x24084068, 0xD3000040, 0x1E644058, 0x1C49D1FA“

    关于自制CMSIS DAP离线下载器下载算法的代码说明 0xE00ABE00 0x062D780D 0x24084068 0xD3000040 0x1E644058 0x1C49D1FA 在自制CMSIS DAP离线下载器的时候 利用FLM
  • Mysql篇-第2章,什么是脏读、幻读、不可重复读?如何处理?

    一 Mysql进行事务并发控制时经常遇到的问题 脏读 在事务进行中 读到了其他事务未提交的数据 举个例子 有一个table表 如果执行顺序如下 这种情况下左边查询的结果会是101 正是因为读取到了另一个事务未提交的数据 幻读 在一个事务中
  • selenium 获取cookie 并使用

    selenium 获取cookie 参数设置 以获取阿里云cookie范例 from selenium import webdriver import json url https account aliyun com login logi
  • 使用Python的方式理解Golang的结构体struct

    Go源码 package GoTools import fmt 定义结构体存储密码 type Config struct password string func InitConfig password string Config c ne
  • Vue用户进行页面切换(路由跳转)时,动态改变路由的动画(transition效果)

    当我们在使用Vue Router时 为了用户有更好的视觉效果及体验 我们通常需要实现基于路由的动态过渡效果 github https github com Rise Devin FullStack Product Transport Use