一.transition过渡

1.需求1(优化):想要一种效果,想要ios那种页面切换效果,总而言之就是过渡效果。

附上官网介绍地址:https://cn.vuejs.org/v2/guide/transitions.html

1.

App.vue代码片段如下:

  1. <template>
  2. <div id="app">
  3. <transition :name="transitionName">
  4. <keep-alive>
  5. <router-view v-if="$route.meta.keepAlive"></router-view>
  6. </keep-alive>
  7. </transition>
  8. <transition :name="transitionName">
  9. <router-view v-if="!$route.meta.keepAlive"></router-view>
  10. </transition>
  11. </div>
  12. </template>

以上是HTML上的代码,在keep-alive外层,增加transition,并且绑定name属性transitionName(这个是一个变量,用来控制想要加的样式前缀),看了下面的代码你就懂了:

  1. watch: {//使用watch 监听$router的变化
  2. $route(to, from) {
  3. //如果to索引大于from索引,判断为前进状态,反之则为后退状态
  4. if(to.meta.index > from.meta.index){
  5. //设置动画名称
  6. this.transitionName = 'slide-left';
  7. }else{
  8. this.transitionName = 'slide-right';
  9. }
  10. }
  11. }
  12.  
  1. import Vue from 'vue';
  2. import VueRouter from 'vue-router'
  3.  
  4. import Home from '@V/home'
  5. import List from '@V/list'
  6. import Approve from '@V/approve'
  7. import DetailInfo from '@V/detailInfo'
  8. import Info from '@V/info'
  9.  
  10. Vue.use(VueRouter)
  11.  
  12. export const routes = [
  13. {
  14. path:'/',
  15. name:'home',
  16. component:Home,
  17. meta: {
  18. keepAlive: false,
  19. index:
  20. },
  21. },
  22. {
  23. path:'/list',
  24. name:'list',
  25. component:List,
  26. meta: {
  27. keepAlive: true,
  28. index:
  29. },
  30. },
  31. {
  32. path:'/approve',
  33. name:'approve',
  34. component:Approve,
  35. meta: {
  36. keepAlive: false,
  37. index:
  38. },
  39. },
  40. {
  41. path:'/detailInfo',
  42. name:'detailInfo',
  43. component:DetailInfo,
  44. meta: {
  45. keepAlive: false,
  46. index:
  47. },
  48. },
  49. {
  50. path:'/info',
  51. name:'info',
  52. component:Info,
  53. meta: {
  54. keepAlive: false,
  55. index:
  56. },
  57. }
  58. ]

看到这里估计你仅仅是知道transition变量是根据页面切换to和from索引来控制值,其实这个值是一个过渡类名的前缀,用来拼接transition的过渡状态,以下引用官方的解释:

过渡的类名

在进入/离开的过渡中,会有 6 个 class 切换。

  1. v-enter:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。

  2. v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。

  3. v-enter-to: 2.1.8版及以上 定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter 被移除),在过渡/动画完成之后移除。

  4. v-leave: 定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。

  5. v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。

  6. v-leave-to: 2.1.8版及以上 定义离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave 被删除),在过渡/动画完成之后移除。

   对于这些在过渡中切换的类名来说,如果你使用一个没有名字的 <transition>,则 v- 是这些类名的默认前缀。如果你使用了 <transition name="my-transition">,那么 v-enter 会替换为 my-transition-enter

以上是官方的解释,下面看看css是怎么写的:

  1. .slide-right-enter-active,
  2. .slide-right-leave-active,
  3. .slide-left-enter-active,
  4. .slide-left-leave-active {
  5. will-change: transform;
  6. transition: all 500ms;
  7. position: absolute;
  8. }
  9. .slide-right-enter {
  10. opacity:;
  11. transform: translate3d(-100%, 0, 0);
  12. }
  13. .slide-right-leave-active {
  14. opacity:;
  15. transform: translate3d(100%, 0, 0);
  16. }
  17. .slide-left-enter {
  18. opacity:;
  19. transform: translate3d(100%, 0, 0);
  20. }
  21. .slide-left-leave-active {
  22. opacity:;
  23. transform: translate3d(-100%, 0, 0);
  24. }

