vue页面切换项目实现转场动画的方法


Posted in Javascript onNovember 12, 2019

前言

移动端, 使用vue为了良好的用户体验, 会需要实现APP形式的切换页面的左滑和右滑效果

实现原理, vue的过渡 & 动画

技术栈: vue + vue-router

解决思路

区分前进 和 后退的路由

网上搜索的资料, 找到了两种

监听popstate事件

window.addEventListener('popstate', function (e) {
  // 用来判断是否是后退, 在判断后需要在其他地方重置
  router.isBack = true
},false)

在注册路由的时, 添加 meta对象 ( 路由元信息)中添加索引, 这样做就需要注意索引的大小(这里使用这一种方式)

{
   path: "/login",
   component: resolve => require(["@/pages/login"], resolve),
   meta: {
    title: "登录",
    keepAlive: false,
    index: 1
   }
  },
  {
   path: "/forward",
   name: "Forward",
   component: resolve => require(["@/pages/forward"], resolve),
   meta: {
    title: "前进",
    keepAlive: true,
    index: 2
   }
  },

根据切换方向设置不同的动画效果(通过给transtion内置组件不同的name选项)

方案

路由注册

{
   path: "/login",
   component: resolve => require(["@/pages/login"], resolve),
   meta: {
    title: "登录",
    keepAlive: false, // 用来判断是否缓存, 当判断为缓存时, 则路由信息的name和组件的name选项需一致
    index: 1, // 通过比较不同的索引, 来判断是前进动画还是后退动画
   }
  },
  {
   path: "/forward",
   name: "Forward",
   component: resolve => require(["@/pages/forward"], resolve),
   meta: {
    title: "前进",
    keepAlive: true,
    index: 2
   }
  },

在App.vue(根组件)中, 判断动画方向

<template>
 <div id="project">
   <!-- 
   <keep-alive>
       <router-view v-if="$route.meta.keepAlive"></router-view>
   </keep-alive>
   <router-view v-if="!$route.meta.keepAlive"></router-view>
   这种情况下, 
   :include: 因为若是使用transition包裹两个keep-alive, vue会出现报错
        用两个transition分别包裹keep-alive, 会让transition的动画name出现问题
 --> 
  <transition :name="transitionName">
   <keep-alive :include="cachedViews">
    <router-view :key="1"></router-view>
   </keep-alive>
  </transition>
 </div>
</template>

<script>
export default {
 name: "App",
 data() {
  return {
   transitionName: "slide-right", // 初始过渡动画方向
   cachedViews: [] // 缓存组件
  };
 },
 components: {},
 created() {},
 watch: {
  $route(to, from) {
   if (to.meta.keepAlive && !this.cachedViews.includes(to.name)) {
    // 将需要缓存的组件信息, 添加进其中, 其中to.name的值应该和匹配组件的name选项一致
    this.cachedViews.push(to.name);
   }
   //如果to索引大于from索引,判断为前进状态,反之则为后退状态
   if (to.meta.index > from.meta.index) {
    //设置动画名称
    this.transitionName = "slide-left";
   } else {
    this.transitionName = "slide-right";
   }
  }
 },
 methods: {}
};
</script>


<style lang="scss" scoped>
.slide-right-enter-active,
.slide-right-leave-active,
.slide-left-enter-active,
.slide-left-leave-active {
 will-change: transform;
 transition: all 0.5s;
 <!-- 
  这个是必须的, 是为了让页面脱离文档流, 不然的话, 后进入的页面会从页面底部出来
  这个定位会直接添加到路由匹配的组件根元素上, 所以页面根组件最好设定其宽度为100vw
 -->
 width: 100vw;
 position: absolute;
}
.slide-right-enter {
 opacity: 0;
 transform: translate3d(-100%, 0, 0);
}
.slide-right-leave-active {
 opacity: 0;
 transform: translate3d(100%, 0, 0);
}
.slide-left-enter {
 opacity: 0;
 transform: translate3d(100%, 0, 0);
}
.slide-left-leave-active {
 opacity: 0;
 transform: translate3d(-100%, 0, 0);
}
</style>

