源于 https://ask.csdn.net/questions/7759861 进行了简化。
index.js
Page({ data: { // 待办列表 todoList: [ { thing: '洗衣服', completed: false }, { thing: '刷鞋', completed: false }, { thing: '写代码', completed: false } ], // 待办事务 todoThing: "" }, // 待办点击 todoClick(e) { // 从wxml传入的点击的索引 let index = e.currentTarget.dataset.index; this.setData({ // 通过索引进行更改条目 [`todoList[${index}].completed`]: !this.data.todoList[index].completed }) }, // 待办输入 todoThingInput(e) { this.setData({ todoThing: e.detail.value }) }, // 添加按钮 addClick() { this.setData({ // 再数组最后追加一条 [`todoList[${this.data.todoList.length}]`]: { thing: this.data.todoThing, completed: false }, // 新增后清空输入框 todoThing: '' }) }, // 删除按钮 deleteClick(e) { // 从wxml传入的点击的索引 let index = e.currentTarget.dataset.index; // 删除todoList索引为index的条目 this.data.todoList.splice(index, 1) this.setData({ // 对数组重新赋值 todoList: this.data.todoList }) } })
index.wxml
<wxs module="tools"> module.exports.getProgress = function (todo) { var length = todo.length; var checked = 0; for (var i = 0; i < todo.length; i++) { if (todo[i].completed) { checked++; } } return '完成度:' + (checked / length * 100).toFixed(2) + '%' } </wxs> <view class="todo-completion">{{tools.getProgress(todoList)}}</view> <view class="todo-list"> <view class="todo-item" wx:for="{{todoList}}" wx:key="unique" bindtap="todoClick" data-index="{{index}}"> <!-- 点击条目增加删除线 --> <view class="todo-form-label {{item.completed?'delete-line':''}}"> <radio checked="{{item.completed}}" /> {{item.thing}} </view> <!-- catchtap阻止冒泡并绑定事件 --> <view class="todo-delete" catchtap="deleteClick" data-index="{{index}}">删除</view> </view> </view> <view class="todo-form"> <!-- bindconfirm 点击完成按钮时触发 --> <input class="form-item" type="text" placeholder="请输入想要做的事情" value="{{todoThing}}" bindinput="todoThingInput" bindconfirm="addClick" /> <button type="primary" bindtap="addClick">添加</button> </view>
index.wxss
.todo-form { padding: 20rpx 60rpx; } .todo-form .form-item { margin-bottom: 40rpx; font-size: 36rpx; } .todo-item .todo-form-label { /*