更新记录

1.0.4(2026-09-14) 下载此版本

预览图

1.0.3(2026-09-14) 下载此版本

修改说明

1.0.2(2026-09-14) 下载此版本

修复 排序缺少图标问题 css 去除 scss

查看更多

平台兼容性

uni-app(5.22)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- 4.4 12
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - - -

其他

多语言 暗黑模式 宽屏模式
× ×

ia-table 表格组件使用说明

一个适用于 uni-app (Vue3) 高性能表格组件,支持固定列、排序、远程分页、虚拟滚动、多选勾选等能力。

功能特性

  • ✅ 本地静态数据 / 远程分页数据两种数据源
  • ✅ 表头点击排序(降序 → 升序 → 取消),支持多字段排序
  • ✅ 固定列(首列 / 前 N 列 sticky 吸住)
  • ✅ 横向 / 纵向滚动,表头与表体联动
  • ✅ 滚动到底自动加载下一页(远程模式)
  • ✅ 复选框多选 + 全选
  • ✅ 虚拟滚动(上万行数据只渲染可视区,性能优)
  • ✅ 单元格 / 表头 均可插槽自定义
  • ✅ 空状态占位、加载动画
  • ✅ 表头吸顶(配合页面滚动)

一、安装与引用

组件位于 src/uni_modules/ia-table/,是标准的 uni_modules 结构。

  • HBuilderX 项目:直接把 uni_modules/ia-table 文件夹拷入 src/uni_modules/ 即可。
  • CLI 项目:同目录结构;pages.jsoneasycom.autoscan 开启时会自动扫描 uni_modules/*/components/*/无需注册、无需 import
<!-- 直接使用(easycom 自动注册) -->
<ia-table :list="list" :columns="columns"></ia-table>

二、快速上手

2.1 最小示例(本地数据)

<template>
    <ia-table :list="list" :columns="columns" :height="300" border="bottom"></ia-table>
</template>

<script>
export default {
    data() {
        return {
            list: [
                { code: '000001', name: '平安银行', change: 1.22 },
                { code: '600519', name: '贵州茅台', change: 3.15 },
            ],
            columns: [
                { label: '代码', field: 'code', width: 160, fixed: true },
                { label: '名称', field: 'name', width: 200, sort: true },
                { label: '涨跌幅', field: 'change', width: 180, sort: true },
            ]
        }
    }
}
</script>

2.2 远程分页(list 传函数)

list 传入一个返回 Promise 的请求函数,组件内部用 Paginate 分页器封装:

  • 首次进入、排序、滚到底部时自动请求。
  • 请求参数默认带 iDisplayStart(偏移)、iDisplayLength(每页 15)、sSorts(排序串)。
<template>
    <ia-table id="remote" :list="fetchList" :columns="columns" :height="400" scroll
        :params="{ userId: 1 }" :loading-show="true"></ia-table>
</template>

<script>
export default {
    data() {
        return { columns: [{ label: '名称', field: 'name', width: 200, sort: true }] }
    },
    methods: {
        // 返回 Promise,遵守 DataTables 协议
        fetchList(params) {
            return new Promise((resolve) => {
                setTimeout(() => {
                    const start = params.iDisplayStart || 0
                    const length = params.iDisplayLength || 15
                    resolve({
                        aaData: Array.from({ length }).map((_, i) => ({ name: '项目' + (start + i + 1) })),
                        iTotalDisplayRecords: 200
                    })
                }, 500)
            })
        }
    }
}
</script>

params 会被合并进请求参数(除分页参数外),排序时还会自动带上 sSorts: "field,asc|desc"。 组件实例还暴露了 query(reload)reload()checkboxAll() 方法,可通过 ref 调用。


三、Props 属性

属性 类型 默认值 说明
list Array \| Function \| String \| Promise [] 数据源。数组=本地数据;函数=远程分页请求
id String \| Number 0 唯一标识。开启 virtual 必须传(不同实例不可重复)
columns Array [] 列配置,见 四、列配置
height String \| Number undefined 表格高度(px)。固定高可让表格内部滚动 / 虚拟滚动生效
itemHeight String \| Number 100 单行高(rpx),虚拟滚动据此计算可视行数;'auto' 表示自适应
headerHeight String \| Number 100 表头高(rpx),参与整体高度计算
scroll Boolean \| 'x' \| 'y' undefined true 双向滚动 / 'x' 仅横向 / 'y' 仅纵向
border Boolean \| String \| Array undefined true 全边框;"top" / "bottom"["top","bottom"]"none" 无边框
lineColor String 主题色 边框颜色
lineSize String \| Number 2 边框粗细(rpx)
sortLocal Boolean undefined 开启后点击表头走本地排序(数字/中文均可)
sortMulti Boolean true 是否多字段排序;false 时点击其他列会清空原排序
checkbox Boolean undefined 显示多选复选框列
curselected Boolean true 点击行是否有高亮效果
virtual Boolean false 开启虚拟滚动(大数据量)
virtualPrefix Number 5 可视区间向上缓冲行数
virtualSuffix Number 5 可视区间向下缓冲行数
params Object undefined 远程请求附加的固定参数
loadingShow Boolean false 显示组件内置加载动画
loading Boolean undefined 受控 loading(优先级高于内置状态)
defaultShow Boolean true 数据为空时渲染 #empty 插槽占位
defaultNot String 暂无记录 ⚠️ 已废弃,请使用 #empty 插槽
defaultIcon String "" ⚠️ 已废弃,请使用 #empty 插槽
uniPageScroll Boolean undefined 由页面滚动接管(配合 pageScroll() 实现表头吸顶)

四、columns 列配置

