小程序入门学习demo-todolist

news/2024/7/20 2:10:15 标签: 小程序, 学习

概述

适合学习小程序的初级开发人员,不需要后台,用到微信api内部存储,入门练手dome教程

详细

小程序todoList 小Demo

代码主要实现了列表的增删改查。页面布局运用flex布局。

1.项目的目录

image.png

2.项目的演示

image.png

3.实现过程

wxml代码的实现

<view class="container">
    <view class="add">
        <image src="../../imges/add.png"  bindtap="addTodoListListen"/>
        <input type="text"  placeholder="Anything here..." value="{{ add }}" bindinput="inputChangeListen" bindconfirm="addTodoListListen"/>
        <button type="primary"  bindtap="addTodoListListen" size="mini">ADD</button>
    </view>
     
    <view class="doing">
        <text class="doingtext">Be in progress</text>
        <text class="doingcount">{{ leftcount }}</text>
    </view>
     
    <block wx:if="{{todolist.length}}">
        <view class="todoslist">
            <view class="item"  wx:for="{{todolist}}" bindtap="toggleToDoListen"
            data-index="{{index}}">
                <icon type="{{ item.completed ? 'success' : 'circle'}}"/>
                <text >{{item.name}}</text>
                <icon type="clear" size="16" catchtap="removeItemListen"/>
            </view>
        </view>   
        <view class="footer">  
                <text bindtap="tpggleAllListen">Choose all</text>
        </view>  
    </block>
     
    <view class="completed">
        <text class="completedtext">Completed</text>
        <text class="completedcount">{{completedcount}}</text>
    </view>
     
    <block wx:if="{{completedList.length}}">
        <view class="completedlist">
            <view class="completeditem" wx:for="{{completedList}}" 
            bindtap="completedItemClickListen" data-index="{{index}}">
                <icon type="success"/>
                <text >{{item.name}}</text>
                <icon type="clear" size="16" catchtap="removecompletedItemListen"/>
            </view>
        </view>
        <view class="footer">  
                <text bindtap="clearListen" >clear all completed</text>
        </view>
    </block>
    
</view>

样式代码wxss

.container {
    border-top: 1rpx solid #e0e0e0;
}
.add{
    display: flex;
    align-items: center;
    width: 90%;
    margin: 20rpx;
    padding: 20rpx;
    border: 1rpx solid #e0e0e0;
    border-radius: 5rpx;
    box-shadow: 0 0 5rpx #e0e0e0;
}
.add image{
    width: 40rpx;
    height: 40rpx;
    margin-right: 10rpx;
}
.add button{
    width: 50rpx;
}
.add input{
    flex: 1;
}
.doing{
    display: flex;
    height: 60rpx;
    padding: 20rpx;
    width: 90%;
    margin: 20rpx;
    align-items: center;
    border: 1rpx;
    border-radius: 5rpx;
    background-color: #7d6dc2;
}
.doing .doingtext{
    flex: 1;
}
.doing text{
    font-size: 30rpx;
}
.completed{
    display: flex;
    height: 60rpx;
    padding: 20rpx;
    width: 90%;
    margin: 20rpx;
    align-items: center;
    border: 1rpx;
    border-radius: 5rpx;
    background-color: #7d6dc2;
}
.completed .completedtext{
    flex: 1;
}
.completed text{
    font-size: 30rpx;
}
.todoslist{
    width: 90%;
    margin: 20rpx;
    border: 1rpx solid #e0e0e0;
    border-radius: 5rpx;
    box-shadow: 0 0 5rpx #e0e0e0;
}
.todoslist .item {
    display: flex;
    align-items: center;
    padding: 20rpx;
    border-bottom: 1rpx solid #e0e0e0;
}
.todoslist .item:last-child{
    border-bottom: 0;
}
.todoslist .item text{
    flex: 1;
    font-size: 30rpx;
    color: #444;
}
.completedlist{
    width: 90%;
    margin: 20rpx;
    border: 1rpx solid #e0e0e0;
    border-radius: 5rpx;
    box-shadow: 0 0 5rpx #e0e0e0;   
}
.completedlist .completeditem {
    display: flex;
    align-items: center;
    padding: 20rpx;
    border-bottom: 1rpx solid #e0e0e0;
}
.completedlist .completeditem:last-child{
    border-bottom: 0;
}
.completedlist .completeditem text{
    flex: 1;
    font-size: 30rpx;
    color: #888;
    text-decoration: line-through;
}
  
