嵌套走马灯Carousel

文章详细描述了如何在Vue.js中使用Carousel组件实现嵌套走马灯的效果,包括项目与标段的切换逻辑。当项目包含标段时,停止项目切换并切换标段,标段切换完成后继续切换项目。关键在于动态修改嵌套走马灯的autoplay属性,并利用@change事件处理切换。文章还提供了数据重构方法carouselInitData用于生成合适的嵌套数据结构。
摘要由CSDN通过智能技术生成

Carousel 的应用很广泛,基础用法这里不多做阐述,感兴趣的可以去element-gui了解Carousel 组件。

今天主要是梳理嵌套走马灯的逻辑,背景如下:

需要对项目做一个展示,项目可能有一个或多个,同时一个项目可能不包含标段,也可能包含一个或多个标段。

要求: 切换展示项目,若是项目包含标段,停止项目的切换,进行标段的切换(2个标段占用一个走马灯),当当前项目的标段信息切换到最后一页之后,切换下一个项目,一直这样轮回切换。

具体效果如下所示:

嵌套走马灯

外层灰色框的是项目走马灯,里面嵌套的是标段走马灯。

代码如下:

<template>
<!-- 嵌套走马灯示例 :initial-index="projectIndex"  bidAutoArr[key]-->
  <el-carousel :interval="4000" type="card" width="1500px" height="230px" :autoplay="projectAuto" @change="projectPlayChange">
    <el-carousel-item v-for="(item, key) in carouselData" :key="key">
      <p>项目编号: {{item.projectCode}}</p>
      <p>项目名称: {{item.projectName}}</p>
      <div class="outer">
        <el-carousel :interval="4000" type="card" height="100px" :autoplay="item.bidAutoplay" @change="bidPlayChange" ref="bidCarousel">
          <el-carousel-item v-for="(bidSection, bidSectionKey) in item.bidSections" :key="bidSectionKey" class="content">
            <p v-for="(bidInfo,bidInfoKey) in bidSection" :key="bidInfoKey">
              {{bidInfo.bidSectionCode}} : {{bidInfo.bidSectionName}}
            </p>
          </el-carousel-item>
        </el-carousel>
      </div>
    </el-carousel-item>
  </el-carousel>
</template>

<script>
import data from '../dataMaked/CarouslDemo.json'
export default {
  data(){
    return {
      carouselData: [],   // 嵌套走马灯里需展示的数据
      projectAuto: false, // 项目是否自动切换
      projectIndex: 0,    // 走马灯显示的当前项目的索引
    }
  },
  methods: {
    // 项目走马灯切换
    projectPlayChange(proIndex) {
      console.log('==================项目=============================');
      console.log(proIndex);
      this.projectAuto = false;
      // 把上一页的项目的标段走马灯手动切换到第一页(不然上一页项目的标段走马灯是最后一页的状态)
      console.log('pppppppppppppppppppppppppppppppppppppppppppppp');
      console.log(this.$refs.bidCarousel[this.projectIndex]);
      this.$refs.bidCarousel[this.projectIndex].setActiveItem(0);

      // 更换项目索引为的当前项目
      this.projectIndex = proIndex;
      // 判断当前项目下标段走马灯数量,若是大于1,切标段;反之切项目
      console.log(this.carouselData[this.projectIndex].bidSections.length);
      if(this.carouselData[this.projectIndex].bidSections.length > 1) {
        this.carouselData[this.projectIndex].bidAutoplay = true;
      } else {
        this.projectAuto = true;
      }
    },
    // 标段走马灯切换
    bidPlayChange(bidIndex) {
      console.log('==================标段=============================');
      console.log(bidIndex);
      // 获取当前项目的标段走马灯数量
      const BidCarouselNum = this.carouselData[this.projectIndex].bidSections.length;
      // console.log(BidCarouselNum);
      // 当前索引等于BidCarouselNum-1,意味着切到最后一张走马灯了
      //      此时:判断项目长度,如果项目长度大于1,停止切标段,切项目;反之一直切换标段
      if(bidIndex == BidCarouselNum-1 && this.carouselData.length > 1) {
        this.carouselData[this.projectIndex].bidAutoplay = false;
        this.projectAuto = true;
      }
    },
  },
  created() {},
  mounted() {
    // 数据格式重构--嵌套走马灯里需展示的数据
    this.carouselData = this.$carouselInitData(data.res.kbProjectBidInfo);
    console.log('111111111111111111111111111111111111111111111');
    console.log(this.carouselData);
    // 查看第一个项目的标段数量,如果标段数量大于1,从标段开始切换。
    //    若是标段数量小于1,判断项目的个数,项目个数大于1,切项目;项目个数小于1,不动。
    if(this.carouselData[0].bidSections.length > 1) {
      this.carouselData[0].bidAutoplay = true;
    } else {
      if(this.carouselData.length > 1) {
        this.projectAuto = true;
      }
    }

  }
}
</script>

