表格 xTable
在线预览
在线模拟尺寸:
介绍
格式与antd一样。可以单独设置样式和整体列设置样式。也可以单独设置列宽,项目列宽虽然 可以auto,但数据多的情况下不要用,还是定义具体的百分比或者数字比较快的渲染。 1.具体想控制某一单元格的完全定义,可通过具名指定单元格插槽及行插槽,用于复杂的布局(使用插槽时,不可排序) 在单元格数据中 添加 {merge:{'key字段':{colspan:合并的列数}}}可以让当前单格向右合并下列(被合并的列数据将被隐藏不显示)。 在单元格数据中 添加 {showCheck:boolean},可以单独控制隐藏某一行不参与行选中(前提需要在x-tabale设置属性 :showCheck="true" 开启表格行选中功能),行选中功能仅支持没有浮动置顶的数据表格。 不管是头还是单元格它的style格式是一样的 {style:{key字段:{bgStyle,textStyle,align:'对齐方式:flex-start,center,flex-end'}}} 具体的数据格式见demo页面
平台兼容
| Harmony | H5 | andriod | IOS | 小程序 | UTS | UNIAPP-X SDK | version |
|---|---|---|---|---|---|---|---|
| ☑ | ☑ | ☑️ | ☑️ | ☑️ | ☑️ | 4.76+ | 1.1.18 |
文件路径
ts
@/uni_modules/tmx-ui/components/x-table/x-table.uvue使用
ts
<x-table></x-table>Props 属性
| 名称 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| list | 源数据 | Array | ():UTSJSONObject[] => [] as UTSJSONObject[] |
| columns | 列标题及字段定义 | Array | ():xTableColumns[] => [] as xTableColumns[] |
| height | 容器的高,如果不设定,不会有上下滚动而直接从上往下布局。如果数据多建议设置。 | string | "auto" |
| width | 容器的宽,不可以填写auto。 | string | "100%" |
| maxHeight | 最大高度 | string | "300" |
| cellHeight | 单元格的高,不能%从1.1.18起允许为auto,或其它值,已经改为最小值,不再固定高,可以大段落自动断行了(早基sdk有bug实现不了目前经测试已无问题) | string | "44" |
| cellWidth | 单元格的宽,不填写自动均分它是允许任意值auto,%,固定值等但我经过我测试auto,会影响原生渲染的速率(不是我影响的是自动布局的速率) | string | "" |
| fontSize | 单元格的文字大小局部的设置会覆盖这里的 | string | "14" |
| fontColor | 单元格的文字颜色局部的设置会覆盖这里的 | string | "#333333" |
| headerBgColor | 头的背景 | string | "#eeeeee" |
| darkHeaderBgColor | 暗黑时,如果未设置取inputDarkColor | string | "" |
| headerFontColor | 头的文字颜色,暗黑时取白 | string | "#333333" |
| ripple | 是否间隔波纹 | boolean | true |
| rippleColor | 波纹颜色, | string | "#fafafa" |
| rippleDarkColor | 波纹的暗黑颜色,不填写用的是sheetDark | string | "" |
| rowCellColor | 默认的行背景色,通常你没有在数据中配置背景时,会读取这的颜色。 | string | "#ffffff" |
| rowCellDarkColor | 默认的行暗黑背景色,通常你没有在数据中配置背景时,会读取这的颜色。 | string | "transparent" |
| safeTextWrap | 是否给文字高防止断行。这是一个兼容性的试验参数,针对部分手机由于uni sdk原生安卓上对文本的测量可能存在精度 问题,导致文本意外的断行。如果为true可以防止这种情况发生可能会产生不能断行或者其它情况发生,请慎重使用。 | boolean | false |
| multiRowFloat | 是否启用多行固定功能数据源中如果某行要滚动固定请添加一个字段float:true默认关闭。 | boolean | false |
| selectable | 是否可选并复制文本 | boolean | false |
| refresh | 拉到底部时触发如果返回Promise<any\null> 底部刷新提示不会消失类型null\(type:string)=>Promise<any\null>null值时不被执行 | union | null |
| showScrollbar | 是否显示滚动条 | boolean | false |
| hideHead | 是否隐藏头 | boolean | false |
| showCheck | 是否显示并启用行选中功能。 | boolean | false |
| checkValue | 选中的行数据key(类似于id),不能重复 | Array | ():string[] => [] as string[] |
Events 事件
| 名称 | 参数 | 说明 |
|---|---|---|
| cellClick | item: UTSJSONObjectkey: string | 单元格被点击 |
| refresh | - | 触底刷新时触发. |
| checkChange | ids: string[] | 行被选中时触发 |
Slots 插槽
| 名称 | 说明 | 数据 |
|---|---|---|
| item2.key | 行插槽插槽名称就是列的字段名称name:字段名,sucore:utsobject数据 | - |
| item2.key+'-'+item.getString('key') | - | - |
| refresh | 触底下拉刷新的插槽,你需要提供事件函数refresh才可开启 | - |
Ref 方法
| 名称 | 参数 | 返回值 | 说明 |
|---|
示例文件路径
json
/pages/zhanshi/table示例源码
uvue
vue
<template>
<!-- #ifdef APP -->
<scroll-view style="flex:1">
<!-- #endif -->
<!-- #ifdef MP-WEIXIN -->
<page-meta :page-style="`background-color:${xThemeConfigBgColor}`">
<navigation-bar :background-color="xThemeConfigNavBgColor" :front-color="xThemeConfigNavFontColor"></navigation-bar>
</page-meta>
<!-- #endif -->
<x-sheet>
<x-text font-size="18" class=" text-weight-b mb-8">表格 xTable</x-text>
<x-text color="#999999" >
格式与antd一样,支持:单格向右合并,行选中,具名插槽定制,排序等功能。
</x-text>
</x-sheet>
<x-sheet :padding="['0']">
<x-table @checkChange="onChange" :checkValue="checkValue" :showCheck="true" ripple-color="#f6f7ff" ripple-dark-color="#161821" max-height="660px" :list="list" :columns="columns3" ></x-table>
</x-sheet>
<x-sheet>
<x-text font-size="18" class=" text-weight-b mb-8">超出左右上下滚动</x-text>
<x-text color="#999999">
多行滚动自动固定顶部ios,安卓会并排固定在顶部。在web端只有最后一个固定在顶部
尽量不要使用多行固定的功能,以防未知问题,或者性能问题。如果数据不多应该问题不大。
</x-text>
</x-sheet>
<x-sheet :padding="['0']">
<x-table :refresh="refresfun" :multiRowFloat="true" cellWidth="42%" max-height="250px" :list="list" :columns="columns" >
<!-- #ifdef APP || WEB -->
<template v-slot:age="{sucore}">
<x-text color="primary">{{(sucore as UTSJSONObject).getAny('age')}}</x-text>
</template>
<template v-slot:address="{sucore}">
<x-button @click="editeActions(sucore)" size="small" >编辑</x-button>
</template>
<!-- #endif -->
</x-table>
</x-sheet>
<x-sheet>
<x-text font-size="18" class=" text-weight-b ">定义样式</x-text>
</x-sheet>
<x-sheet :padding="['0']" >
<x-table header-bg-color="primary" darkHeaderBgColor='primary' header-font-color="white" cellWidth="50%" max-height="450rpx" :list="list2" :columns="columns2" ></x-table>
</x-sheet>
<view style="height:50px"></view>
<x-modal v-model:show="showEdite">
<x-input v-model="editevalue" dark-bg-color=""></x-input>
<x-text class="mt-12">
确认后列表数据不会变动,我没有写业务逻辑,我这只是展示用法。
</x-text>
</x-modal>
<!-- #ifdef APP -->
</scroll-view>
<!-- #endif -->
</template>
<script>
import { xTableColumns } from "@/uni_modules/tmx-ui/interface.uts"
export default {
data() {
const dataSource2 = [
{
key: '1',
name: '胡彦斌1',
age: "32",
address: '西湖区',
test:"第4数据"
} as UTSJSONObject,
{
key: '2',
name: '胡彦祖2',
age: "36",
address: '湖底公园1号',
style:{
age:{
bgStyle:"background:#7e6539",
textStyle:"font-size:16px;color:#ffffff"
} as UTSJSONObject
} as UTSJSONObject,
test:"第4数据"
} as UTSJSONObject,
{
key: '3',
name: '胡彦斌3',
age: "40",
address: '公园1号',
test:"第4数据"
} as UTSJSONObject
] as UTSJSONObject[]
const dataSource = [
{
key: '1',
name: '姓名及年龄不详',
age: "32",
address: '西湖区湖底湖底公园',
// 本行是否悬浮在顶部,滚动时
float:true,
test:"第4数据",
style:{
"name":{
align:"flex-center",
bgStyle:'background-color:#d09e9e;',
textStyle:'color:white'
}
},
merge:{
"name":{
colspan:2,
}
}
} as UTSJSONObject,
{
key: '2',
name: '胡彦祖',
age: "36",
address: '西湖区湖底公园1号',
float:true,
test:"第4数据"
} as UTSJSONObject,
{
key: '3',
name: '胡彦斌',
age: '40',
address: '西湖区湖底公园1号',
test:"第4数据"
} as UTSJSONObject,
{
key: '4',
name: '胡彦祖',
age: "无年龄等信息",
address: '西湖区湖底公园1号',
test:"第4数据",
style:{
"age":{
align:"flex-center",
bgStyle:'background-color:#b5c6d9;',
textStyle:'color:white'
}
},
merge:{
"age":{
colspan:3,
}
}
} as UTSJSONObject,
{
key: '5',
name: '胡彦祖',
age: "37",
address: '西湖区湖底公园1号',
test:"第4数据"
} as UTSJSONObject,
{
key: '6',
name: '胡彦斌',
age: "38",
address: '西湖区湖底湖底公园西湖区湖底湖底公园西湖区湖底湖底公园西湖区湖底湖底公园1号',
test:"第4数据"
} as UTSJSONObject,
{
key: '7',
name: '胡彦祖',
age: '39',
address: '西湖区湖底公园1号',
test:"第4数据"
} as UTSJSONObject,
{
key: '8',
name: '胡彦祖',
age: '29',
address: '西湖区湖底公园1号',
test:"第4数据"
} as UTSJSONObject,
{
key: '9',
name: '统计小结',
age: '这是总结栏,所有年龄为500岁哦。',
address: '所有年龄为500岁哦。',
test:"第4数据",
style:{
"address":{
textStyle:'color:red;font-size:14px'
}
},
merge:{
"name":{
colspan:2,
},
"address":{
colspan:2,
}
},
showCheck:false
} as UTSJSONObject,
] as UTSJSONObject[];
const columnsData = [
{
title: '姓名',
key: 'name',
} as xTableColumns,
{
title: '年龄',
key: 'age'
} as xTableColumns,
{
title: '住址',
key: 'address',
} as xTableColumns,
{
title: '第4列',
key: 'test',
} as xTableColumns
] as xTableColumns[];
const columnsData2 = [
{
title: '姓名',
key: 'name',
} as xTableColumns,
{
title: '年龄',
key: 'age',
width:"160rpx",
style:{
age:{
bgStyle:"background:#69349e",
textStyle:"font-size:16px;color:#ffffff",
} as UTSJSONObject
} as UTSJSONObject
} as xTableColumns,
{
title: '住址',
key: 'address',
} as xTableColumns,
{
title: '第4列',
key: 'test',
} as xTableColumns
] as xTableColumns[];
const columnsData3 = [
{
title: '姓名',
key: 'name',
width:'20%',
} as xTableColumns,
{
title: '年龄',
key: 'age',
desc:true,
width:'20%',
} as xTableColumns,
{
title: '住址',
key: 'address',
width:'40%',
} as xTableColumns,
{
title: '第4列',
key: 'test',
width:'20%',
} as xTableColumns
] as xTableColumns[];
return {
checkValue:['3'] as string[],
showEdite:false,
editevalue:'',
list:dataSource,
columns:columnsData,
columns2:columnsData2,
columns3:columnsData3,
list2:dataSource2,
};
},
methods:{
onChange(checks:string[]){
this.checkValue = checks
console.log(`当前选中的行id:${this.checkValue}`)
},
editeActions(data:any|null){
if(data==null) return;
let value = (data! as UTSJSONObject).getAny('age')
if(value!=null){
let p = value! as string;
this.editevalue = p;
this.showEdite = true;
}
},
refresfun(type:string):Promise<any|null>{
return new Promise((res)=>{
setTimeout(function() {
res(null)
}, 3500);
})
}
}
}
</script>
<style lang="scss">
</style>