uniapp开发手机APP、H5网页、微信小程序、长列表插件

ml-list

插件地址https://ext.dcloud.net.cn/plugin?id=18928

ml-list介绍

1、ml-list 列表组件,包含基本列表样式、可扩展插槽机制、长列表性能优化、多端兼容

2、ml-list 低代码列表,帮助使用者快速构建列表,简单配置,快速上手。

3、支持自定义懒加载,优化长列表渲染性能,提升视图渲染效率.

安装方式

本组件符合easycom规范,HBuilderX 2.5.5起,只需将本组件导入项目,在页面template中即可直接使用,无需在页面中import和注册components

代码演示

以下代码均可复制粘贴直接运行

不使用插槽,showListIndex:可自定的高扩展的 懒加载机制,优化长列表提升渲染效率,提高用户体验。

html 复制代码
<template>
  <button :type="column==1?'primary':''" @click="change(1)">单列</button>
  <button :type="column==2?'primary':''" @click="change(2)">双列</button>
  <button :type="showCount>0?'primary':''" @click="changeCount(10)">使用showListIndex</button>
  <button :type="showCount<=0?'primary':''" @click="changeCount(0)">不使用showListIndex</button>

  <ml-list
    v-if="list&&list.length>0"
    :column="column"
    :list="list" 
    ref="mlListRef"
    :noMore="noMore" 
    :showListIndex="showCount"
    @rowClick="rowClick"
  >
    <!--  还可以增加其他内容,这里的内容可有可无-->
    <template v-slot="{item, index}">
      <text style="color: #ff8f0e;">{{index + 1}}不改变组件的上,继续增加内容</text>
    </template>
  </ml-list>
</template>
<script setup>
  import { ref } from 'vue';
  import { onLoad, onReachBottom, onPullDownRefresh } from '@dcloudio/uni-app';
  
  const column = ref(1);
  const showCount = ref(10);
  
  const list = ref([]); // 列表数据
  const noMore = ref(false); // 是否没有更多数据了
  const mlListRef = ref(null); // mlList 组件实例,mlListRef.value.refreshList();刷新视图列表
  
  let counter = 1;
  
  const change = (num) => {
    list.value = [];
    counter = 1;
    loadMore();
    column.value = num;
    uni.showToast({ title: num+"", icon:"none", mask:false });
  };
  
  const changeCount = (num) => {
    list.value = [];
    counter = 1;
    loadMore();
    showCount.value = num;
    uni.showToast({ title: num+"", icon:"none", mask:false });
  };

  /**
   * 加载更多
   */
  const loadMore = () => {
    uni.showLoading({ title: "加载中。。。" });
    setTimeout(() => {
      uni.hideLoading();
      getList().forEach((item) => {
        item.title = `[${list.value.length + 1}]${item.title}`;
        list.value.push(item);
      });
    }, 500);
  };

  /**
   * 点击了列表
   * @param row 当前行数据
   * @param index 当前行的索引
   */
  const rowClick = (row, index) => {
    console.log(index, row);
    uni.showToast({ title:row.title, icon:"none", mask:false });
  };
  
  /**
   * 下拉刷新,需要在page.json中开启下拉刷新功能
   */
  onPullDownRefresh(() => {
    list.value = []; 
    // 重新请求后台,刷新当前页面数据
    uni.showLoading({ title: "加载中。。。" });
    // 模拟请求后台,获取数据
    setTimeout(() => {
      uni.hideLoading();
      // 加载到数据后,停止刷新
      uni.stopPullDownRefresh();
      getList().forEach((item) => {
        item.title = `[${list.value.length + 1}]${item.title}`;
        list.value.push(item);
      });
    }, 500);
  });
  
  /**
   * 滑动到底,加载更多数据
   */
  onReachBottom(() => {
    // 更新列表数据
    mlListRef.value.refreshList();
    if (counter >= 3) {
      noMore.value = true;
      return;
    }
    counter ++;
    loadMore();
  });

  /**
   * 页面加载,请求后台 获取数据
   */
  onLoad(() => {
    // 模拟请求后台,拿到数据
    uni.showLoading({ title: "加载中。。。" });
    setTimeout(() => {
      uni.hideLoading();
      getList().forEach((item) => {
        item.title = `[${list.value.length + 1}]${item.title}`;
        list.value.push(item);
      });
    }, 500);
  });
  
  /**
   * 模拟 后台返回的数据列表
   */
  const getList = () => {
    let tempList = [];
    for (var i = 0; i < 15; i++) {
      tempList.push({
        title: "List 列表组件,包含基本列表样式、可扩展插槽机制、长列表性能优化、多端兼容。",
        url: "https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/shuijiao.jpg",
      });
    };
    return tempList;  
  };
