小程序开发--表格table的实现

表格table的实现

Githubhttps://github.com/tomsiebel/MGTableView--MiniProgram

Giteehttps://gitee.com/siebel/MGTableView--MiniProgram


在这里插入图片描述

说表格前先说下 列表渲染wx:forblock

wx:for

在组件上使用 wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。
默认数组的当前项的下标变量名默认为 index,数组当前项的变量名默认为 item

示例代码1
index.wxml

<!--index.wxml-->
<view wx:for="{{array}}">{{item}}</view>

index.js

// index.js
Page({
  data: {
    array: [1, 2, 3, 4, 5]
  }
})

打印结果
1
2
3
4
5

示例代码2

index.wxml

<!--index.wxml-->
<view wx:for="{{array}}">{{index}}: {{item.message}}</view>

index.js

// index.js
Page({
  data: {
    array: [{
      message: 'foo',
    }, {
      message: 'bar'
    }]
  }
})

打印结果
0:foo
1:bar

注:item为数组当前元素的变量名,可以通过wx:for-item制定变量名

列表渲染属性

  • wx:for-item 可以指定数组当前元素的变量名
  • wx:for-index 可以指定数组当前下标的变量名
  • wx:key 指定列表中项目的唯一的标识符
wx:for-item

wx:for-item指 定数组当前元素的变量名,默认item
wx:for-item="itemName",则下面的循环变量名itemName

wx:for-index

wx:for-index 可以指定数组当前下标的变量名,默认index, 下标的值为从0递增,即第一个元素为index=0
wx:for-index="idx",则下面的循环数组的下标名变为idx 即第一个元素变为idx=0

示例代码
index.wxml

<!--index.wxml-->
<view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itemName"> {{idx}}: {{itemName.message}}</view>

index.js

// index.js
Page({
  data: {
    array: [{
      message: 'foo',
    }, {
      message: 'bar'
    }]
  }
})

打印结果
0:foo
1:bar

wx:key

如果列表中项目的位置会动态改变或者有新的项目添加到列表中,并且希望列表中的项目保持自己的特征和状态(如 中的输入内容, 的选中状态),需要使用 wx:key 来指定列表中项目的唯一的标识符。

wx:key 的值以两种形式提供

1. 字符串,代表在 for 循环的 array(数组) 中 item 的某个 property(属性),该 property 的值需要是列表中唯一的字符串或数字,且不能动态改变。

2.保留关键字 *this 代表在 for 循环中的 item 本身,这种表示需要 item 本身是一个唯一的字符串或者数字

如:
当数据改变触发渲染层重新渲染的时候,会校正带有 key 的组件,框架会确保他们被重新排序,而不是重新创建,以确保使组件保持自身的状态,并且提高列表渲染时的效率。

### 如不提供 wx:key,会报一个 warning, 如果明确知道该列表是静态,或者不必关注其顺序,可以选择忽略。

示例代码
效果展示


在这里插入图片描述

index.wxml

<view class='firstView'>
  <switch wx:for="{{objectArray}}" wx:key="unique" style="display: block;">
    {{item.id}}
  </switch>
  <button type="primary" bindtap="switchClick">确定属性可以动态改变单一属性的值</button>
  <button type="primary" bindtap="addToFront">添加数据到列表中</button>
</view>


<view class='secondView'>
<switch wx:for="{{numberArray}}" wx:key="*this" style="display: block;">
  {{item}}
</switch>
<button type="primary" bindtap="addNumberToFront">添加数据到列表中</button>
</view>

index.wxss

/**index.wxss**/
switch{
  margin-left: 300rpx;
}
button{
  margin: 20rpx;
  font-size: 30rpx;
}

index.js

// index.js
Page({
  data: {
    objectArray: [
      { id: 5, unique: 'unique_5' },
      { id: 4, unique: 'unique_4' },
      { id: 3, unique: 'unique_3' },
      { id: 2, unique: 'unique_2' },
      { id: 1, unique: 'unique_1' },
      { id: 0, unique: 'unique_0' },
    ],
    numberArray: [1, 2, 3, 4]
  },
  //确定属性可以动态改变单一属性的值
  switchClick(e) {
    const length = this.data.objectArray.length
    for (let i = 0; i < length; ++i) {
      const x = Math.floor(Math.random() * length)
      const y = Math.floor(Math.random() * length)
      const temp = this.data.objectArray[x]
      this.data.objectArray[x] = this.data.objectArray[y]
      this.data.objectArray[y] = temp
    }
    this.setData({
      objectArray: this.data.objectArray
    })
  },
  //添加数据到列表中
  addToFront(e) {
    const length = this.data.objectArray.length
    this.data.objectArray = [{ id: length, unique: 'unique_' + length }].concat(this.data.objectArray)
    this.setData({
      objectArray: this.data.objectArray
    })
  },
  //添加数据到列表中
  addNumberToFront(e) {
    this.data.numberArray = [this.data.numberArray.length + 1].concat(this.data.numberArray)
    this.setData({
      numberArray: this.data.numberArray
    })
  }
})