<style>
  .el-carousel__item h3 {
    color: #475669;
    font-size: 14px;
    opacity: 0.75;
    line-height: 50px;
    margin: 0;
  }

  .el-carousel__item:nth-child(2n) {
    background-color: #99a9bf;
  }

  .el-carousel__item:nth-child(2n+1) {
    background-color: #d3dce6;
  }

  .content:nth-child(2n) {
    background-color: #1db418 !important;
  }

  .content:nth-child(2n+1) {
    background-color: #d3361b !important;
  }

  .outer {
    height: 100px;
    width: 800px;
    background: #3128b4;
    margin: 10px auto;
  }
</style>

主要用到的走马灯的属性:

属性含义
:autoplay是否自动切换走马灯
:interval走马灯自动切换的时间间隔

除此之外,还用到走马灯切换时触发的事件:@change

还用到手动切换走马灯的方法:setActiveItem

逻辑梳理起来很简单,由于我们是嵌套走马灯,所以优先需要生成嵌套走马灯需要的数据格式,由此,我封装了一个方法。

/**
 * @Author: zhl
 * @Date: 2021-03-04
 * @Description: 生成两个嵌套跑马灯显示的项目及标段信息
 * @param {*} originData 表示项目信息数组
 * @param {*} bidNum 表示内层每个跑马灯显示的标段数量,不传参数就使用默认值:2
 */
var carouselInitData = function(originData, bidNum=2) {
  var newData = [];
  for(let i=0; i < originData.length; i++) {
    var info = {}; // 包含项目和标段信息的对象
    info.projectCode = originData[i].projectCode; // 项目编号
    info.projectName = originData[i].projectName; // 项目名称
    info.bidSections = []; // 内嵌走马灯每页显示标段信息(将原来的一维数组转化为二维数组)
    if(originData[i].gtvBidSection && originData[i].gtvBidSection.length > 0) { // 先判断该项目有没有标段
      var bidSectionNum = Math.ceil(originData[i].gtvBidSection.length / bidNum);
      for(let j=0; j < bidSectionNum; j++) {
        var bidSection = originData[i].gtvBidSection.slice(j*bidNum, (j+1)*bidNum);
        info.bidSections.push(JSON.parse(JSON.stringify(bidSection)));
      }
    }
    info.bidAutoplay = false; // 默认设置内层跑马灯(包含标段信息的)不切换
    newData.push(JSON.parse(JSON.stringify(info)));
  }
  return newData;
}
export default carouselInitData;

对应的生成数据之后,就可以进行切换了:

首先 ,将项目和标段的自动切换设置为false,即:projectAuto: false ,由 carouselInitData 方法重构的数据也将所有项目的标段的自动切换设置为false了。

然后,进行切换的初始触发,在 mounted 钩子函数里面做一个判断:查看第一个项目的标段数量,如果标段数量大于1,从标段开始切换。若是标段数量小于1,判断项目的个数,项目个数大于1,切项目;项目个数小于1,不动。

