uniapp微信小程序简单表格展示

很简单的一个表格展示,自己写的,功能一般般。

javascript 复制代码
<template>
    <view class="x-simple-table" :style="{ width: width, height: height, maxHeight: maxHeight  }">
        <view class="x-simple-table-panel">
            <view class="table-header tui-flex-align-center">
                <view class="table-cell border-rb" v-for="header in effectiveHeaders" :key="header.onlyId"
                    :class="header.class"
                    :style="header.style">
                    {{ header.title }}
                </view>
            </view>
            <view v-for="cellOption in effectiveDataList" :key="cellOption.onlyId" class="table-row tui-flex-align-center">
                <view v-for="cell in cellOption.cellList" :key="cell.onlyId"
                    class="table-cell border-rb" :style="cell.style"
                     :class="cell.class">
                    {{ cell.value }}
                </view>
            </view>
        </view>
    </view>
</template>
<script>
    export default {
        props: {

            width: {
                type: String,
                default: 'auto'
            },

            height: {
                type: String,
                default: 'auto'
            },

            maxHeight: {
                type: String,
                default: 'auto'
            },
            
            headers: {
                type: Array,
                default: new Array()
            },

            dataList: {
                type: Array,
                default: new Array()
            }
        },

        data () {
            return {
                tableFieldWidth: 100,
                autoHeaderWidth: []
            }
        },

        computed: {

            effectiveHeaders () {
                let onlyId = Date.now()
                return this.headers.map((e, index) => {
                    const { field, width, hStyle = '', hClass = '' } = e
                    const { width: autoWidth } = this.autoHeaderWidth.find(ah => ah.field === field) || {}

                    const newHeader = { ...e, onlyId: onlyId++ * 2}

                    const styleArray = []
                    const classArray = [hClass]
                    // if (index < this.headers.length - 1) {
                    //     classArray.push('border-r')
                    // }
                    // if (this.dataList.length) {
                    //     classArray.push('border-b')
                    // }
                    if (width || autoWidth) {
                        newHeader.widthUnit = width ? 'rpx' : 'px'
                        styleArray.push(`width: ${width || autoWidth}${newHeader.widthUnit}`)
                    } else {
                        newHeader.autoWidthFlag = true
                        styleArray.push('flex: 1')
                        classArray.push(`x-auto-width-header-${field}`)
                    }
                    hStyle && styleArray.push(hStyle)
                    Object.assign(newHeader, {
                        width: width || autoWidth,
                        style: styleArray.join(';'),
                        class: classArray.join(' ')
                    })
                    return newHeader
                })
            },

            effectiveDataList () {
                if (!this.effectiveHeaders.length) {
                    return []
                }
                const nullValueArray = [void (0), null]
                const newDataList = []
                let onlyId = Date.now()
                for (let rowIndex = 0; rowIndex < this.dataList.length; rowIndex++) {
                    const row = this.dataList[rowIndex]
                    const tableCellValue = []
                    for (let cellIndex = 0; cellIndex < this.effectiveHeaders.length; cellIndex++) {
                        const header = this.effectiveHeaders[cellIndex]

                        const tClass = row[`${header.field}_class`]
                        const classArray = []
                        // if (cellIndex < this.effectiveHeaders.length - 1) {
                        //     classArray.push('border-r')
                        // }
                        // if (rowIndex < this.dataList.length - 1) {
                        //     classArray.push('border-b')
                        // }
                        tClass && classArray.push(tClass)

                        const tStyle = row[`${header.field}_style`]
                        const styleArray = [ `width: ${header.width || 0}${header.widthUnit || 'rpx'}` ]
                        tStyle && styleArray.push(tStyle)

                        const value = nullValueArray.includes(row[header.field]) ? '' : row[header.field] + (header.suffix || '')
                        tableCellValue.push({
                            $row: row,
                            style: styleArray.join(';'),
                            class: classArray.join(' '),
                            field: header.field,
                            value,
                            onlyId: onlyId++
                        })
                    }
                    newDataList.push({
                        onlyId: onlyId++,
                        cellList: tableCellValue
                    })
                }
                return newDataList
            }
        },

        mounted () {
            this.refactorCellWidth()
        },

        methods: {
            
            refactorCellWidth () {
                this.$nextTick(_ => {
                    const autoWidthHeaderList = this.effectiveHeaders.filter(e => e.autoWidthFlag)
                    if (!autoWidthHeaderList.length) {
                        return
                    }
                    const $el = uni.createSelectorQuery().in(this)
                    autoWidthHeaderList.forEach(header => {
                        $el.select(`.x-auto-width-header-${header.field}`)
                            .boundingClientRect(({ width }) => {
                                const ahRow = this.autoHeaderWidth.find(ah => ah.field === header.field)
                                if (ahRow) {
                                    ahRow.width !== width && this.$set(ahRow, 'width', width)
                                } else {
                                    this.autoHeaderWidth.push({
                                        field: header.field,
                                        width
                                    })
                                }
                            }).exec()
                    })
                })
            }
        }
    }
</script>
<style lang="scss" scoped>
    $border: 2rpx solid rgba(229, 229, 229, 1);
    .x-simple-table {
        border: $border;
        border-radius: 12rpx;
        font-size: 28rpx;
        color: rgba(102, 102, 102, 1);
        overflow: hidden;
        .x-simple-table-panel {
            overflow: auto;
        }
        .table-header, .table-row {
            align-items: stretch;
        }
        .table-cell {
            text-align: center;
            padding: 14rpx 8rpx;
            flex-shrink: 0;
            box-sizing: border-box;
            overflow: hidden;
            white-space: nowrap;
            min-width: 100rpx;
        }
        .border-r, .border-rb {
            border-right: $border;
        }
        .border-b, .border-rb {
            border-bottom: $border;
        }
    }
</style>


没什么单元格合并,但支持左右滑动,上下滑动,单元格自定义样式。


相关推荐
acheding16 小时前
Vue3 + AntV/X6 自定义节点实践:组件化节点与事件联动
前端框架·vue
梦梦代码精18 小时前
《全栈开源智能体:终结企业AI拼图时代》
人工智能·后端·深度学习·小程序·前端框架·开源·语音识别
米饭同学i1 天前
微信小程序实现动态环形进度条组件
前端·微信小程序
Rysxt_1 天前
uni-app x 教程:下一代跨平台开发框架
uni-app·uni-app x
说私域1 天前
基于AI智能名片链动2+1模式服务预约小程序的旅拍消费需求激发路径研究
大数据·人工智能·小程序
南山老沙1 天前
VUE 项目通过electron-builder打包成桌面应用
electron·vue
小白学大数据1 天前
某程旅行小程序爬虫技术解析与实战案例
爬虫·小程序
开开心心就好1 天前
免费无广告卸载工具,轻便安全适配全用户
linux·运维·服务器·网络·安全·启发式算法·1024程序员节
小小王app小程序开发1 天前
家政服务小程序特殊玩法开发全解析:技术实现+架构支撑+合规落地
小程序·架构
游戏开发爱好者81 天前
2025年iOS应用上架App Store全指南,开发者必看
android·ios·小程序·https·uni-app·iphone·webview