以上就是把transition的状态写了个过渡样式,加上这样的代码,你就可以实现需求一。附上完整代码:

  1. <template>
  2. <div id="app">
  3. <transition :name="transitionName">
  4. <keep-alive>
  5. <router-view v-if="$route.meta.keepAlive"></router-view>
  6. </keep-alive>
  7. </transition>
  8. <transition :name="transitionName">
  9. <router-view v-if="!$route.meta.keepAlive"></router-view>
  10. </transition>
  11. </div>
  12. </template>
  13.  
  14. <script>
  15.  
  16. export default {
  17. name: 'app',
  18. data(){
  19. return {
  20. // text:sessionStorage.getItem('parameters')
  21. transitionName:''
  22. }
  23. },
  24. watch: {//使用watch 监听$router的变化
  25. $route(to, from) {
  26. //如果to索引大于from索引,判断为前进状态,反之则为后退状态
  27. if(to.meta.index > from.meta.index){
  28. //设置动画名称
  29. this.transitionName = 'slide-left';
  30. }else{
  31. this.transitionName = 'slide-right';
  32. }
  33. }
  34. }
  35. }
  36. </script>
  37.  
  38. <style lang="less">
  39. @import '~vux/src/styles/reset.less';
  40.  
  41. #app{
  42. /*position: relative;*/
  43. }
  44. body {
  45. background-color: #fbf9fe;
  46. }
  47. .vux-x-icon {
  48. fill:#1d83ef;
  49. }
  50. .backicon {
  51. width:38px;
  52. height:38px;
  53. display:inline-block;
  54. border-radius:%;
  55. border:1px solid #1d83ef;
  56.  
  57. }
  58. .slide-right-enter-active,
  59. .slide-right-leave-active,
  60. .slide-left-enter-active,
  61. .slide-left-leave-active {
  62. will-change: transform;
  63. transition: all 500ms;
  64. position: absolute;
  65. }
  66. .slide-right-enter {
  67. opacity: ;
  68. transform: translate3d(-%, , );
  69. }
  70. .slide-right-leave-active {
  71. opacity: ;
  72. transform: translate3d(%, , );
  73. }
  74. .slide-left-enter {
  75. opacity: ;
  76. transform: translate3d(%, , );
  77. }
  78. .slide-left-leave-active {
  79. opacity: ;
  80. transform: translate3d(-%, , );
  81. }
  82. </style>

注明:上周5同事发现了一个bug,发现用transition之后,切换页面的时候可能可能可能会出现一个问题:会出现短暂的白板!!!同事说,可能是加了transition左右滑动的时候定位出现的问题,所以出现短暂白板。当时的解决方案就是,在app.vue中的,给#app加了个样式,position:relative,其他的子组件每个最外层都加了个position:absolute。这样就完美解决了。不过今天写博客的时候,我又实验了一把,没出现白板的问题。如果出现以上问题,就试试加个定位吧。

另外,还有个bug,上面的代码,是通过v-if去判断缓存,而且有两个transition,运行起来发现,切换页面的时候交替闪现,其实,这里也猜到了,是两个transition通过v-if判断的时候,出现的交错的bug。下面继续完善上面的需求:

下面是文档介绍:

include - 字符串或正则表达式。只有匹配的组件会被缓存。 
exclude - 字符串或正则表达式。任何匹配的组件都不会被缓存。

下面贴上更改后app.vue的代码:

  1. <template>
  2. <div id="app">
  3. <transition :name="transitionName">
  4. <keep-alive include="list">
  5. <router-view></router-view>
  6. <!--<router-view v-if="$route.meta.keepAlive"></router-view>-->
  7. </keep-alive>
  8. </transition>
  9. <!--<transition :name="transitionName">
  10. <router-view v-if="!$route.meta.keepAlive"></router-view>
  11. </transition>-->
  12. </div>
  13. </template>

app.vue其他地方不变,这里引入的include(当然,如果你喜欢用exclude也可以,相反而已,排除引号内的组件名字,以外的都要缓存)是要缓存的组件name,多个缓存页面name用逗号分隔。比如:include="list,info,home"

所以路由页面的页不用设置meta:{keepAlive:true}了,路由代码如下:

  1. export const routes = [
  2. {
  3. path:'/',
  4. name:'home',
  5. component:Home,
  6. meta: {
  7. index:1
  8. },
  9. },
  10. {
  11. path:'/list',
  12. name:'list',
  13. component:List,
  14. meta: {
  15. index:2
  16. },
  17. },
  18. {
  19. path:'/approve',
  20. name:'approve',
  21. component:Approve,
  22. meta: {
  23. index:3
  24. },
  25. },
  26. {
  27. path:'/detailInfo',
  28. name:'detailInfo',
  29. component:DetailInfo,
  30. meta: {
  31. index:3
  32. },
  33. },
  34. {
  35. path:'/info',
  36. name:'info',
  37. component:Info,
  38. meta: {
  39. index:4
  40. },
  41. }
  42. ]

over,这是今天的内容,自己的一份记录,也希望对你有帮助。