</script>

注意:如果使用了showListIndex,则触发onReachBottom触底事件时,一定要调用refreshList()方法来刷新视图,mlListRef.value.refreshList();

使用自定义插槽,开始自定义插槽:itemSlot="true"showListIndex:可自定的高扩展的 懒加载机制,优化长列表提升渲染效率,提高用户体验。

html 复制代码
<template>
  <button :type="column==1?'primary':''" @click="change(1)">插槽单列</button>
  <button :type="column==2?'primary':''" @click="change(2)">插槽双列</button>
  <button :type="showCount>0?'primary':''" @click="changeCount(10)">使用showListIndex</button>
  <button :type="showCount<=0?'primary':''" @click="changeCount(0)">不使用showListIndex</button>

  <ml-list
    v-if="list&&list.length>0"
    :column="column"
    :list="list" 
    ref="mlListRef"
    :itemSlot="true"
    :noMore="noMore" 
    :showListIndex="showCount"
    @rowClick="rowClick"
  >
    <!-- :itemSlot="true" 使用插槽,开启自定义配置 -->
    <template v-slot:item="{item, index}">
      <image :src="item.url" style="width:99%;height:100px;"></image>
      <text style="color: #ff8f0e;">自定义插槽</text>
      <text> {{item.title}} </text>
    </template>
  </ml-list>
</template>
<script setup>
  import { ref } from 'vue';
  import { onLoad, onReachBottom, onPullDownRefresh } from '@dcloudio/uni-app';
  
  const column = ref(1);
  const showCount = ref(10);
  
  const list = ref([]); // 列表数据
  const noMore = ref(false); // 是否没有更多数据了
  const mlListRef = ref(null); // mlList 组件实例,mlListRef.value.refreshList();刷新视图列表
  
  let counter = 1;
  
  const change = (num) => {
    list.value = [];
    counter = 1;
    loadMore();
    column.value = num;
    uni.showToast({ title: num+"", icon:"none", mask:false });
  };
  
  const changeCount = (num) => {
    list.value = [];
    counter = 1;
    loadMore();
    showCount.value = num;
    uni.showToast({ title: num+"", icon:"none", mask:false });
  };

  /**
   * 加载更多
   */
  const loadMore = () => {
    uni.showLoading({ title: "加载中。。。" });
    setTimeout(() => {
      uni.hideLoading();
      getList().forEach((item) => {
        item.title = `[${list.value.length + 1}]${item.title}`;
        list.value.push(item);
      });
    }, 500);
  };

  /**
   * 点击了列表
   * @param row 当前行数据
   * @param index 当前行的索引
   */
  const rowClick = (row, index) => {
    console.log(index, row);
    uni.showToast({ title:row.title, icon:"none", mask:false });
  };
  
  /**
   * 下拉刷新,需要在page.json中开启下拉刷新功能
   */
  onPullDownRefresh(() => {
    list.value = []; 
    // 重新请求后台,刷新当前页面数据
    uni.showLoading({ title: "加载中。。。" });
    // 模拟请求后台,获取数据
    setTimeout(() => {
      uni.hideLoading();
      // 加载到数据后,停止刷新
      uni.stopPullDownRefresh();
      getList().forEach((item) => {
        item.title = `[${list.value.length + 1}]${item.title}`;
        list.value.push(item);
      });
    }, 500);
  });
  
  /**
   * 滑动到底,加载更多数据
   */
  onReachBottom(() => {
    // 更新列表数据
    mlListRef.value.refreshList();
    if (counter >= 3) {
      noMore.value = true;
      return;
    }
    counter ++;
    loadMore();
  });

  /**
   * 页面加载,请求后台 获取数据
   */
  onLoad(() => {
    // 模拟请求后台,拿到数据
    uni.showLoading({ title: "加载中。。。" });
    setTimeout(() => {
      uni.hideLoading();
      getList().forEach((item) => {
        item.title = `[${list.value.length + 1}]${item.title}`;
        list.value.push(item);
      });
    }, 500);
  });
  
  /**
   * 模拟 后台返回的数据列表
   */
  const getList = () => {
    let tempList = [];
    for (var i = 0; i < 15; i++) {
      tempList.push({
        title: "List 列表组件,包含基本列表样式、可扩展插槽机制、长列表性能优化、多端兼容。",
        url: "https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/shuijiao.jpg",
      });
    };
    return tempList;  
  };