其次 ,标段走马灯切换方法编写,如果项目有标段,且进行了标段的切换,如果切换到最后一张走马灯,且当前项目数量大于1,则停止当前项目标段的切换,切换到下一个项目。

最后 ,项目走马灯切换方法编写,项目切换之后,触发 projectPlayChange 方法,此时,优先停止项目的切换,同时将上一个项目的标段走马灯手动切换到第一页。然后判断当前项目下标段走马灯的数量,若是大于1,切标段;反之切项目。

这样就构成了一个循环,也实现了最终的切换效果。

原理其实就是:动态修改两个嵌套走马灯的 autoplay 属性。

### 回答1: ElementUI Carousel走马灯)是一种常用的轮播组件,可以在网页中展示多张图片或内容,支持自动播放、手动切换、循环播放等功能。它是基于Vue.js框架开发的,使用简单方便,可以快速实现网页轮播效果。 ### 回答2: elementui是一种基于Vue.js的组件库,提供了许多实用的组件,其中包括走马灯carousel走马灯是一种常见的网页交互组件,可以展示多张图片或者内容,通过自动播放或者手动切换的方式,让用户能够方便地浏览多张图片或者内容。 elementui的走马灯carousel组件功能非常强大,可以满足不同场景下的需求。首先,可以通过设置autoplay属性来实现自动轮播功能,可以控制轮播的时间间隔和是否开启循环播放。其次,可以通过设置indicator-position属性来控制指示器的位置,可以将指示器放在左边、右边、上方、下方或者不显示。此外,elementui的走马灯还支持手动切换功能,可以通过设置arrow属性来控制左右箭头是否显示。 针对不同的需求,elementui的走马灯还提供了多种展示效果。比如,默认展示效果为普通模式,可以通过设置type属性为card来使图片和文字居中展示,而且还可以设置card-style属性来自定义卡片的样式。同时,elementui的走马灯还支持分页显示,可以通过设置pager属性来显示分页器。 最后,elementui的走马灯还提供了许多其他的属性和事件,可以通过这些属性和事件来实现更复杂的交互。总的来说,elementui的走马灯carousel组件是一款非常实用的组件,可以简单快速地实现网页中的轮播展示功能。 ### 回答3: ElementUI是一种基于Vue.js的开源UI框架,提供了多种组件,使web应用程序的开发变得更加轻松快捷。其中,carousel 走马灯ElementUI中的一个组件,用于实现轮播图的效果。 使用ElementUI的carousel组件,只需在Vue.js项目中引入ElementUI并使用它的carousel组件即可。在使用carousel组件时,需要先在html模板中定义一个元素(div),用于包含轮播图的内容。然后,在Vue.js的script标签中设置轮播图的选项(options),包括轮播图的图片以及切换间隔等。 一个ElementUI carousel的例子如下: ``` <template> <div id="carousel-example"> <el-carousel :interval="3000"> <el-carousel-item v-for="(item, index) in items" :key="index"> <img :src="item.src" class="carousel-image"> </el-carousel-item> </el-carousel> </div> </template> <script> export default { data() { return { items: [ { src: "https://picsum.photos/800/300?image=0" }, { src: "https://picsum.photos/800/300?image=1" }, { src: "https://picsum.photos/800/300?image=2" }, { src: "https://picsum.photos/800/300?image=3" }, ], }; }, }; </script> <style> .carousel-image { width: 100%; } </style> ``` 在这个例子中,我们先给轮播图的容器定义了一个id为“carousel-example”的div标签。然后,在Vue.js的script标签中,我们使用了carousel组件,并设置了切换间隔为3000毫秒。 carousel内部使用了el-carousel-items子组件,我们使用v-for循环绑定了轮播图的图片地址。图片的宽度被设置为100%。当过渡效果执行时,ElementUI会自动加上渐变动画以及衔接效果。 可以看到,使用ElementUI的carousel组件非常方便,只需要几行代码就可以实现轮播图的效果。这使得开发人员可以将更多的时间和精力放在项目的其他方面,提高了开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值