开发微信记账本小程序之技术要点记录

我喜欢极简风格,所以我搭建了这款微信记账本小程序。在开发微信记账本小程序过程中,有一些值得关注的技术要点,我则简而记之。

1、空态界面

在没有数据时,我设计了空状态时的占位提示。

在框架中,我使用了 wx:if="{{ isShow }}" 来判断是否需要渲染该代码块。而isShow的赋值逻辑是通过判断数组的长度,如果为0则为false,否则为true。

图片

2、新增记账

这里我基于表单元素封装了一个业务表单组件,通过遮罩层弹出。使用到的表单项有form、input、radio、textarea、picker、button,通过自定义样式实现定制化界面。

其实,我有考虑过使用Skyline进行渲染的。但是由于还不太掌握,所以还是使用自定义组件的方式,实现弹层效果。

况且,这个模块后面还会在其他地方用到,所以为了提高可复用性才做了封装。

图片

那么,在微信小程序中,如何封装自定义组件和引用呢?

1) 创建自定义组件:

首先,在项目根目录下创建一个文件夹 `components`,用于存放自定义组件。

在 `components` 文件夹下创建一个子文件夹`my-component`,用于存放自定义组件的相关文件。

在 `my-component` 文件夹下创建以下四个文件:

  •     `my-component.wxml`:组件的模板结构。

  •      `my-component.wxss`:组件的样式表。

  •      `my-component.js`:组件的逻辑代码。

  •       `my-component.json`:组件的配置信息。

编写组件的代码,然后在需要使用该组件的页面中进行引用。

2)引用自定义组件:

在需要使用自定义组件的页面的 `json` 文件中,添加 `usingComponents` 字段,用于声明要使用的自定义组件。

     // json     {       "usingComponents": {         "my-component": "/components/my-component/my-component"       }     }     

在页面的 `wxml` 文件中,使用自定义组件的标签来引用它。

     // wxml     <my-component></my-component>

注意,自定义组件的名称必须遵循一定的命名规范,即以字母开头,可以包含数字、下划线、横杠等字符。

这样,就大致上在微信小程序中使用自定义组件了。接下来,就是写页面结构布局与样式,还有业务逻辑代码了。

这里的拖拽效果,我是基于框架提供的draggable-sheet 组件实现的,封装了这一能力,包括:

  • 隐藏滚动条

  • 滚动回弹效果

  • 滚动到指定位置(snap 到关键点)

  • 滚动帧回调(实现滚动驱动动画)

<draggable-sheet  class="sheet"  initial-child-size="0.5"  min-child-size="0.2"  max-child-size="0.8"  snap="{{true}}"  snap-sizes="{{[0.4, 0.6]}}"  worklet:onsizeupdate="onSizeUpdate">  <scroll-view    scroll-y="{{true}}"    type="list"    associative-container="draggable-sheet"    bounces="{{true}}"  /></draggable-sheet>

3、选择类型和分类管理

这里的长按拖动分类排序,我认为也是一个技术难点。

实现长按拖拽某个选项进行排序,我采用了以下技术方案来实现。

首先,在页面的 `wxml` 文件中,为每个选项添加一个 `touchstart` 和 `touchmove` 事件监听器。

// wxml<view class="item" bindtouchstart="startDrag" bindtouchmove="drag" data-index="{{index}}">  {{item}}</view>

在对应的 `js` 文件中,定义 `startDrag` 和 `drag` 方法。`startDrag` 方法用于记录触摸开始时的位置和索引,`drag` 方法用于处理拖拽过程中的逻辑。

// javascriptPage({  data: {    items: ['餐饮', '交通', '服饰']  },  startDrag: function (e) {    // 记录触摸开始时的位置和索引    this.setData({      startX: e.touches[0].clientX,      startY: e.touches[0].clientY,      startIndex: e.currentTarget.dataset.index    });  },  drag: function (e) {    // 获取触摸移动时的位置    const moveX = e.touches[0].clientX;    const moveY = e.touches[0].clientY;    const startX = this.data.startX;    const startY = this.data.startY;    const startIndex = this.data.startIndex;    // 计算拖拽的距离    const distanceX = moveX - startX;    const distanceY = moveY - startY;    // 如果拖拽距离大于一定阈值,则认为是拖拽操作    if (Math.abs(distanceX) > 10 || Math.abs(distanceY) > 10) {      // 获取当前拖拽的元素      const currentItem = this.data.items[startIndex];      // 从数组中移除当前元素      const newItems = this.data.items.filter((item, index) => index !== startIndex);      // 计算新的插入位置      const newIndex = startIndex + Math.round(distanceX / 100);      // 将当前元素插入到新的位置      newItems.splice(newIndex, 0, currentItem);      // 更新数据      this.setData({        items: newItems      });    }  }});

