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实现双向链表互联网机顶盒实战应用实现
Oct 28 Javascript
jQuery+JSON+jPlayer实现QQ空间音乐查询功能示例
Jun 17 Javascript
实现51Map地图接口(示例代码)
Nov 22 Javascript
解析prototype,JQuery中跳出each循环的方法
Dec 12 Javascript
js使用栈来实现10进制转8进制与取除数及余数
Jun 11 Javascript
JavaScript取得键盘按下方向键是哪个的方法
Aug 04 Javascript
基于JS实现checkbox全选功能实例代码
Oct 31 Javascript
javascript解析ajax返回的xml和json格式数据实例详解
Jan 05 Javascript
vue组件实现弹出框点击显示隐藏效果
Oct 26 Javascript
Vue中使用webpack别名的方法实例详解
Jun 19 Javascript
微信小程序实现点赞、取消点赞功能
Nov 02 Javascript
babel7.x和webpack4.x配置vue项目的方法步骤
May 12 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
php内存缓存实现方法
2015/01/24 PHP
PHP保存session到memcache服务器的方法
2016/01/19 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
给网站上的广告“加速”显示的方法
2007/04/08 Javascript
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
JavaScript截取字符串的Slice、Substring、Substr函数详解和比较
2014/03/20 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
2015/04/17 Javascript
JavaScript中this详解
2015/09/01 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
详解Vue2 无限级分类(添加,删除,修改)
2017/03/07 Javascript
jquery基于layui实现二级联动下拉选择(省份城市选择)
2017/06/20 jQuery
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
vue获取dom元素注意事项
2017/12/28 Javascript
Vue绑定内联样式问题
2018/10/17 Javascript
详解element-ui级联菜单(城市三级联动菜单)和回显问题
2019/10/02 Javascript
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python显示生日是星期几的方法
2015/05/27 Python
Python Django使用forms来实现评论功能
2016/08/17 Python
Python基于win32ui模块创建弹出式菜单示例
2018/05/09 Python
numpy中的meshgrid函数的使用
2019/07/31 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
Django REST framwork的权限验证实例
2020/04/02 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
2020/04/21 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
2020/05/26 Python
Python tkinter之ComboBox(下拉框)的使用简介
2021/02/05 Python
Sandro法国官网:法国成衣品牌
2019/08/28 全球购物
写演讲稿要注意的六件事
2014/01/14 职场文书
摄影专业毕业生求职信
2014/03/13 职场文书
员工工作表现评语
2014/04/26 职场文书
司法助理专业自荐书
2014/06/13 职场文书
湖南省党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
2015毕业生实习工作总结
2014/12/12 职场文书
《植物妈妈有办法》教学反思
2016/02/23 职场文书
MySQL中连接查询和子查询的问题
2021/09/04 MySQL
HTML+JS实现在线朗读器
2022/02/15 Javascript