</script>

注意:如果使用了showListIndex,则触发onReachBottom触底事件时,一定要调用refreshList()方法来刷新视图,mlListRef.value.refreshList();

props

属性名 类型 默认值 可选值 说明 是否必填
column Number 2 1 列表显示列表数,1-单列表,2-双列表
imageWidth String - - 列表中图片展示的宽度
showMore Boolean true false 是否显示 loadMore 加载更多组件
maxLines Number 2 | 4 - 文本展示行数,超出指定行数则显示...
noMore Boolean false true 是否没有更多数据,默认false,当为 true时,不再触发 loadMore 去加载数据
itemSlot Boolean false true 是否使用自定义插槽,默认false,当为true时,默认组件将不在展示
stytle Object {} - 自定义样式,需要使用 Object 的形式
list Array [] - 数据列表
showListIndex Number 0 - 懒加载机制,可视界面下渲染的列表数量,用于优化 大量数据下的列表渲染,提高性能,注意,使用showListIndex时一定要调用refreshList()方法刷新整个视图,否则后面的数据将不会展示

list[option]【组件配置项】

属性名 类型 默认值 可选值 说明 是否必填
title String - - 名称
url String - - 图片
... Any - - 其他自定义参数,点击后尽数返回 -

事件 Events

事件名 返回参数 说明
@rowClick (row, index) 当点击了列表时,触发该rowClick事件,并返回当前点击的数据和索引
@loadMore - -(过时,后续将剔除)推荐使用onReachBottom来自定义触底加载更多
@refresh - -(过时,后续将剔除)推荐使用onPullDownRefresh来自定义刷新事件

组件方法 methods

方法名 参数 说明
stopRefresh - -(过时,后续将剔除)
。。。。。。 - -
相关推荐
长风清留扬26 分钟前
小程序毕业设计-音乐播放器+源码(可播放)下载即用
javascript·小程序·毕业设计·课程设计·毕设·音乐播放器
漫天转悠43 分钟前
VScode中配置ESlint+Prettier详细步骤(图文详情)
vscode·vue
郭wes代码12 小时前
Cmd命令大全(万字详细版)
python·算法·小程序
落魄实习生13 小时前
AI应用-本地模型实现AI生成PPT(简易版)
python·ai·vue·ppt
web1508509664115 小时前
在uniapp Vue3版本中如何解决webH5网页浏览器跨域的问题
前端·uni-app
bpmf_fff15 小时前
二九(vue2-05)、父子通信v-model、sync、ref、¥nextTick、自定义指令、具名插槽、作用域插槽、综合案例 - 商品列表
vue
java_heartLake21 小时前
Vue3之状态管理Vuex
vue·vuex·前端状态管理
小马超会养兔子1 天前
如何写一个数字老虎机滚轮
开发语言·前端·javascript·vue
计算机徐师兄1 天前
基于TP5框架的家具购物小程序的设计与实现【附源码、文档】
小程序·php·家具购物小程序·家具购物微信小程序·家具购物
曲辒净1 天前
微信小程序实现二维码海报保存分享功能
微信小程序·小程序