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 相关文章推荐
jQueryUI如何自定义组件实现代码
Nov 14 Javascript
原生js实现数字字母混合验证码的简单实例
Dec 10 Javascript
原生JS封装Ajax插件(同域、jsonp跨域)
May 03 Javascript
jQuery实现的tab标签切换效果示例
Sep 05 Javascript
关于Javascript中defer和async的区别总结
Sep 20 Javascript
微信小程序 loading 详解及实例代码
Nov 09 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
Dec 14 Javascript
React组件之间的通信的实例代码
Jun 27 Javascript
简述Angular 5 快速入门
Nov 04 Javascript
js中实例与对象的区别讲解
Jan 21 Javascript
微信小程序 网络通信实现详解
Jul 23 Javascript
如何在面试中手写出javascript节流和防抖函数
Oct 22 Javascript
解决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
网页上facebook分享功能具体实现
2014/01/26 PHP
PHP COOKIE及时生效的方法介绍
2014/02/14 PHP
PHP fprintf()函数用法讲解
2019/02/16 PHP
JavaScript日历实现代码
2010/09/12 Javascript
能说明你的Javascript技术很烂的五个原因分析
2011/10/28 Javascript
js二维数组定义和初始化的三种方法总结
2014/03/03 Javascript
jQuery中end()方法用法实例
2015/01/08 Javascript
jQuery操作表单常用控件方法小结
2015/03/23 Javascript
javascript事件冒泡和事件捕获详解
2015/05/26 Javascript
基于Javascript实现二级联动菜单效果
2016/03/04 Javascript
微信小程序 wxapp内容组件 text详细介绍
2016/10/31 Javascript
Javascript使用uploadify来实现多文件上传
2016/11/16 Javascript
js 轮播效果实例分享
2016/12/28 Javascript
利用pm2部署多个node.js项目的配置教程
2017/10/22 Javascript
微信小程序实现顶部下拉菜单栏
2018/11/04 Javascript
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
Vue实现数据表格合并列rowspan效果
2020/11/30 Javascript
python启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
2009/04/09 Python
python基于windows平台锁定键盘输入的方法
2015/03/05 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
2016/09/19 Python
Python 查看文件的读写权限方法
2018/01/23 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
python实现求解列表中元素的排列和组合问题
2018/03/15 Python
python使用folium库绘制地图点击框
2018/09/21 Python
Python sklearn KFold 生成交叉验证数据集的方法
2018/12/11 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
Python使用while循环花式打印乘法表
2019/01/28 Python
python爬虫豆瓣网的模拟登录实现
2019/08/21 Python
详解pyinstaller selenium python3 chrome打包问题
2019/10/18 Python
Python根据字符串调用函数过程解析
2020/11/05 Python
python爬虫判断招聘信息是否存在的实例代码
2020/11/20 Python
Python 实现集合Set的示例
2020/12/21 Python
欧洲有机婴儿食品最大的市场:Organic Baby Food(供美国和加拿大)
2018/03/28 全球购物
什么是lambda函数
2013/09/17 面试题
党员公开承诺书2016
2016/03/24 职场文书
写一个Python脚本下载哔哩哔哩舞蹈区的所有视频
2021/05/31 Python