<template> 
 | 
    <view 
 | 
        class="u-notice" 
 | 
        @tap="clickHandler" 
 | 
    > 
 | 
        <slot name="icon"> 
 | 
            <view 
 | 
                class="u-notice__left-icon" 
 | 
                v-if="icon" 
 | 
            > 
 | 
                <u-icon 
 | 
                    :name="icon" 
 | 
                    :color="color" 
 | 
                    size="19" 
 | 
                ></u-icon> 
 | 
            </view> 
 | 
        </slot> 
 | 
        <swiper 
 | 
            :disable-touch="disableTouch" 
 | 
            :vertical="step ? false : true" 
 | 
            circular 
 | 
            :interval="duration" 
 | 
            :autoplay="true" 
 | 
            class="u-notice__swiper" 
 | 
            @change="noticeChange" 
 | 
        > 
 | 
            <swiper-item 
 | 
                v-for="(item, index) in text" 
 | 
                :key="index" 
 | 
                class="u-notice__swiper__item" 
 | 
            > 
 | 
                <text 
 | 
                    class="u-notice__swiper__item__text u-line-1" 
 | 
                    :style="[textStyle]" 
 | 
                >{{ item }}</text> 
 | 
            </swiper-item> 
 | 
        </swiper> 
 | 
        <view 
 | 
            class="u-notice__right-icon" 
 | 
            v-if="['link', 'closable'].includes(mode)" 
 | 
        > 
 | 
            <u-icon 
 | 
                v-if="mode === 'link'" 
 | 
                name="arrow-right" 
 | 
                :size="17" 
 | 
                :color="color" 
 | 
            ></u-icon> 
 | 
            <u-icon 
 | 
                v-if="mode === 'closable'" 
 | 
                name="close" 
 | 
                :size="16" 
 | 
                :color="color" 
 | 
                @click="close" 
 | 
            ></u-icon> 
 | 
        </view> 
 | 
    </view> 
 | 
</template> 
 | 
  
 | 
<script> 
 | 
    import props from './props.js'; 
 | 
    /** 
 | 
     * ColumnNotice 滚动通知中的垂直滚动 内部组件 
 | 
     * @description 该组件用于滚动通告场景,是其中的垂直滚动方式 
 | 
     * @tutorial https://www.uviewui.com/components/noticeBar.html 
 | 
     * @property {Array}            text             显示的内容,字符串 
 | 
     * @property {String}            icon             是否显示左侧的音量图标 ( 默认 'volume' ) 
 | 
     * @property {String}            mode             通告模式,link-显示右箭头,closable-显示右侧关闭图标 
 | 
     * @property {String}            color             文字颜色,各图标也会使用文字颜色 ( 默认 '#f9ae3d' ) 
 | 
     * @property {String}            bgColor         背景颜色 ( 默认 '#fdf6ec' ) 
 | 
     * @property {String | Number}    fontSize        字体大小,单位px  ( 默认 14 ) 
 | 
     * @property {String | Number}    speed            水平滚动时的滚动速度,即每秒滚动多少px(rpx),这有利于控制文字无论多少时,都能有一个恒定的速度 ( 默认 80 ) 
 | 
     * @property {Boolean}            step            direction = row时,是否使用步进形式滚动 ( 默认 false ) 
 | 
     * @property {String | Number}    duration        滚动一个周期的时间长,单位ms ( 默认 1500 ) 
 | 
     * @property {Boolean}            disableTouch    是否禁止用手滑动切换   目前HX2.6.11,只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序 ( 默认 true ) 
 | 
     * @example  
 | 
     */ 
 | 
    export default { 
 | 
        mixins: [uni.$u.mpMixin, uni.$u.mixin,props], 
 | 
        watch: { 
 | 
            text: { 
 | 
                immediate: true, 
 | 
                handler(newValue, oldValue) { 
 | 
                    if(!uni.$u.test.array(newValue)) { 
 | 
                        uni.$u.error('noticebar组件direction为column时,要求text参数为数组形式') 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        }, 
 | 
        computed: { 
 | 
            // 文字内容的样式 
 | 
            textStyle() { 
 | 
                let style = {} 
 | 
                style.color = this.color 
 | 
                style.fontSize = uni.$u.addUnit(this.fontSize) 
 | 
                return style 
 | 
            }, 
 | 
            // 垂直或者水平滚动 
 | 
            vertical() { 
 | 
                if (this.mode == 'horizontal') return false 
 | 
                else return true 
 | 
            }, 
 | 
        }, 
 | 
        data() { 
 | 
            return { 
 | 
                index:0 
 | 
            } 
 | 
        }, 
 | 
        methods: { 
 | 
            noticeChange(e){ 
 | 
                this.index = e.detail.current 
 | 
            }, 
 | 
            // 点击通告栏 
 | 
            clickHandler() { 
 | 
                this.$emit('click', this.index) 
 | 
            }, 
 | 
            // 点击关闭按钮 
 | 
            close() { 
 | 
                this.$emit('close') 
 | 
            } 
 | 
        } 
 | 
    }; 
 | 
</script> 
 | 
  
 | 
<style lang="scss" scoped> 
 | 
    @import "../../libs/css/components.scss"; 
 | 
  
 | 
    .u-notice { 
 | 
        @include flex; 
 | 
        align-items: center; 
 | 
        justify-content: space-between; 
 | 
  
 | 
        &__left-icon { 
 | 
            align-items: center; 
 | 
            margin-right: 5px; 
 | 
        } 
 | 
  
 | 
        &__right-icon { 
 | 
            margin-left: 5px; 
 | 
            align-items: center; 
 | 
        } 
 | 
  
 | 
        &__swiper { 
 | 
            height: 16px; 
 | 
            @include flex; 
 | 
            align-items: center; 
 | 
            flex: 1; 
 | 
  
 | 
            &__item { 
 | 
                @include flex; 
 | 
                align-items: center; 
 | 
                overflow: hidden; 
 | 
  
 | 
                &__text { 
 | 
                    font-size: 14px; 
 | 
                    color: $u-warning; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
</style> 
 |