vue进入/离开 & 列表过渡transition的更多相关文章

  1. vue总结 04过渡--进入/离开 列表过渡

    进入/离开 & 列表过渡 概述 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果.包括以下工具: 在 CSS 过渡和动画中自动应用 class 可以配合使用第三方 CS ...

  2. vue过渡 & 动画---进入/离开 & 列表过渡

    (1)概述 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果.包括以下工具: 在 CSS 过渡和动画中自动应用 class 可以配合使用第三方 CSS 动画库,如 Animat ...

  3. Vue列表过渡

    前面的话 本文将详细介绍Vue列表过渡 概述 前面分别介绍了单元素CSS过渡和JS过渡,以及多元素过渡.如何同时渲染整个列表呢?在这种情景中,需要使用<transition-group>组 ...

  4. vue 过渡效果-列表过渡

    到目前为止,关于过渡我们已经讲到, 单个节点 同一时间渲染多个节点的一个 那么怎么同时渲染整个列表,比如使用v-if?在这种场景下,使用<transition-group>组件,在我们深入 ...

  5. Vue基础进阶 之 列表过渡

    在前面的博客我们一直在操作单个元素的过渡,如果是对多个元素过渡,例如列表,这时就要用到<transition-group>这个组件了: 如何使用:将要操作的列表元素放在<transi ...

  6. Vue中Js动画 与Velocity.js 多组件多元素 列表过渡

    Vue提供我们很多js动画钩子 写在tansition标签内部 入场动画 @before-enter="" 处理函数收到一个参数(e l) el为这个元素 @enter=" ...

  7. Vue过渡效果之CSS过渡

    前面的话 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果.本文将从CSS过渡transition.CSS动画animation及配合使用第三方CSS动画库(如animate. ...

  8. Vue过渡效果之JS过渡

    前面的话 与CSS过渡不同,JS过渡主要通过事件进行触发.本文将详细介绍Vue过渡效果之JS过渡 事件钩子 JS过渡主要通过事件监听事件钩子来触发过渡,共包括如下的事件钩子 <transitio ...

  9. 初学vue----动画过渡transition简单部分

    使用动画效果要用transition包裹,transition(<trsnsition name="xx"><div></div></tr ...

随机推荐

  1. SQL server查找指定表的所有索引

    WITH tmp AS ( SELECT indexname = a.name , tablename = c.name , indexcolumns = d.name , a.indid FROM ...

  2. 文本(TextView)

    今天给大家介绍一下简单的文本. 首先我们看下TextView的继承关系和一些基本的属性: xml文件如下: <?xml version="1.0" encoding=&quo ...

  3. ArcGIS 地类净面积计算工具

    地类净面积计算工具可以自己定义图层.字段.地类代码计算任意图层的椭球面积.线状地物扣除.零星扣除和其他扣除,计算地类净面积计算:可以用于二调数据图斑地类.规划地块和基本农田等等需要计算净面积的都可以. ...

  4. PRML读书笔记——线性回归模型(上)

    本章开始学习第一个有监督学习模型--线性回归模型."线性"在这里的含义仅限定了模型必须是参数的线性函数.而正如我们接下来要看到的,线性回归模型可以是输入变量\(x\)的非线性函数. ...

  5. Anaconda管理多版本的python环境

    通过Conda的环境管理功能,我们能同时安装多个不同版本的Python,并能根据需要自由切换.下面我将给大家分享一下,新增Python版本,切换,再切回主版本的详细过程. 方法/步骤   1 首先确保 ...

  6. c# 设计模式 之:工厂模式之---工厂模式

    1.uml类图: 实现和依赖关系: 实现: SportFactory.JeepFactory.HatchbackFactory 实现 IFactory 接口 SportCar.JeepCar.Hatc ...

  7. 使用UILabel实现滚动字幕移动效果

    使用UILabel实现滚动字幕移动效果 这个链接中的代码也实现了这种效果 https://github.com/cbpowell/MarqueeLabel 最终效果如下: 原理如下: 1. 获取文本 ...

  8. 沉淀再出发:IoC和AOP的本质

    沉淀再出发:IoC和AOP的本质 一.前言 关于IoC和AOP这两个概念,如果我们没有深入的理解可以说是根本就不理解Spring这个架构的,同样的由Spring演变出来的Spring Boot和Spr ...

  9. Aizu 2249 & cf 449B

    Aizu 2249 & cf 449B 1.Aizu - 2249 选的边肯定是最短路上的. 如果一个点有多个入度,取价值最小的. #include<bits/stdc++.h> ...

  10. 阿里八八“好记”——UML设计

    团队分工 叶文滔:软件整体框架部分 俞鋆:后端数据库部分 王国超:日程多日显示部分 黄梅玲:日程详细显示部分 张岳.刘晓.李嘉群:用户部分 UML设计 整体框架 用例图 类图 活动图 状态图 数据库部 ...