待解决问题

  • 子路由问题

子路由还没有考虑到

  • 缓存组件问题

使用上述方式, 缓存组件需要注意组件的name选项要和路由的name选项一致, 容易疏忽填写组件的name选项问题

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ejs v9 javascript模板系统
Mar 21 Javascript
JavaScript中检查对象property的存在性方法介绍
Dec 30 Javascript
解决jquery插件:TypeError:$.browser is undefined报错的方法
Nov 21 Javascript
js控住DOM实现发布微博效果
Aug 30 Javascript
原生JS实现在线问卷调查投票特效
Jan 03 Javascript
AngularJS 文件上传控件 ng-file-upload详解
Jan 13 Javascript
微信小程序之拖拽排序(代码分享)
Jan 21 Javascript
JavaScript面向对象精要(上部)
Sep 12 Javascript
Vue集成Iframe页面的方法示例
Dec 12 Javascript
js实现导航跟随效果
Nov 17 Javascript
微信小程序常用简易小函数总结
Feb 01 Javascript
jQuery中实现text()的方法
Apr 04 jQuery
解决vue-cli 打包后自定义动画未执行的问题
Nov 12 #Javascript
vue transition 在子组件中失效的解决
Nov 12 #Javascript
vue+element导航栏高亮显示的解决方式
Nov 12 #Javascript
vue-element-admin 菜单标签失效的解决方式
Nov 12 #Javascript
Vue退出登录时清空缓存的实现
Nov 12 #Javascript
解决vue admin element noCache设置无效的问题
Nov 12 #Javascript
Vue2.0 实现页面缓存和不缓存的方式
Nov 12 #Javascript
You might like
多人战的战术与战略
2020/03/04 星际争霸
php5.2时间相差8小时
2007/01/15 PHP
php计算数组不为空元素个数的方法
2014/01/27 PHP
JS 面向对象的5钟写法
2009/07/31 Javascript
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
JQuery1.6 使用方法三
2011/11/23 Javascript
JS获取下拉列表所选中的TEXT和Value的实现代码
2014/01/11 Javascript
js实现刷新iframe的方法汇总
2015/04/27 Javascript
jQuery+HTML5实现图片上传前预览效果
2015/08/20 Javascript
javascript for-in有序遍历json数据并探讨各个浏览器差异
2015/11/30 Javascript
AngularJS中监视Scope变量以及外部调用Scope方法
2016/01/23 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
详解VueJS 数据驱动和依赖追踪分析
2017/07/26 Javascript
使用Python中PDB模块中的命令来调试Python代码的教程
2015/03/30 Python
Python装饰器(decorator)定义与用法详解
2018/02/09 Python
对pandas进行数据预处理的实例讲解
2018/04/20 Python
python绘制中国大陆人口热力图
2018/11/07 Python
详解python selenium 爬取网易云音乐歌单名
2019/03/28 Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
2019/07/23 Python
python实现画出e指数函数的图像
2019/11/21 Python
Python yield的用法实例分析
2020/03/06 Python
Django数据结果集序列化并展示实现过程
2020/04/22 Python
override和overload的区别
2016/03/09 面试题
外贸学院会计专业应届生求职信
2013/11/14 职场文书
大学校运会广播稿
2014/02/03 职场文书
摄影助理岗位职责
2014/02/07 职场文书
相亲大会策划方案
2014/06/05 职场文书
八一建军节演讲稿
2014/09/10 职场文书
先进个人申报材料
2014/12/30 职场文书
2015年党小组工作总结
2015/05/26 职场文书
考研经验交流会策划书
2015/11/02 职场文书
2016幼儿园毕业感言
2015/12/08 职场文书
详解Redis在SpringBoot工程中的综合应用
2021/10/16 Redis
baselines示例程序train_cartpole.py的ImportError
2022/05/20 Python