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 相关文章推荐
js 刷新页面的代码小结 推荐
Apr 02 Javascript
jQuery AJAX实现调用页面后台方法和web服务定义的方法分享
Mar 01 Javascript
jQuery函数的等价原生函数代码示例
May 27 Javascript
Javascript 按位左移运算符使用介绍(
Feb 04 Javascript
BootStrap学习系列之布局组件(下拉,按钮组[toolbar],上拉)
Jan 03 Javascript
基于node.js express mvc轻量级框架实践
Sep 14 Javascript
Validform验证时可以为空否则按照指定格式验证
Oct 20 Javascript
node下使用UglifyJS压缩合并JS文件的方法
Mar 07 Javascript
在微信小程序里使用watch和computed的方法
Aug 02 Javascript
vuejs实现折叠面板展开收缩动画效果
Sep 06 Javascript
使用Node.js实现一个多人游戏服务器引擎
Mar 13 Javascript
Vue开发中常见的套路和技巧总结
Nov 24 Vue.js
解决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
一棵php的类树(支持无限分类)
2006/10/09 PHP
如何在PHP中使用Oracle数据库(3)
2006/10/09 PHP
PHP个人网站架设连环讲(二)
2006/10/09 PHP
解析php中的fopen()函数用打开文件模式说明
2013/06/20 PHP
PHP调用C#开发的dll类库方法
2014/07/28 PHP
摘自织梦CMS中的图片处理类
2015/08/08 PHP
zend framework重定向方法小结
2016/05/28 PHP
2017年最好用的9个php开发工具推荐(超好用)
2017/10/23 PHP
Prototype使用指南之ajax
2007/01/10 Javascript
jQuery创建自己的插件(自定义插件)的方法
2010/06/10 Javascript
jquery动态增加text元素以及删除文本内容实例代码
2013/07/01 Javascript
网站404页面3秒后跳到首页的实例代码
2013/08/16 Javascript
js字符串日期yyyy-MM-dd转化为date示例代码
2014/03/06 Javascript
js跨域访问示例(客户端/服务端)
2014/05/19 Javascript
常用jQuery选择器总结
2014/07/11 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
Vue中使用vue-i18插件实现多语言切换功能
2018/04/25 Javascript
jQuery实现table表格checkbox全选的方法分析
2018/07/04 jQuery
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
JS错误处理与调试操作实例分析
2020/04/13 Javascript
[01:34]2014DOTA2 TI预选赛预选赛 选手比赛房大揭秘!
2014/05/20 DOTA
Python一行代码实现快速排序的方法
2019/04/30 Python
python操作小程序云数据库实现简单的增删改查功能
2019/06/06 Python
用sqlalchemy构建Django连接池的实例
2019/08/29 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
2019/10/17 Python
tensorflow之自定义神经网络层实例
2020/02/07 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
C#可否对内存进行直接的操作
2015/02/26 面试题
手术室护士自我鉴定
2013/10/14 职场文书
生物制药专业自我鉴定
2014/02/19 职场文书
空乘英文求职信
2014/04/13 职场文书
七一表彰大会简报
2015/07/20 职场文书
大学学生会主席竞选稿
2015/11/19 职场文书
pytorch 6 batch_train 批训练操作
2021/05/28 Python
Python可视化学习之seaborn绘制矩阵图详解
2022/02/24 Python