Vue实现内部组件轮播切换效果的示例代码(3)

所以我们手动实现一个。

我的想法是每次都准备两个slide,第1个slide是当前展示用的,第2个slide拼在它的后面,准备切过来,当第2个slide切过来之后,删掉第1个slide,然后在第2个的后面再接第3个slide,不断地重复这个过程。如果我们没有使用Vue,而是自己增删DOM,那么没什么问题,可以很任性地自己发挥。 使用Vue可以怎么优雅地实现这个功能呢

在上面一个component的基础上,再添加一个component,刚开始第1个component是当前展示的,而第2个component是拼在它右边的,当第2个切过去之后,就把第1个移到第2的后面,同时把内容改成第3个slide的内容,依此类推。使用Vue不太好动态地改DOM,但是可以 借助jssor slider的思想 ,不移动DOM,只是改变component的translate的值。

给其中一个component套一个next-task的类,具有这个类的组件就表示它是下一张要出现的,它需要translateX(100%),如下代码所示:

<template>
<div id="app">
  <div class="task-container">
    <component :is="'task-' + questions[currentIndex].type" 
      ></component>
    <component :is="'task-' + questions[currentIndex + 1].type" 
      class="next-task"></component>
  </div>
</div>
</template>
 
<style>
.next-task {
  display: none;
  transform: translateX(100%);
  /* 添加一个动画,当改变transform的值时就会触发这个动画 */
  transition: transform 0.5s ease;
}
</style>

上面代码把具有.next-task类的component隐藏了,这样是做个优化,因为display: none的元素只会构建DOM,不会进行layout和render渲染。

所以就把问题转换成怎么在这两个component之间,切换next-task的类。一开始next-task是在第2个,当第2个切过来之后,next-task变成加在第1个上面,这样轮流交替。

进而,发现一个规律,如果currentIndex是偶数话,如o、2、4…,那么next-task是加在第2个component的,而如果currentIndex是奇数,则next-task是加在第1个component的。所以可以根据currentIndex的奇偶性切换。

如下代码所示:

<template>
<div id="app">
  <div class="task-container">
    <component :is="'task-' + questions[evenIndex].type" 
      :class="{'next-task': nextIndex === evenIndex}"
      ref="evenTask"></component>
    <component :is="'task-' + questions[oddIndex].type" 
      :class="{'next-task': nextIndex === oddIndex}
      ref="oddTask"></component>
  </div>
</div>
</template>
 
<script>
 
export default {
  name: 'App',
  data() {
    return {
      currentIndex: 0, // 当前显示的index
      nextIndex: 1,  // 表示下一张index,值为currentIndex + 1
      evenIndex: 0,  // 偶数的index,值为currentIndex或者是currentIndex + 1
      oddIndex: 1   // 奇数的index,值同上
    };
  },
}
      

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/140.html