这样,当用户长按并拖动某个选项时,选项会根据拖动的距离进行重新排序。

图片

4、智能分类和报表分析

为了实现日、月的收支报表,以及分类统计图表,我采用了echarts可视化图表库。这也是一项大工程,后面再单独展开写一下。

图片

5、账目管理

看,这里修改数据的模块,就是引用了前面封装的组件。这开发效率,杠杠滴。

而删除前询问用户以避免误删数据,我是使用了框架的wx.showModal方法显示模态对话框。

图片

当然,还有更多开发过程中的技术要点和开发技巧。但是如果都要一一细写,恐怕就要等后面出教程了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1546783.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C++安全密码生成与强度检测

目标 密码生成 // Function to generate a random password std::string generatePassword(int length, bool includeUpper, bool includeNumbers, bool includeSymbols) {std::string lower "abcdefghijklmnopqrstuvwxyz";std::string upper "ABCDEFGHIJKLM…

IP地址的打卡路径是什么?

众多周知&#xff0c;IP地址使我们浏览网站的“必需品”&#xff0c;他会在我们进行网络活动时起到通关文牒一般的作用。那么&#xff0c;放我们进行网络活动时&#xff0c;我们的“通关文牒”上面会在哪些地点留下痕迹&#xff0c;IP地址的流转路径是什么&#xff1f; 第一关…

企业如何选择合适的半导体设计小企业软件

在半导体行业日益精细化与智能化的今天&#xff0c;企业选择合适的半导体设计小企业软件&#xff0c;已成为提升研发效率、缩短产品上市周期、增强市场竞争力的关键。面对市场上琳琅满目的软件产品&#xff0c;企业需从多方面考量&#xff0c;以确保所选软件既能满足当前需求&a…

SpringMVC中出现的sql语句错误

1、原sql语句&#xff1a;select major_id AS majorId ,major_name AS majorName,tuition,dept_id as deptId from tb_major where major_id ? 出现问题&#xff1a;Request processing failed: org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQ…

java并发之并发关键字

并发关键字 关键字一&#xff1a;volatile 可以这样说&#xff0c;volatile 关键字是 Java 虚拟机提供的轻量级的同步机制。 功能 volatile 有 2 个主要功能&#xff1a; 可见性。一个线程对共享变量的修改&#xff0c;其他线程能够立即得知这个修改。普通变量不能做到这一点&a…

将Docker镜像推送到阿里云仓库,使用Docker-compose将mysql、redis、jar包整合在一起

进入阿里云&#xff1a; https://cr.console.aliyun.com 阿里云镜像控制台 选择个人实例 创建命名空间 创建镜像仓库 下一步之后&#xff0c;创建我们的本地仓库 创建好之后可以在个人实例里看到我们刚创建好的镜像仓库 点击我们的仓库进去里面&#xff0c;可以看到里面有我们…

4.5 了解大数据处理基本流程

文章目录 1. 引言2. 数据采集2.1 数据库采集2.2 实时数据采集2.3 网络爬虫采集 3. 数据预处理3.1 数据清洗3.2 数据集成3.3 数据归约3.4 数据转换 4. 数据处理与分析4.1 数据处理4.2 数据分析 5. 数据可视化与应用5.1 数据可视化5.2 ECharts框架5.3 课堂作业 6. 结语 1. 引言 …

信息安全工程师(17)密码体制分类

前言 密码体制&#xff0c;也称为密码系统&#xff0c;是信息安全领域中的一个重要概念&#xff0c;用于解决机密性、数据完整性、认证、身份识别、可控性及不可抵赖性等问题。根据加密和解密所使用的密钥是否相同&#xff0c;密码体制主要可以分为两大类&#xff1a;单钥体制&…

【Unity基础】Unity中跨平台使用SQLite(一)

