微信小程序 TODO案例
源于 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 {
/* 🚫阻止原有组件的事件 */
pointer-events: none;
}
.delete-line {
/* 给文字增加删除线 */
text-decoration: line-through;
color: rgba(0, 0, 0, .5);
}
.todo-list {
padding: 30rpx 60rpx;
display: flex;
/* 通过样式来控制从头部追加 */
flex-direction: column-reverse;
}
.todo-list .todo-item {
margin-bottom: 40rpx;
align-items: center;
display: inline-flex;
font-size: 28rpx;
justify-content: space-between;
}
.todo-item .todo-delete {
line-height: 48rpx;
padding: 0 20rpx;
font-size: 28rpx;
color: #ff0000;
}
.todo-completion{
text-align: center;
padding: 20rpx 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
2020-07-23 GitLab 定时备份