.footer{
    width: 90%;
    display: flex;
    justify-content: space-between;
    margin: 20rpx;
    font-size: 30rpx;
}

js功能代码的实现

Page({
  /**
   * 页面的初始数据
   */
  data: {
    //输入框内容
    add: "", 
    //正在进行列表
    todolist: [], 
    //已完成列表
    completedList:[], 
    //未完成数
    leftcount: 0, 
    //已完成数
    completedcount: 0,
  },
  /**
   * 缓存正在进行和已完成的列表数据
   */
  save: function(){
    wx.setStorageSync('todo_list', this.data.todolist)
    wx.setStorageSync('completed_list', this.data.completedList)
  },
   /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
   //获取缓存的列表数据
    var todos = wx.getStorageSync('todo_list')
    var completedList = wx.getStorageSync('completed_list')
    //列表不为空时,赋值
    if (todos) {
      this.setData({ 
        todolist: todos, 
        leftcount: todos.length 
      })
    }
    //列表不为空时,赋值
    if (completedList) {
      this.setData({ 
        completedList: completedList, 
        completedcount: completedList.length 
      })
    }
  },
  /**
   * 输入框输入监听
   * @param {*} e 
   */
  inputChangeListen: function(e){
    this.setData({
        add: e.detail.value
    })
  },
  /**
   * 点击键盘的回车和【添加】时处理的事件
   */
  addTodoListListen: function() {
    //输入框为空时,点击添加无效
    if(!this.data.add){
      return
    }
    var todos = this.data.todolist
    todos.push({
      //把输入框的值赋给todolist.name,并且设置完成状态为false
      name: this.data.add,
      completed: false
    })
     
    this.setData({
      todolist: todos,
      add: "",
      leftcount: this.data.leftcount + 1
    })
    this.save()
  },
  /**
   * 进行中的列表item点击监听
   * @param  e 
   */
  toggleToDoListen: function(e){
     
    //切换选中item的完成状态
    var todolist  = this.data.todolist
    var  completedList = this.data.completedList
    //获得当前点击的item
    var todoitem = todolist[e.currentTarget.dataset.index]
    //改变完成状态
    todoitem.completed = true
    //把item加入到已完成列表
    completedList.push(todoitem)
   //进行的任务-1
    var leftCount = this.data.leftcount -1
    //已完成任务+1
    var completedcount = this.data.completedcount +1
    //在进行列表中删除改item
    todolist.splice(e.currentTarget.dataset.index, 1)[0]
    
    this.setData({
      todolist: todolist,
      completedList: completedList,
      leftcount: leftCount,
      completedcount: completedcount
    })
   
    this.save()
  },
 /**
   * 已完成的列表item点击监听
   * @param  e 
   */
  completedItemClickListen: function(e){
    //切换当选选中item的完成状态
    var completedList  = this.data.completedList
    var  todolist = this.data.todolist
    //获得当前点击的item
    var completeditem = completedList[e.currentTarget.dataset.index]
    //改变完成状态
    completeditem.completed = false
    //把item加入到进行中列表
    todolist.push(completeditem)
    //在已完成列表中删除该item
    completedList.splice(e.currentTarget.dataset.index, 1)[0]
   
    this.setData({
      todolist: todolist,
      completedList: completedList,
      leftcount: this.data.leftcount +1,
      completedcount: this.data.completedcount -1
    })
    this.save()
  },
  /**
   * 删除进行中列表item的处理
   * @param {*} e 
   */
  removeItemListen: function(e){
    var todolist  = this.data.todolist
    //通过e.currentTarget.dataset.index拿到item的index,并删除1个
    todolist.splice(e.currentTarget.dataset.index, 1)
    this.setData({
      todolist: todolist,
      leftcount:  this.data.leftcount -1
    })
    this.save()
  },
 /**
   * 删除已完成列表item的处理
   * @param {*} e 
   */
  removecompletedItemListen: function(e){
    var completedList  = this.data.completedList
     //通过e.currentTarget.dataset.index拿到item的index,并删除1个
    completedList.splice(e.currentTarget.dataset.index, 1)
    this.setData({
      completedList: completedList,
      completedcount: this.data.completedcount - 1
    })
    this.save()
  },
  /**
   * 一键全选并且设置成已完成状态
   */
  tpggleAllListen: function(){
    var that = this
    var todolist = this.data.todolist
    var completedList= this.data.completedList
    //遍历todolist,改变状态,并且push到completedList
    todolist.forEach(function (item){
      item.completed = true
      completedList.push(item)
   
    })
    this.setData({
      todolist: [],
      leftcount: 0,
      completedList: completedList,
      completedcount: this.data.completedcount + todolist.length
    })
    this.save()
  },
  /**
   * 清空列表
   */
  clearListen: function() {
    this.setData({
      completedList: [],
      completedcount: 0
    })
    this.save()
  }
})

