【前端】在Vue项目中使用transition-group实现组件轮播效果


一、背景介绍

在项目开发的新一轮需求中希望将过去做好的echarts图表组件进行复用轮播,过去我们使用vue-seamless-scroll无缝滚动插件完成列表内容轮播,实现滚动新闻的效果。但是这一插件貌似难以使用在组件的轮播上,好在机bai缘du巧yi合xia让我发现了Vue 提供了 transition 的封装组件,用以给任何元素和组件添加进入、离开过渡效果,这不正好与本次需求不谋而合嘛。

二、查看源码

在Vue.js文档中可以看到如下关于多个组件的过渡的源码:

<template>
<transition name="component-fade" mode="out-in">
  <component v-bind:is="view"></component>
</transition>
</template>
<script>
new Vue({
  el: '#transition-components-demo',
  data: {
    view: 'v-a'
  },
  components: {
    'v-a': {
      template: '<div>Component A</div>'
    },
    'v-b': {
      template: '<div>Component B</div>'
    }
  }
})
</script> 
<style>
.component-fade-enter-active, .component-fade-leave-active {
  transition: opacity .3s ease;
}
.component-fade-enter, .component-fade-leave-to
/* .component-fade-leave-active for below version 2.1.8 */ {
  opacity: 0;
}
</style>

效果是:选择单选框,页面显示对应的组件,但是如此操作后却出现关于组件引入和使用的报错,并且此时还是手动操作,要实现自动轮播还需要稍微进行修改。

三、改写运用

于是我进行了如下的改写:

<template>
	<transition name="slide">
        <div v-if="id === 0" key="0">
			<e-charts :options="chartOption" />
        </div>
        <div v-else-if="id === 1" key="1">
			<e-charts :options="chartOption" />
        </div>
        <div v-else-if="id === 2" key="2">
			轮播序列中的第三个组件
        </div>
        <div v-else-if="id === 3" key="3">
			轮播序列中的第四个组件
        </div>
	</transition>

    <ul style="display: flex;">
		<li @click="id = 0">第一个</li>
		<li @click="id = 1">第二个</li>
		<li @click="id = 2">第三个</li>
		<li @click="id = n">第n个</li>
    </ul>
</template>
<script>
    //照常引入所需组件,如下:
import Component from '../'
export default {
  components: {
    Component
  }
}
</script>

此时便不会出现组件引入与使用报错的问题,下一步实现自动轮播效果。

我的改写方法如下:

为实现组件轮播,那么transition组件里面就有不止一个元素了,所以必须将 transition 改成 transition-group

<template >
  <div class="chart-wrapper">
    <transition-group name="slide" mode="out-in">
      <div v-if="id === 0" key="0">
        <component0 />
          <!--添加第一个需要轮播的组件,下同-->
      </div>
      <div v-if="id === 1" key="1">
        <component1 />
      </div>
      <div v-if="id === 2" key="2">
        <component2 />
      </div>
      <div v-if="id === 3" key="3">
        <component3 />
      </div>
    </transition-group>
  </div>
</template>
<script>
//引入所需组件如下,每个组件里都有若干个echarts图表
import Component from '../'

export default {
  components: {
    Component
  },
  data() {
    return {
      id: 0,
    }
  },
  mounted() {
      //设置setInterval定时调用使得id不停切换
    setInterval(() => {
      this.changeId()
    }, 3000)//设置切换间隔
  },
  methods: {
      //添加自动切换id的方法
    changeId() {
      if (this.id == 0 || this.id == 1 || this.id == 2) {
        setTimeout(() => {
          this.id++
        }, 1000)
      } else {
        setTimeout(() => {
          this.id = 0
        }, 1000)
      }
    },
  },
}
</script>

因为 transition-group 和 transition 的原理基本上是一样的,所以只需要把 transition 改成 transition-group,其它地方无须改动。

运行起来后,发现 echarts 图表组件的轮播效果正常了!但是由于echarts是数据驱动的,所以要有给力的数据载入速度来保证流畅的轮播效果。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM