位置: IT常识 - 正文

【移动端表格组件】uniapp简单实现H5,小程序,APP多端兼容表格功能,复制即用,简单易懂【详细注释版本】(移动列表格)

编辑:rootadmin
【移动端表格组件】uniapp简单实现H5,小程序,APP多端兼容表格功能,复制即用,简单易懂【详细注释版本】 前言:

推荐整理分享【移动端表格组件】uniapp简单实现H5,小程序,APP多端兼容表格功能,复制即用,简单易懂【详细注释版本】(移动列表格),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:移动列表格,移动端多内容表格设计,移动端表格组件,移动端table表格插件,移动端表单,移动端表格组件,移动端表格组件,移动端表格组件,内容如对您有帮助,希望把文章链接给更多的朋友!

由于最近需要做移动端的项目 有个pc端的后台系统里面需要移一部分页面过来 而里面就有很多的表格,我就开始惯例网上先找前人栽的树,我好乘凉 然后找了一圈发现,不管是主流的移动端ui库或者网上自己写的帖子,或者uniapp的插件网站 都没有看到符合我要求的表格,然后如果要改别人的源码那我看代码都要看很久,好切有些还奇奇怪怪的bug不兼容 可能是别人使用了某些组件和插件之类的。导致我很多设置不生效。没错,我也改过别人的源码了,后来放弃了。 所以我就直接手写了一个简单的表格展示组件,配上一些我需要的功能。可以先用着了。 重点是我是原生的标签写的,不是引入一大堆的插件之类的,uniapp可以直接用。 想修改源码也简单。我都注释好了

效果图【移动端表格组件】uniapp简单实现H5,小程序,APP多端兼容表格功能,复制即用,简单易懂【详细注释版本】(移动列表格)

小程序页面兼容,可以看到点击按钮之后会拿到对应行的数据 H5页面的,也是一样兼容的可能,也能拿到数据 移动端,手机预览效果,展示了数据和点击生效,滚动到底部可以触发方法,可以在这里写加载第二页表格的方法

功能:

1,数据展示:只需要往组件内传入表头和列表数据就能展示,列表数据和elementul的表格一样。表头要自己配置 2,固定表头:上滚动的时候表头会定位在上面不动 3,固定列:表头内配置属性,可以让这一列固定左边不动。目前只能固定一列 4,行底纹:就是给一行的单元格加上背景色,需要在tabledata列表中添加一个字段bgcolor就可以了 5,列底纹:同上,区别是在表头内添加一个字段bgcolor 6,单元格文字颜色改变:这是我们项目的要求,需要拿到每个单元格的数据和指标对比大小来标红。这里在父组件就可以配置 7,操作列:表头添加操作列,key给edit就会出现一个编辑和删除的列。不写就没有这一列。点击按钮会触发父组件的方法 8,滚动到底部:滚动到底部会触发父组件方法。可以做业务操作,比如拿第二页的表格 9,自动列宽:根据表格内单元格内容的宽度来动态赋值几个宽度,宽度是提前定义好的。由于表头和表体需要宽度一致,所以提前设置几个档次的固定宽度。具体使用是自动根据表体或者表头哪一个长,用哪一个的宽。保证数据的展示完全。当数据过长的时候会自动隐藏并省略号显示。这里我就没有加其他的功能了,后期可以自行更改,把这个文字加一个组件包裹,就是点击可以显示全部文字的弹框那个。

引入组件

uniapp可以直接使用,整体就引入了一个组件,uniapp带有的scroll-view组件。需要去uniapp文档内引入一下,直接插件市场下载一下就好了

代码:

组件部分: 写一个tableDiv的vue文件,当然名字随便你换 然后把代码复制进去。

<template><view class="wrap"><!-- @scrolltolower:滚动到底部触发 lower-threshold:距离底部多少距离触发@scrolltolower --><scroll-view class="scroll-view_H" scroll-x="true" scroll-y="true" @scrolltolower='scrollBottom':lower-threshold='2'><view class="top" id="top" :style="{width:tableWidths+'px'}"><view v-for="(h,n) in header" :key='n' :class="{'header_dyg':true,'flexs':h.flxe}":style="{width:h.hWidth+'px'}">{{h.name}}</view></view><view class="bottom" :style="{maxHeight: tableHeight+'px',width:tableWidths+'px'}"><view class="tablebox" v-for="(t,s) in tableData" :key='s' @click="jumpDetailed(t)"><view v-for="(h,n) in header" :key="n":class="{'table_dyg':true,'tdColClass':h.bgcolor,'tdRowClass':t.bgcolor,'flexs':h.flxe}":style="{width:h.hWidth+'px'}"><!-- 不等于操作列就显示文字 --><text v-if="h.key!=='edit'" :style="{color:getColor(t,h)}">{{t[h.key]}}</text><!-- 操作列显示按钮,后期用插槽 --><view class="uni-group" v-else style="background-color: #fff;"><button class="uni-button" size="mini" type="primary" style="margin-right: 5px;"@click="editTable(t)">编辑</button><button class="uni-button" size="mini" type="warn" @click="deleteTable(t)">删除</button></view></view></view></view></scroll-view></view></template><script>// 表头配置:flxe(固定列),bgcolor(列底纹)// 表体配置:bgcolor(行底纹)export default {props: {data2: {type: Array,required: true,default: function() {return [];}},head: {type: Array,required: true,default: function() {return [];}},tableHeight: {required: true,type: [Number, String],default: function() {return 0;}}},data() {return {//表体tableData: [],//表头header: [],// 表格总长度tableWidths:0}},watch:{// 监听列表'data2'(a,b){this.tableData = a},// 监听表头'head'(a,b){this.header = a//计算列宽this.tableWidth()},},created() {//#ifdef H5this.tableData = this.data2 //列表this.header = this.head //表头this.tableWidth()// #endif},methods: {// 返回行数据jumpDetailed(row){this.$emit('rowData',row)},// 滚动到底部,调用父组件方法scrollBottom(e) {// 滚动到底部才触发,滚动到右边不触发if (e.detail.direction == "bottom") {this.$emit('scrollBottom')}},// 颜色对比getColor(row, col) {let color = 'black'// 传值给父组件,通过父组件的方法内计算判断当前单元格数据是否需要标红,然后通过回调函数,返回一个color值来渲染this.$emit('getTextColor', row, col, val => {color = val})return color},// 修改按钮editTable(val) {this.$emit('getEdit', val)},// 删除按钮deleteTable(val) {this.$emit('getDelete', val)},// 计算单元格宽度tableWidth() {let w=0 //计算表格长度this.header.forEach((head, index) => {let hw = head.name.length //表头单元格宽度let dw = 0 //列表单元格宽度this.tableData.forEach(data => {// 如果是操作列,就直接给十个字符长度,也就是列宽自动150,不是操作列的统一看字符串长度决定宽度let a = (head.key == 'edit' ? '1234567891' : (data[head.key]?data[head.key].toString():'1'))let tw = (head.key == 'edit' ? 10 : a.length)// 这里每次循环找出更大的数赋值,确保dw中是表体单元格这一列中最大宽度,根据最大宽度来判断单元格显示if (dw < tw) {dw = tw}})// 表体单元格内容宽度小于表头内容时,以表头的宽度为主。根据表头的字符长度来区分宽度if (dw <= hw) {if (hw <= 3) {head['hWidth'] = 50} else if (hw <= 5) {head['hWidth'] = 80} else {head['hWidth'] = 130}} else {// 表体内容宽度大于表头内容宽度时,以表体宽度为主。根据表头的字符长度来区分宽度if (dw <= 3) {head['hWidth'] = 50} else if (dw <= 5) {head['hWidth'] = 80} else {head['hWidth'] = 130}}w+=head['hWidth'] //叠加表格总长度})this.tableWidths=w //给表格赋值总长度}}}</script><style lang="scss">.wrap {width: 100%;}// 表头.top {display: flex;position: sticky; //表头向上滚动时固定住top: 0;//width: 750px; //左右滚动时不会把固定的表头滚动走z-index: 100; //滑动时表头不被覆盖.header_dyg {height: 40px;text-align: center;line-height: 40px;border-top: 1px solid #ccc;border-right: 1px solid #ccc;border-bottom: 1px solid #ccc;padding: 0 5px;background-color: #f5f5f6;font-size: 14px;font-weight: bold;color: #2b2b2b;flex-shrink: 0;}// 列定位固定单元格.flexs {position: sticky;left: 0;background-color: #f5f5f6;z-index: 10;}}// 表格列表.bottom {//width: 750px;.tablebox {display: flex;font-size: 14px;.table_dyg {height: 30px;text-align: center;line-height: 30px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;border-right: 1px solid #ccc;border-bottom: 1px solid #ccc;padding: 0 5px;flex-shrink: 0;}// 列定位固定单元格.flexs {position: sticky;left: 0;background-color: #fff;z-index: 10;}}}// 列的颜色.tdColClass {background-color: #d9edf7;}// 行的颜色.tdRowClass {background-color: #afdfe4;}</style>