一、概述 游戏中数据存储方案众多&#xff0c;在进行选择时&#xff0c;除了要考虑数据类型外&#xff0c;还要考虑对于跨平台的支持。 对于数据存储方案将在单独文章里介绍&#xff0c;下面只是总结了不同方案的特点。 方法跨平台支持读写能力适合场景特点Resources优秀只读…

c++ 使用 Graham 扫描的凸包(Convex Hull using Graham Scan)

先决条件&#xff1a; 如何检查两个给定的线段是否相交&#xff1f; c https://blog.csdn.net/hefeng_aspnet/article/details/141713655 java https://blog.csdn.net/hefeng_aspnet/article/details/141713762 python https://blog.csdn.net/hefeng_aspnet/article/details/…

PG duckdb插件 pg_quack部署与使用

一.pg_quack简介 pg_quack 是一个创新的 PostgreSQL扩展&#xff0c;它将 DuckDB-—一个嵌入式列式数据库 管理系统集成到PostgreSQL中。这个开源项目为开发者提供了一种在同一个数据 库环境中利用高性能数据处理和存储的新方式,使得在PostgreSQL在OLAP的性能 上得到了很大的提…

Spring Boot 进阶-第一个程序HelloWorld

从我们学习编程语言开始,每次入门一个语言都是从Hello World开始,当然这里我们也不例外。首先从一个简单的HelloWorld程序开始。 既然是要学着做Java Web开发,那么首先需要了解的就是如何去编写一个RESTFul风格的接口,这里我们就需要引入一个pom的依赖。 <dependency&g…

Django设计批量导入Excel数据接口(包含图片)

Django设计批量导入Excel数据接口(包含图片) 目录 Django设计批量导入Excel数据接口(包含图片)示例xlsx文件接口详情前端上传FormData后端APIView调用函数 Django 4.2.7 openpyxl 3.1.5示例xlsx文件 接口详情 前端上传FormData …

自动驾驶规划算法(一):A*算法原理和代码(c++与python)

1. A*算法简介 A*算法&#xff08;A-star algorithm&#xff09;诞生于1968年&#xff0c;由彼得哈特&#xff08;Peter Hart&#xff09;、尼尔森尼尔森&#xff08;Nils Nilsson&#xff09;和伯特拉波特&#xff08;Bertram Raphael&#xff09;三位计算机科学家提出。它的…

基于大数据可视化的图书推荐及数据分析系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

快速订餐:Spring Boot 点餐系统

第二章关键技术的研究 2.1相关技术 网上点餐系统是在Java MySQL开发环境的基础上开发的。Java是一种服务器端脚本语言&#xff0c;易于学习&#xff0c;实用且面向用户。全球超过35&#xff05;的Java驱动的互联网站点使用Java。MySQL是一个数据库管理系统&#xff0c;因为它的…

WanFangAi论文写作研究生论文写作神器在线生成真实数据,标注参考文献位置,表格公式代码流程图查重20以内,研究生论文开题报告写作技巧

撰写开题报告时&#xff0c;遭循以下结构将有助于你条理清晰地展示你的研究计划: 研究目标 1.研究背景:简要介绍你选择该研究题目的背景&#xff0c;阐述研究的重要性。 2.研究问题:明确阐述你的研究将解决的核心问题。 研究价值 1.理论价值:探讨你的研究在学术领域内的贡献&a…

C语言 | Leetcode C语言题解之第437题路径总和III

题目&#xff1a; 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ //递归遍历树节点&#xff0c;判断是否为有效路径 int dfs(struct TreeNode * root, int ta…

基于RealSense D435相机实现手部姿态重定向

基于Intel RealSense D435 相机和 MediaPipe的手部姿态检测&#xff0c;进一步简单实现手部姿态与机器人末端的重定向。 假设已经按照【基于 RealSenseD435i相机实现手部姿态检测】配置好所需的库和环境&#xff0c;并且有一个可以控制的机器人接口。 一、手部姿态重定向介绍 …

【WRF运行第二期(Ubuntu)】ARWpost安装及错误总结

WRF运行第二期&#xff1a;ARWpost安装及错误总结 1 ARWpost介绍2 ARWpost安装2.1 ARWpost_V3安装前准备2.2 安装ARWpost2.3 修改Makefile文件2.4 修改configure.arwp文件2.5 生成可执行文件EXE另&#xff1a;报错1-Error: Type mismatch between actual argument at (1) and a…