注:
(1)当 wx:for 的值为字符串时,会将字符串解析成字符串数组
<view wx:for="array">{{item}}</view>
等同于
<view wx:for="{{['a','r','r','a','y']}}">{{item}}</view>

(2)花括号和引号之间如果有空格,将最终被解析成为字符串
<view wx:for="{{[1,2,3]}} ">{{item}}</view>
等同于
<view wx:for="{{[1,2,3] + ' '}}">{{item}}</view>

block

在条件渲染中block wx:if
因为 wx:if 是一个控制属性,需要将它添加到一个标签上。如果要一次性判断多个组件标签,可以使用一个 标签将多个组件包装起来,并在上边使用 wx:if 控制属性。

<block wx:if="{{true}}">
  <view>view1</view>
  <view>view2</view>
</block>

在列表渲染中 block wx:for
类似 block wx:if,也可以将 wx:for 用在标签上,以渲染一个包含多节点的结构块。例如:
index.wxml

<!--index.wxml-->
<block wx:for="{{[1, 2, 3]}}">
  <view>{{index}}:</view>
  <view>{{item}}</view>
</block>

注意: 并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。










下面回归正题如何写一个你想要的表格
知道了列表渲染wx:for 后其实表格只是css位置排序和添加竖线的问题
首先我画两条垂直的线


在这里插入图片描述

之后每添加一组数据只需要画出数据的下边缘和右边缘即可


在这里插入图片描述

下面我们上代码
示例代码
效果展示


在这里插入图片描述

代码
index.wxml

<!--index.wxml-->
<view class='title'>表格模板</view>
<view class="tableView">
  <view class="table_header">
    <view class="th th1">日期</view>
    <view class="th th2">时间</view>
    <view class="th th3">工作内容</view>
  </view>
  <!-- <block> 并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。 -->
  <block wx:for="{{ listData }}" wx:for-item="work" wx:key="key">
    <view class="table_cell">
      <view class="td td1">{{work.date}}</view>
      <view class="td td2">{{work.time}}</view>
      <view class="td td3">{{work.content}}</view>
    </view>
  </block>

</view>

index.wxss

/**index.wxss**/
.title{
  width: 100%;
  text-align: center;
  font-size: 50rpx;
  font-weight: 900
}
.tableView{
  border:1px solid #000;
  border-right:0;
  border-bottom: 0;
  width: 98%;
  margin-left: 1%;
}
/* 表头 */
.table_header{
  display: flex;
  justify-content: space-between; /* 项目位于各行之间留有空白的容器内。 */
  background-color: #fffb00;
  width: 100%;
  font-size: 35rpx;
  color: #330e0e;
  text-align: center;
  font-weight: 900;
} 
.th{
  display: flex;
  align-items: center;
  justify-content: center;
  height: 80rpx;
  border-bottom: 1px solid #000;
  border-right: 1px solid #000;
}
.th1,.th2{
  width: 20%
}
.th3{
  width: 60%
}
/* 表格cell */
.table_cell{
  display: flex;
  justify-content: space-between; /* 项目位于各行之间留有空白的容器内。 */
  width: 100%;
  font-size: 25rpx;
  color: #330e0e;
  text-align: center;
}
.td{
  display: flex;
  align-items: center;
  justify-content: center;
  height: 60rpx;
  border-bottom: 1px solid #000;
  border-right: 1px solid #000;
  
} 
.td1,.td2{
  width: 20%
} 
.td3{
  width: 60%
}

index.js

// index.js
Page({
  data: {
    listData: [
      { "date": "2019/01/01", "time": "9:00", "content": "工作内容1" },
      { "date": "2019/01/01", "time": "10:30", "content": "工作内容2" },
      { "date": "2019/01/01", "time": "12:00", "content": "工作内容3" },
      { "date": "2019/01/01", "time": "2:30", "content": "工作内容4" },
      { "date": "2019/01/01", "time": "3:30", "content": "工作内容5" },
      { "date": "2019/01/01", "time": "4:00", "content": "工作内容6" },
      { "date": "2019/01/01", "time": "5:00", "content": "工作内容7" },
      { "date": "2019/01/02", "time": "9:00", "content": "工作内容1" },
      { "date": "2019/01/02", "time": "10:30", "content": "工作内容2" },
      { "date": "2019/01/02", "time": "12:00", "content": "工作内容3" },
      { "date": "2019/01/02", "time": "2:30", "content": "工作内容4" },
      { "date": "2019/01/02", "time": "3:30", "content": "工作内容5" },
      { "date": "2019/01/02", "time": "4:00", "content": "工作内容6" },
      { "date": "2019/01/02", "time": "5:00", "content": "工作内容7" }
    ]
  },
  onLoad: function () {
    console.log('onLoad')
  }
})




附表格demo:

Github :https://github.com/tomsiebel/MGTableView--MiniProgram
Gitee :https://gitee.com/siebel/MGTableView--MiniProgram
优快云: https://download.youkuaiyun.com/download/jackjia2015/11006399




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值