【前端】在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