然后父组件引入子组件使用

<template><view class="box"><!-- 表格组件:参数解释:@getTextColor:调用方法判断数据后返回对比颜色,可以改变单元格文字的颜色 --><!-- @getEdit:点击表格中编辑按钮会触发的方法 @getDelete:点击表格中删除按钮会触发的方法 @scrollBottom:滚动到底部时触发 @rowData:获取点击行的数据--><!-- data:列表数据,格式和elementul表格一样,head:表头数据,格式[{name:'列名',key:'对应列表的key',bgcolor:1代表这一列添加背景色,flxe:1代表这一列固定}],tableHeight:表格表体高度 --><mytable @scrollBottom='scrollBottom' @getTextColor='getRedText' @getEdit='editTable'@getDelete='deleteTable' @rowData='getRow' :data2='tableData' :head='header' :tableHeight='310'></mytable></view></template><script>import tableDiv from './tableDiv.vue'export default {components: {tableDiv},data() {return {//表体tableData: [{"date": "2020-09-01","name": "11","address": "上海市普陀区金沙江路 1518 弄","age": "18",bgcolor: 1}, {"date": "2020-09-02","name": "22","address": "上海市普陀区金沙江路 1517 弄","age": "18"}, {"date": "2020-09-03","name": "33","address": "上海市普陀区金沙江路 1519 弄","age": "18"}, {"date": "2020-09-04","name": "44","address": "上海市普陀区金沙江路 1516 弄","age": "18"}, {"date": "2020-09-05","name": "55","address": "上海市普陀区金沙江路 1518 弄","age": "18"}, {"date": "2020-09-06","name": "66","address": "上海市普陀区金沙江路 1517 弄","age": "18"}, {"date": "2020-09-06","name": "66","address": "上海市普陀区金沙江路 1517 弄","age": "18"}, {"date": "2020-09-06","name": "66","address": "上海市普陀区金沙江路 1517 弄","age": "18"}, {"date": "2020-09-06","name": "66","address": "上海市普陀区金沙江路 1517 弄","age": "18"}, {"date": "2020-09-06","name": "66","address": "上海市普陀区金沙江路 1517 弄","age": "18"}, {"date": "2020-09-06","name": "66","address": "上海市普陀区金沙江路 1517 弄","age": "18"}, {"date": "2020-09-06","name": "66","address": "上海市普陀区金沙江路 1517 弄","age": "18"}, {"date": "2020-09-06","name": "66","address": "上海市普陀区金沙江路 1517 弄","age": "18"}],//表头header: [{name: '日期',key: 'date',flxe: 1 //固定的列,只能有一个列}, {name: '姓名',key: 'name',bgcolor: 1 //列底纹}, {name: '地址',key: 'address'}, {name: '年龄',key: 'age'}, {name: '年龄',key: 'age'}, {name: '操作',key: 'edit'}]}},methods: {// 自定义事件方法,业务逻辑判断是否需要标红,然后回调给子组件颜色getRedText(row, col, callback) {let color = 'black'// 判断值是否需要标红if (row[col.key] == '22') {color = 'red'} else {color = 'black'}// 通过回调函数返回值callback(color);},// 编辑按钮editTable(val){console.log(val,'编辑');uni.showToast({title: val.date+'编辑'})},// 删除按钮deleteTable(val){console.log(val,'删除');uni.showToast({title: val.date+'删除'})},// 滚动到底部scrollBottom(){uni.showToast({title: '滚动到底部了'})console.log('滚动到底部了');}}}</script><style lang="scss"></style>注意点:

由于小程序不支持直接vue那种父子组件传参形式。拿不到数据,所以这里需要用watch监听一下props变化及时更新子组件。 H5页面是可以支持vue的原本写法的。直接进来拿props就可以使用了。所以这里直接created内赋值一下就可以了

本文链接地址:https://www.jiuchutong.com/zhishi/290271.html 转载请保留说明!

上一篇:克林格尔农场的Mazezilla玉米田迷宫,宾夕法尼亚州 (© Alex Potemkin/Getty Images)(克雷格格林)

下一篇:BootStrap基本使用(bootstrap步骤)

  • 华为荣耀8x和荣耀v10对比(华为荣耀8X和荣耀play哪个质量好)

    华为荣耀8x和荣耀v10对比(华为荣耀8X和荣耀play哪个质量好)

  • 立秋吃什么馅饺子(立秋短信)(立秋吃什么馅饺子养胃)

    立秋吃什么馅饺子(立秋短信)(立秋吃什么馅饺子养胃)

  • 电子邮箱格式正确写法(电子邮箱格式)(电子邮箱格式正确格式手机格式)

    电子邮箱格式正确写法(电子邮箱格式)(电子邮箱格式正确格式手机格式)

  • 拼多多可以用支付宝支付吗(拼多多可以用支付宝亲情卡吗)

    拼多多可以用支付宝支付吗(拼多多可以用支付宝亲情卡吗)

  • 小米9屏幕材质(小米9的屏幕材质)

    小米9屏幕材质(小米9的屏幕材质)

  • 苹果手机已经调到最大声音小怎么办(苹果手机已经调成震动为什么来电话还有声音)

    苹果手机已经调到最大声音小怎么办(苹果手机已经调成震动为什么来电话还有声音)

  • c语言中的函数不可以单独进行编译(c语言中的函数应由什么和函数体两部分组成)

    c语言中的函数不可以单独进行编译(c语言中的函数应由什么和函数体两部分组成)

  • 被拉黑后发送验证请求(被拉黑后发送验证信息)

    被拉黑后发送验证请求(被拉黑后发送验证信息)

  • program files是什么文件夹可以删除吗(program files是什么可以删除吗)

    program files是什么文件夹可以删除吗(program files是什么可以删除吗)

  • 苹果官换机在哪里购买(苹果官换机在哪买)

    苹果官换机在哪里购买(苹果官换机在哪买)

  • 什么软件能去除视频水印(什么软件能去除照片水印)

    什么软件能去除视频水印(什么软件能去除照片水印)

  • 为什么苹果相册照片右下角有个感叹号(为什么苹果相册照片模糊不清加载不出来)

    为什么苹果相册照片右下角有个感叹号(为什么苹果相册照片模糊不清加载不出来)

  • 抖音视频没有播放量怎么回事(抖音视频没有播放量可以删了重发吗)

    抖音视频没有播放量怎么回事(抖音视频没有播放量可以删了重发吗)

  • 强制启用4xmsaa是什么意思(强制启用4xmsaa什么用)

    强制启用4xmsaa是什么意思(强制启用4xmsaa什么用)

  • iphone11怎么关机开机(iphone11怎么关机重启手机)

    iphone11怎么关机开机(iphone11怎么关机重启手机)

  • 三星a90上市时间(三星a90什么时间上市)

    三星a90上市时间(三星a90什么时间上市)

  • 抖音绑今日头条有什么用(抖音绑今日头条权重会变高吗)

    抖音绑今日头条有什么用(抖音绑今日头条权重会变高吗)

  • 华为gt2运动版和时尚版区别(华为手表gt2和运动版区别)

    华为gt2运动版和时尚版区别(华为手表gt2和运动版区别)

  • 微信原图和一般图区别(微信原图跟不是原图有什么区别)

    微信原图和一般图区别(微信原图跟不是原图有什么区别)

  • kk键盘怎么发语音包(Kk键盘怎么发语音到快手)

    kk键盘怎么发语音包(Kk键盘怎么发语音到快手)

  • 抖音道具怎么收藏(抖音道具怎么收藏教程)

    抖音道具怎么收藏(抖音道具怎么收藏教程)

  • 交管12123验证失败是怎么回事(交管12123一直验证)

    交管12123验证失败是怎么回事(交管12123一直验证)

  • win10壁纸怎么删除(win10壁纸图片怎么删除)

    win10壁纸怎么删除(win10壁纸图片怎么删除)

  • 车船税征税范围口诀
  • 只有增值税专用发票才能抵扣进项吗
  • 小规模纳税人征税规定
  • 销售使用过的车辆
  • 应税销售额是指
  • 长期借调人员差旅费是谁的责任
  • 电子商务公司开业活动流程
  • 出口退税转内销会计分录
  • 个人劳务费 税
  • 报销应聘人员差旅费
  • 外购无形资产的相关税费包括增值税吗
  • 搬运费计入
  • 认缴制下股权转让如何不交税
  • 堤围费是什么意思
  • 长期待摊费用多少钱
  • win10专业版虚拟内存怎么设置
  • 专项附加扣除如何自行申报
  • 忘记excel工作表保护密码怎么办
  • 出口退税新政策对出口贸易的影响
  • 固定资产清理应交税费怎么算
  • 国家减免税收
  • 以下哪些企业需要填报
  • 销售旧设备如何开票
  • 鸟瞰视野
  • 老板垫付的员工怎么入账
  • 雪花 (© TothGaborGyula/Getty Images Plus)
  • 支付劳务费时是什么科目
  • php利用switch语句判断学生成绩处于哪个区间
  • php生成压缩包
  • YOLOv8(n/s/m/l/x)&YOLOv7(yolov7-tiny/yolov7/yolov7x)&YOLOv5(n/s/m/l/x)不同模型参数/性能对比(含训练及推理速度)
  • vue项目安装路由
  • opencv识别车牌
  • atx系统的grpck命令可验证组的合法性
  • wordpress使用教程
  • 投标保证金属于什么费用
  • 股票的溢价是怎么回事
  • 本年利润在借方代表亏损吗
  • phpcms二次开发教程
  • python knn算法和结果
  • mongodb视频教程
  • 假退库会计分录
  • 税控盘技术服务费抵扣期限
  • 增值税无票收入负数预警值
  • 职工教育经费的比例是多少
  • 存货和固定资产一经计提减值以后期间不得转回
  • 现汇跟承兑有什么区别
  • 研发活动发生的费用
  • 物业公司劳务外包
  • 施工总包能分包土方吗
  • 赠送样品视同销售增值税该怎么做账务处理呢?
  • 公司多出来的钱怎么办
  • 国外工程合同类型
  • 主营业务成本和管理费用的区别
  • 采购材料发票未到
  • 开发成本转到哪里
  • 税金及附加是什么账户
  • 进项税和销项税抵扣的会计分录
  • 企业对于发出的货物
  • 会计收入的定义和分类
  • 库存商品记账
  • mysql怎么切换到bin目录
  • windows命令操作
  • windows7wifi密码
  • Win10怎么设置高性能
  • 2021年win10累积更新
  • centos好玩的命令
  • win8如何开启蓝牙
  • win10回收站设置
  • win8.1系统更新
  • 宏基win8改win7
  • Unity3d NGUI的drawcall,UISprite与UITexture
  • 安卓颜色值代码表
  • vue实战案例
  • jquery 修改
  • mongodb python
  • 医院的电子收据怎么查
  • 四川税务局网上办税
  • 高速公路通行费的税率
  • 个人以土地投资入股都需缴纳哪些税
  • 地税局有实权吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设