<template> 
 | 
    <view class="u-swiper-indicator"> 
 | 
        <view 
 | 
            class="u-swiper-indicator__wrapper" 
 | 
            v-if="indicatorMode === 'line'" 
 | 
            :class="[`u-swiper-indicator__wrapper--${indicatorMode}`]" 
 | 
            :style="{ 
 | 
                width: $u.addUnit(lineWidth * length), 
 | 
                backgroundColor: indicatorInactiveColor 
 | 
            }" 
 | 
        > 
 | 
            <view 
 | 
                class="u-swiper-indicator__wrapper--line__bar" 
 | 
                :style="[lineStyle]" 
 | 
            ></view> 
 | 
        </view> 
 | 
        <view 
 | 
            class="u-swiper-indicator__wrapper" 
 | 
            v-if="indicatorMode === 'dot'" 
 | 
        > 
 | 
            <view 
 | 
                class="u-swiper-indicator__wrapper__dot" 
 | 
                v-for="(item, index) in length" 
 | 
                :key="index" 
 | 
                :class="[index === current && 'u-swiper-indicator__wrapper__dot--active']" 
 | 
                :style="[dotStyle(index)]" 
 | 
            > 
 | 
  
 | 
            </view> 
 | 
        </view> 
 | 
    </view> 
 | 
</template> 
 | 
  
 | 
<script> 
 | 
    import props from './props.js'; 
 | 
    /** 
 | 
     * SwiperIndicator 轮播图指示器 
 | 
     * @description 该组件一般用于导航轮播,广告展示等场景,可开箱即用, 
 | 
     * @tutorial https://www.uviewui.com/components/swiper.html 
 | 
     * @property {String | Number}    length                    轮播的长度(默认 0 ) 
 | 
     * @property {String | Number}    current                    当前处于活动状态的轮播的索引(默认 0 ) 
 | 
     * @property {String}            indicatorActiveColor    指示器非激活颜色 
 | 
     * @property {String}            indicatorInactiveColor    指示器的激活颜色 
 | 
     * @property {String}            indicatorMode            指示器模式(默认 'line' ) 
 | 
     * @example    <u-swiper :list="list4" indicator keyName="url" :autoplay="false"></u-swiper> 
 | 
     */ 
 | 
    export default { 
 | 
        name: 'u-swiper-indicator', 
 | 
        mixins: [uni.$u.mpMixin, uni.$u.mixin, props], 
 | 
        data() { 
 | 
            return { 
 | 
                lineWidth: 22 
 | 
            } 
 | 
        }, 
 | 
        computed: { 
 | 
            // 指示器为线型的样式 
 | 
            lineStyle() { 
 | 
                let style = {} 
 | 
                style.width = uni.$u.addUnit(this.lineWidth) 
 | 
                style.transform = `translateX(${ uni.$u.addUnit(this.current * this.lineWidth) })` 
 | 
                style.backgroundColor = this.indicatorActiveColor 
 | 
                return style 
 | 
            }, 
 | 
            // 指示器为点型的样式 
 | 
            dotStyle() { 
 | 
                return index => { 
 | 
                    let style = {} 
 | 
                    style.backgroundColor = index === this.current ? this.indicatorActiveColor : this.indicatorInactiveColor 
 | 
                    return style 
 | 
                } 
 | 
            } 
 | 
        }, 
 | 
    } 
 | 
</script> 
 | 
  
 | 
<style lang="scss" scoped> 
 | 
    @import "../../libs/css/components.scss"; 
 | 
  
 | 
    .u-swiper-indicator { 
 | 
  
 | 
        &__wrapper { 
 | 
            @include flex; 
 | 
  
 | 
            &--line { 
 | 
                border-radius: 100px; 
 | 
                height: 4px; 
 | 
  
 | 
                &__bar { 
 | 
                    width: 22px; 
 | 
                    height: 4px; 
 | 
                    border-radius: 100px; 
 | 
                    background-color: #FFFFFF; 
 | 
                    transition: transform 0.3s; 
 | 
                } 
 | 
            } 
 | 
  
 | 
            &__dot { 
 | 
                width: 5px; 
 | 
                height: 5px; 
 | 
                border-radius: 100px; 
 | 
                margin: 0 4px; 
 | 
  
 | 
                &--active { 
 | 
                    width: 12px; 
 | 
                } 
 | 
            } 
 | 
  
 | 
        } 
 | 
    } 
 | 
</style> 
 |