4.最后

所有的注释和实现都写在了代码里。这是我学习小程序写的第一个demo,有错误的欢迎指正,也希望对初学的小伙伴有点点帮助。有帮助请问恰饭,哈哈哈


http://www.niftyadmin.cn/n/5046792.html

相关文章

基于C#的AE二次开发之IQueryFilter接口、ISpatialFilter接口、IQueryDef 接口的查询接口的介绍

一、开发环境 开发环境为ArcGIS Engine 10.2与Visual studio2010。在使用ArcEngine查询进行查询的时候主要使用三种查询接口IQueryFilter&#xff08;属性查询&#xff09; 、ISpatialFilter&#xff08;空间查询&#xff09; 、IQueryDef &#xff08;多表查询&#xff09; 那…

【腾讯云TDSQL-C Serverless 产品体验】使用 Python向TDSQL-C添加读取数据实现词云图

关于TDSQL-C Serverless介绍 TDSQL-C 是腾讯云自主研发的新一代云原生关系型数据库。 它融合了传统数据库、云计算和新硬件技术的优势,100%兼容 MySQL,为用户提供具有极致弹性、高性能、高可用性、高可靠性和安全性的数据库服务。 TDSQL-C 实现了超过百万每秒的高吞吐量,支持…

LeetCode讲解篇之347. 前 K 个高频元素

347. 前 K 个高频元素 文章目录 347. 前 K 个高频元素题目描述题解思路题解代码 题目描述 题解思路 根据数组频率倒序排序, 然后返回前k的个数据 题解代码 func topKFrequent(nums []int, k int) []int {m : make(map[int]int, 0)for i : len(nums) - 1; i > 0; i-- {m[n…

线程池的shuwdown()和shutdownNow()和其他方法

本文只是总结结论,至于方法的底层代码原理,想要深入了解的话请再去百度. 线程池运行状态介绍 ThreadPoolExecutor 使用 runState (运行状态)这个变量对线程池的生命周期进行控制&#xff0c;线程池关闭过程会有频繁的运行状态转化&#xff0c;所以我们首先需要了解线程池的各种…

Vision Transformer(ViT)论文解读与代码实践(Pytorch)

Vision Transformer Vision Transformer&#xff08;ViT&#xff09;是一种基于Transformer架构的神经网络模型&#xff0c;用于处理计算机视觉任务。传统的计算机视觉模型如卷积神经网络&#xff08;CNN&#xff09;在处理图像任务时取得了很大的成功&#xff0c;但CNN存在一…

网页文本编辑器

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>文本编辑器</title><style>.box {height: 500px;width: 1000px;margin: auto;background-color: navajowhite;}.box_h {/* font-weight: normal; */text-al…

2023美团暑期实习自驾仿真算法一面面经

来源&#xff1a;投稿 作者&#xff1a;LSC 编辑&#xff1a;学姐 总共45分钟 1. 自我介绍 2. 介绍自己的实习和项目 讲的比较多&#xff0c;20分钟&#xff0c;面试官还问了我在实习中遇到的困难和体会等,然后面试官给我介绍了他们的现在的项目。 3. 编程题 我们有一些自动…

zabbix自定义监控、钉钉、邮箱报警 (五十六)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、实验准备 二、安装 三、添加监控对象 四、添加自定义监控项 五、监控mariadb 1、添加模版查看要求 2、安装mariadb、创建用户 3、创建用户文件 4、修改监控模版 5、…