当前位置: 首页 > article >正文

vueRouter路由切换时实现页面子元素动画效果, 左右两侧滑入滑出效果

说明

vue路由切换时,当前页面左侧和右侧容器分别从两侧滑出,新页面左右分别从两侧滑入

效果展示

路由切换-滑入滑出效果

在这里插入图片描述

难点和踩坑

  1. 现路由和新路由始终存在一个页面根容器,通过<transition>组件,效果只能对页面根容器有效。
  2. 如果通过组件(页面)级路由守卫(进入、退出)来改变受控变量,模版对左右容器v-if + <transition>设置效果。
    • 路由切换是一瞬间的事,滑出动画来不及触发,路由就改变了
    • 所有页面都需要改造
    • 我确实没找到路由守卫进入事件 只有 import { onBeforeRouteLeave, onBeforeRouteUpdate } from 'vue-router'
  3. 如果纯通过onMounted和onUnMounted等钩子实现,和2的问题基本差不多

实现方式

基于<template>组件的钩子函数完全自主实现过渡效果.

钩子函数说明
beforeEnter在元素被插入到 DOM 之前被调用
enter在元素被插入到 DOM 之后的下一帧被调用
afterEnter当进入过渡完成时调用。
enterCancelled当进入过渡在完成之前被取消时调用
beforeLeave在 leave 钩子之前调用, 大多数时候,你应该只会用到 leave 钩子
leave在离开过渡开始时调用
afterLeave在离开过渡完成, 且元素已从 DOM 中移除时调用
leaveCancelled仅在 v-show 过渡中可用

直接上代码

<router-view> 改造

<router-view v-slot="{ Component }">
  <transition
    mode="default"
    :css="false"
    @before-leave="onBeforeLeave"
    @before-enter="onBeforeEnter"
    @enter="onEnter"
    @leave="onLeave"
  >
    <component :is="Component"></component>
  </transition>
</router-view>

钩子函数

/**
 * left-wrap和right-wrap 为路由页面中左右两侧模块
 */

// 退出前的钩子
const onBeforeLeave = (el: any) => {
  const left = el.querySelector('.left-wrap')
  const right = el.querySelector('.right-wrap')
  if (!left || !right) {
    return
  }
  left.style.transform = 'translateX(0)'
  right.style.transform = 'translateX(0)'
}
// 退出时的钩子
const onLeave = (el: any, done: Function) => {
  const left = el.querySelector('.left-wrap')
  const right = el.querySelector('.right-wrap')
  if (!left || !right) {
    done()
    return
  }
  left.style.transition = 'all 0.3s linear'
  right.style.transition = 'all 0.3s linear'

  left.style.transform = 'translateX(-120%)'
  right.style.transform = 'translateX(120%)'

  /**
   * 这里延迟done是为了过渡效果完成后再彻底退出
   * 如果将时长改大一点, 页面审查元素就能看到,
   * 路由切换时, 当前路由和新路由同时存在于页面, 当定时结束,done被调用时, 原路由组件才消失
   */
  setTimeout(() => {
    done() // 完成过渡
  }, 300)
}

// 进入前的钩子
const onBeforeEnter = (el: any) => {
  const left = el.querySelector('.left-wrap')
  const right = el.querySelector('.right-wrap')
  if (!left || !right) {
    return
  }
  left.style.transform = 'translateX(-120%)'
  right.style.transform = 'translateX(120%)'
}
// 进入时的钩子
const onEnter = (el: any, done: Function) => {
  const left = el.querySelector('.left-wrap')
  const right = el.querySelector('.right-wrap')
  if (!left || !right) {
    done()
    return
  }
  left.style.transition = 'all 0.5s linear'
  right.style.transition = 'all 0.5s linear'

  // 这里延时是为了等待原路由退出效果完成, 再为新路由组件设置进入效果
  setTimeout(() => {
    left.style.transform = 'translateX(0)'
    right.style.transform = 'translateX(0)'
    done() // 完成过渡
  }, 300)
}

总计

  • 多调整参数看效果,就能大概猜出transition组件的实现原理
  • 通过钩子函数自定义过渡或动画效果,可操作性确实大,就是有点麻烦

http://www.kler.cn/a/394058.html

相关文章:

  • Java结合ElasticSearch根据查询关键字,高亮显示全文数据。
  • 【机器学习】如何配置anaconda环境(无脑版)
  • 机器学习总结
  • Window下PHP安装最新sg11(php5.3-php8.3)
  • 卓胜微嵌入式面试题及参考答案(2万字长文)
  • 设计模式之责任链模式(Chain Of Responsibility)
  • 数据分析编程:SQL,Python or SPL?
  • 机器学习—为什么我们需要激活函数
  • 分享 | 中望3D 2025发布会提及的工业数字化MBD是什么?
  • 本溪与深圳市新零售产业互联协会共商世界酒中国菜湾区农业发展
  • 力扣257:二叉树的所有路径
  • adb不识别设备(手机)的若干情形及解决方法
  • 研究生如何远控实验室电脑?远程办公功能使用教程
  • 论文学习_Efficient Algorithms for Personalized PageRank Computation: A Survey
  • 【案例】定性数据分析软件NVivo 在医疗保健领域的应用
  • A034-基于Spring Boot的供应商管理系统的设计与实现
  • Excel筛选的操作教程
  • ThreadLocal原理及其内存泄漏
  • AI云产品,缺运维技术指南
  • 区块链智能合约开发:全面解析与实践指南
  • 在使用ipc通信时 ,在渲染进程的Vue + TypeScript 开发过程,给window对象添加属性并赋值时,发生报错解决方法
  • docker打包nginx版wordpress
  • Spring Boot基础教学:开发工具和环境
  • swoole mysql连接池使用
  • 网络安全web基础_HTML基础(扫盲篇)
  • 如何抓住鸿蒙生态崛起的机遇,解决开发挑战,创造更好的应用体验?