columns = [
    {
        label: '代码',      // 表头文案
        field: 'code',      // 字段名(同时是单元格插槽名)
        width: 160,         // 列宽 rpx(必填,总宽=各列宽之和,固定列偏移依赖它)
        sort: true,         // 点击表头可排序
        fixed: true,        // 固定列(sticky 吸左)
        align: 'center',    // left | center | right
        height: 80,         // 列高 rpx(默认取 itemHeight)
        style: { color: 'red' }, // 附加该列内联样式
    }
]

📌 fixed 固定列注意:偏移 = 该列左侧所有列宽之和,因此固定列前面的列务必设置 width,否则偏移计算错误。 📌 开启 role* 无——若列定义里没有任何 width,表格总宽为 100%(列均分)。


五、事件

事件 参数 说明
@rowClick row 单击某行(250ms 内再点一次不会重复触发,优先识别双击)
@rowDoubleClick row 双击某行
@sort { sort, sorts } 点击表头排序后触发(远程模式请在此重新请求)
@load - 滚动到底触发(远程模式已内置自动翻页,此事件可用于自定义追加逻辑)
@selectionChange list 勾选结果变化(返回选中的原行数据数组)
@selectionItemChange row 单击单行勾选时触发
@changeVirtual list 虚拟滚动可视区变化(外部可按需懒加载详情)
@change list 当前渲染数据变化(虚拟滚动时配合切片使用)

按 ref 调用实例方法:

this.$refs.table.query(true)      // 远程模式刷新(true=回到第一页)
this.$refs.table.reload()         // 清空并重载
this.$refs.table.checkboxAll()    // 全选/取消全选
this.$refs.table.setColumns()     // 从默认插槽的子组件收集列配置

六、插槽(Slots)

插槽名 作用域 说明
#<field> { value, row, index, field } 自定义单元格内容(列 field 即插槽名,推荐)
#header-<field> { label } 自定义某个表头单元格
#otherField { value, row, index, field } 兜底插槽:未单独定义 #<field> 的列统一走这里
#empty - 空数据占位内容(默认什么也不显示,需自行提供)
#login - 加载动画占位(loading-show 为 true 时显示)
<ia-table :list="list" :columns="columns">
    <!-- 按列名自定义单元格 -->
    <template #name="{ value }">
        <text class="red">{{ value }}</text>
    </template>
    <!-- 兜底插槽:批量自定义其它列 -->
    <template #otherField="{ value, row, field, index }">
        <text>{{ value || '-' }}</text>
    </template>
    <!-- 空状态 -->
    <template #empty>
        <view class="empty">暂无数据</view>
    </template>
</ia-table>

七、高级用法

7.1 表头吸顶(页面滚动模式)

表格不设内部高度,随页面一起滚,表头滚到顶部后吸住:

<template>
    <ia-table ref="table" :list="list" :columns="columns" :uni-page-scroll="true"></ia-table>
</template>
<script>
export default {
    onPageScroll(e) {
        this.$refs.table.pageScroll(e)   // 转发滚事件给表格,超过表格顶部时吸顶
    }
}
</script>

7.2 虚拟滚动(万行数据)

<ia-table id="demo-v" :list="bigList" :columns="columns" :height="400"
    scroll :virtual="true" :item-height="80" :virtual-prefix="5" :virtual-suffix="5">
</ia-table>
  • 必须传唯一 id,必须设 height(或 scroll 容器有固定高度),行高需等距。
  • 开启虚拟滚动后,@changeVirtual / @change 可拿到当前真实渲染的数据切片,便于按需懒加载详情。
  • ⚠️ iOS + 固定列 组合会自动退化为占位式渲染(仍保留全部节点,性能略降),这是 bug 场景兼容

7.3 复选框多选

<ia-table :list="list" :columns="columns" checkbox
    @selectionChange="list => selected = list">
</ia-table>

八、远程分页协议说明

组件内置的 Paginate 分页器约定(兼容 DataTables 风格),通过构造函数 resKey 可自定义 key:

默认 说明
请求参数 iDisplayStart 页码 × 每页条数 起始偏移
请求参数 iDisplayLength 15 每页条数
请求参数 sSorts field,asc 排序串
响应列表字段 aaData 兼容 res.data / res.data.data
响应总数字段 iTotalDisplayRecords 兼容 res.total
// 响应三种格式均可:
// ① { aaData: [...], iTotalDisplayRecords: 100 }
// ② { data: [...], total: 100 }
// ③ { data: { data: [...], total: 100 } }

九、常见问题 / 备注

  1. list 是本地数组为何点击排序没反应? 需要 sortLocaltrue(本地排序),否则只触发 @sort 事件(给远程场景预留)。

  2. 固定列偏移不对? 固定列左侧的所有列都必须配置 width,偏移量按 width 累加计算。

  3. 表头高度与视觉不符? 样式底层表头固定 50px。若通过 headerHeight 改了值,需要同步改 ia-table.vue.i-table__header { height },否则吸顶/滚动区间计算会偏移。

  4. 空状态为什么什么都不显示? 新版本去掉了内置 ia-empty,空状态通过 #empty 插槽自定义(旧属性 defaultNot/defaultIcon 已废弃,不再生效)。

  5. 组件已经修复的坑:

    • this.datathis.list(init / sortClick / scrolltolower 中误用旧属性名,导致远程模式不生效的隐患)
    • Paginate 构造参数默认解构语法兼容编译器
    • util.js 补上 default 导出(组件内部 import _ from './util'
  6. 虚拟滚动 + 固定列 在 iOS 上的表现: iOS 上该组合会降级为占位渲染,行数很多时开销仍较大;如追求极致性能建议「虚拟滚动」与「固定列」二选一。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议