Skip to content

ScrollList 横向滚动列表组件

该组件一般用于同时展示多个商品、分类的场景,也可以完成左右滑动的列表。

温馨提示

本项目参考了 uView-Plus 开源项目的组件开发方式,基于 Vue 3 和 TypeScript 实现了自定义组件。目前该组件仍处于测试阶段。
感谢 uView-Plus 开源项目及其团队成员的贡献,他们的组件开发思路为本项目提供了宝贵地参考。如果需要了解更多组件开发细节,可以参考uView-Plus的 scrollList组件 的代码实现。

平台差异说明

APP(vue)H5微信小程序

基本使用示例

html
<!-- 全局使用 -->
<hy-scroll-list>
    <view v-for="(item, index) in list" :key="index">
        <image :src="item"></image>
    </view>
</hy-scroll-list>
<!-- 单个组件引入 -->
<HyScrollList>
    <view v-for="(item, index) in list" :key="index">
        <image :src="item"></image>
    </view>
</HyScrollList>
ts
import { HyScrollList } from "hy-app";

const list = ref<any[]>([
    "https://img0.baidu.com/it/u=1913990970,584854398&fm=253&id=1",
    "http://mms2.baidu.com/it/u=204741874,3444396868&fm=253&id=2",
    "https://img2.baidu.com/it/u=3042825715,659259329&fm=253&id=3",
    "https://img2.baidu.com/it/u=109690972,2214958998&fm=253&id=4",
    "http://mms0.baidu.com/it/u=2161107790,808970254&fm=253&id=5",
    "https://img2.baidu.com/it/u=4211554685,400408647&fm=253&id=6",
    "https://img2.baidu.com/it/u=2237681987,1998118702&fm=253&id=7",
    "https://img1.baidu.com/it/u=2494879897,1602792615&fm=253&id=8"
]);

业务实现代码

html
    <up-scroll-list @right="right" @left="left">
        <view class="scroll-list" style="flex-direction: row;">
            <view
                    class="scroll-list__goods-item"
                    v-for="(item, index) in list"
                    :key="index"
                    :class="[(index === 9) && 'scroll-list__goods-item--no-margin-right']"
            >
                <image class="scroll-list__goods-item__image" :src="item.thumb"></image>
                <text class="scroll-list__goods-item__text">¥{{ item.price }}</text>
            </view>
            <view class="scroll-list__show-more">
                <text class="scroll-list__show-more__text">查看更多</text>
                <up-icon name="arrow-leftward" color="#f56c6c" size="12"></up-icon>
            </view>
        </view>
    </up-scroll-list>
ts
import { ref } from 'vue';

const goodsArr = [
    {
        price: "230.5",
        thumbnail:
            "https://img11.360buyimg.com/n1/s450x450_jfs/t1/281169/10/14028/31748/67ecf51dF384c5bd6/1ec0c214ea7a914e.png",
    },
    {
        price: "74.1",
        thumbnail:
            "https://img11.360buyimg.com/n1/s450x450_jfs/t1/281169/10/14028/31748/67ecf51dF384c5bd6/1ec0c214ea7a914e.png",
    },
    {
        price: "8457",
        thumbnail:
            "https://img11.360buyimg.com/n1/s450x450_jfs/t1/281169/10/14028/31748/67ecf51dF384c5bd6/1ec0c214ea7a914e.png",
    },
    {
        price: "1442",
        thumbnail:
            "https://img11.360buyimg.com/n1/s450x450_jfs/t1/281169/10/14028/31748/67ecf51dF384c5bd6/1ec0c214ea7a914e.png",
    },
    {
        price: "541",
        thumbnail:
            "https://img11.360buyimg.com/n1/s450x450_jfs/t1/281169/10/14028/31748/67ecf51dF384c5bd6/1ec0c214ea7a914e.png",
    },
    {
        price: "234",
        thumbnail:
            "https://img11.360buyimg.com/n1/s450x450_jfs/t1/281169/10/14028/31748/67ecf51dF384c5bd6/1ec0c214ea7a914e.png",
    },
    {
        price: "562",
        thumbnail:
            "https://img11.360buyimg.com/n1/s450x450_jfs/t1/281169/10/14028/31748/67ecf51dF384c5bd6/1ec0c214ea7a914e.png",
    },
    {
        price: "251.5",
        thumbnail:
            "https://img11.360buyimg.com/n1/s450x450_jfs/t1/281169/10/14028/31748/67ecf51dF384c5bd6/1ec0c214ea7a914e.png",
    },
];

// 方法  
const left = () => {
    console.log('left');
}

const right = () => {
    console.log('right');
}

const showMore = () => {
    uni.showToast({ title: "查看更多" });
};
scss
    .scroll-list {
        display: flex;
        flex-direction: column;

        &__goods-item {
            margin-right: 20px;

            &__image {
                width: 60px;
                height: 60px;
                border-radius: 4px;
            }

            &__text {
                color: #f56c6c;
                text-align: center;
                font-size: 12px;
                margin-top: 5px;
            }
        }

        &__show-more {
            background-color: #fff0f0;
            border-radius: 3px;
            padding: 3px 6px;
            display: flex;
            flex-direction: column;
            align-items: center;

            &__text {
                font-size: 12px;
                width: 12px;
                color: #f56c6c;
                line-height: 16px;
            }
        }
    }

API

参数说明类型默认值
indicatorWidth指示器的整体宽度number50
indicatorBarWidth滑块的宽度number20
indicator是否显示面板指示器booleantrue
indicatorColor指示器非激活颜色string#f2f2f2
indicatorActiveColor指示器滑块颜色stringColorConfig.primary
indicatorStyle指示器样式,可通过bottom,left,right进行定位CSSProperties-

Events

事件名说明回调参数
left滑动到左边时触发-
right滑动到右边时触发-

Slots

插槽名说明接收值
default--
00:46