当前位置: 首页 > news >正文

微信小程序案例3-2 计算器

文章目录

  • 一、运行效果
  • 二、知识储备
    • (一)data-*自定义属性
    • (二)模块
  • 三、实现步骤
    • (一)准备工作
      • 1、创建项目
      • 2、设置导航栏
    • (二)实现页面结构
      • 1、编写页面整体结构
      • 2、编写结果区域的结构
      • 3、编写按钮区域第一行按钮的结构
      • 4、编写按钮区域第二行按钮的结构
      • 5、编写按钮区域第三行按钮的结构
      • 6、编写按钮区域第四行按钮的结构
      • 7、编写按钮区域第五行按钮的结构
      • 8、查看页面结构源码
    • (三)实现页面样式
      • 1、编写页面样式
      • 2、编写结果区域样式
      • 3、编写按钮区域样式
        • (1)按钮区域总体样式
        • (2)按钮区域中每一行的样式
        • (4)按钮区域每一行中每个按钮的样式
        • (5)让0按钮跨2列
        • (6)清除按钮样式
        • (7)最后一列按钮样式
        • (8)按钮的盘旋样式类
      • 4、查看页面样式源码
    • (四)创建工具模块
      • 1、数学模块 - math.js
      • 2、计算模块 - calc.js
    • (五)实现页面逻辑
    • (六)特殊情况处理

一、运行效果

在这里插入图片描述

二、知识储备

(一)data-*自定义属性

在这里插入图片描述

  • app.json
{"pages": ["pages/index/index"],"window": {"navigationBarTextStyle": "black","navigationBarTitleText": "案例3-2知识储备","navigationBarBackgroundColor": "#eee"},"style": "v2","sitemapLocation": "sitemap.json"
}
  • pages/index/index.wxml
<!--index.wxml-->
<view>姓名:{{name}}</view>
<view>年龄:{{age}}</view>
<button bind:tap="change" data-name="陈燕文" data-age="18">修改姓名与年龄</button>
  • pages/index/index.js
// index.js
Page({// 定义初始数据data: {name: "未知",age: "0"},// 编写修改事件处理函数change: function(e) {// 更新数据,同步刷新页面this.setData({name: e.target.dataset.name,age: e.target.dataset.age})}
})

(二)模块

在这里插入图片描述

  • utils/welcome.js
// 暴露一个对象
module.exports = {message: "欢迎访问泸职院~"
}
  • pages/index/index.js
// index.js
// 引入`welcome.js`模块(注意路径问题)
var welcome = require('../../utils/welcome.js')
Page({// 页面加载生命周期回调函数onLoad: function() {// 访问导入模块对外暴露的数据console.log("welcome模块暴露的数据:" + welcome.message)},// 定义初始数据data: {name: "未知",age: "0"},// 编写修改事件处理函数change: function(e) {// 更新数据,同步刷新页面this.setData({name: e.target.dataset.name,age: e.target.dataset.age})}
})

三、实现步骤

(一)准备工作

1、创建项目

  • 创建微信小程序项目 - 计算器
    在这里插入图片描述
  • 单击【确定】按钮
    在这里插入图片描述
  • 按照惯例,做一些初始化工作
    在这里插入图片描述

2、设置导航栏

  • app.json文件设置window配置项
    在这里插入图片描述

(二)实现页面结构

  • pages/index/index.wxml文件

1、编写页面整体结构

在这里插入图片描述

2、编写结果区域的结构

  • 两行内容:第一行是当前计算式,第二行是当前计算结果
    在这里插入图片描述

3、编写按钮区域第一行按钮的结构

  • 第一行包含四个按钮:清除按钮、删除按钮、正负号切换按钮、除号按钮
    在这里插入图片描述
  • 第20行代码设置了data-val自定义属性,用于区分不同按钮

4、编写按钮区域第二行按钮的结构

  • 第二行包含四个按钮:7按钮、8按钮、9按钮、乘号按钮
    在这里插入图片描述
  • 第二行四个按钮都设置了data-val自定义属性,用于区分不同按钮

5、编写按钮区域第三行按钮的结构

  • 第三行包含四个按钮:4按钮、5按钮、6按钮、减号按钮
    在这里插入图片描述
  • 第三行四个按钮都设置了data-val自定义属性,用于区分不同按钮

6、编写按钮区域第四行按钮的结构

  • 第四行包含四个按钮:1按钮、2按钮、3按钮、加号按钮
    在这里插入图片描述

7、编写按钮区域第五行按钮的结构

  • 第五行包含三个按钮:0按钮、点按钮、等号按钮
    在这里插入图片描述
  • 第58行代码设置了data-val自定义属性,用于区分不同按钮
  • 查看预览效果
    在这里插入图片描述

8、查看页面结构源码

<!--index.wxml-->
<!-- 结果区域 -->
<view class="result"><!-- 当前计算式 --><view class="result-sub">{{sub}}</view><!-- 当前计算结果 --><view class="result-num">{{num}}</view>
</view>
<!-- 按钮区域 -->
<view class="btns"><!-- 第一行按钮 --><view><!-- 清除按钮 --><view hover-class="bg" hover-stay-time="50" bind:tap="btnReset">C</view><!-- 删除按钮 --><view hover-class="bg" hover-stay-time="50" bind:tap="btnDel">DEL</view><!-- 正负号切换按钮 (+: Positive, -: Negative)--><view hover-class="bg" hover-stay-time="50" bind:tap="btnPosNeg">+/-</view><!-- 除号按钮 --><view hover-class="bg" hover-stay-time="50" bind:tap="btnOperate" data-val="÷">÷</view></view><!-- 第二行按钮 --><view><!-- 7按钮 --><view hover-class="bg" hover-stay-time="50" bind:tap="btnNum" data-val="7">7</view><!-- 8按钮 --><view hover-class="bg" hover-stay-time="50" bind:tap="btnNum" data-val="8">8</view><!-- 9按钮 --><view hover-class="bg" hover-stay-time="50" bind:tap="btnNum" data-val="9">9</view><!-- 乘号按钮 --><view hover-class="bg" hover-stay-time="50" bind:tap="btnOperate" data-val="×">×</view></view><!-- 第三行按钮 --><view><!-- 4按钮 --><view hover-class="bg" hover-stay-time="50" bind:tap="btnNum" data-val="4">4</view><!-- 5按钮 --><view hover-class="bg" hover-stay-time="50" bind:tap="btnNum" data-val="5">5</view><!-- 6按钮 --><view hover-class="bg" hover-stay-time="50" bind:tap="btnNum" data-val="6">6</view><!-- 减号按钮 --><view hover-class="bg" hover-stay-time="50" bind:tap="btnOperate" data-val="-">-</view></view><!-- 第四行按钮 --><view><!-- 1按钮 --><view hover-class="bg" hover-stay-time="50" bind:tap="btnNum" data-val="1">1</view><!-- 2按钮 --><view hover-class="bg" hover-stay-time="50" bind:tap="btnNum" data-val="2">2</view><!-- 3按钮 --><view hover-class="bg" hover-stay-time="50" bind:tap="btnNum" data-val="3">3</view><!-- 加号按钮 --><view hover-class="bg" hover-stay-time="50" bind:tap="btnOperate" data-val="+">+</view></view><!-- 第五行按钮 --><view><!-- 0按钮 --><view hover-class="bg" hover-stay-time="50" bind:tap="btnNum" data-val="0">0</view><!-- 点按钮 -->       <view hover-class="bg" hover-stay-time="50" bind:tap="btnDot">.</view><!-- 等号按钮 —— 进行计算 --><view hover-class="bg" hover-stay-time="50" bind:tap="btnCalculate">=</view></view>
</view>

(三)实现页面样式

  • pages/index/index.wxss文件

1、编写页面样式

  • 编写page样式
    在这里插入图片描述

2、编写结果区域样式

  • 结果区域有三个样式类:resultresult-subresult-num
    在这里插入图片描述
  • 修改页面结构,暂时查看预览效果
    在这里插入图片描述
  • 查看预览效果之后,将页面结构改回去
    在这里插入图片描述

3、编写按钮区域样式

(1)按钮区域总体样式
  • .btns选择器
    在这里插入图片描述
  • 查看预览效果
    在这里插入图片描述
(2)按钮区域中每一行的样式
  • .btns > view选择器
    在这里插入图片描述
  • 查看预览效果
    在这里插入图片描述
(4)按钮区域每一行中每个按钮的样式
  • .btns > view > view选择器
    在这里插入图片描述
  • 查看预览效果
    在这里插入图片描述
(5)让0按钮跨2列
  • .btns > view:last-child > view:first-child选择器
    在这里插入图片描述
  • 查看预览效果
    在这里插入图片描述
(6)清除按钮样式
  • .btns > view:first-child > view:first-child选择器
    在这里插入图片描述
  • 查看预览效果
    在这里插入图片描述
(7)最后一列按钮样式
  • .btns > view > view:last-child选择器
    在这里插入图片描述
  • 查看预览效果
    在这里插入图片描述
(8)按钮的盘旋样式类
  • .bg选择器
    在这里插入图片描述
  • 查看预览效果
    在这里插入图片描述

4、查看页面样式源码

/**index.wxss**/
/* 页面样式 */
page {height: 100vh;display: flex;flex-direction: column;color: #555;
}/* 结果区域样式 */
.result {    flex: 1; /* 垂直均分手机屏幕,因为flex-direction: column */background: #f3f6fe;position: relative;
}/* 当前计算式样式 */
.result-sub {font-size: 52rpx;position: absolute;bottom: 16vh;right: 3vw;
}/* 当前计算结果样式 */
.result-num {font-size: 100rpx;position: absolute;bottom: 3vh;right: 3vw;
}/* 按钮区域样式 */
.btns {flex: 1;display: flex;flex-direction: column;font-size: 48rpx;border-top: 1rpx solid #ccc;border-left: 1rpx solid #ccc;
}/* 按钮区域中每一行的样式 */
.btns > view {flex: 1;display: flex;
}/* 按钮区域每一行中每个按钮的样式 */
.btns > view > view {flex-basis: 25%; /* 四个按钮均分一行空间 */border-right: 1rpx solid #ccc; /* 右边框线 */border-bottom: 1rpx solid #ccc; /* 底边框线 */box-sizing: border-box; /* 控制盒模型的尺寸计算方式 */display: flex;  /* 弹性布局,默认是水平方向 */align-items: center; /* 交叉轴居中 - 垂直居中 */justify-content: center; /* 主轴居中 - 水平居中 */
}/* 0按钮跨2列,view:first-child ~ view:nth-child(1) */
.btns > view:last-child > view:first-child { flex-basis: 50%;
}/* 清除按钮样式 */
.btns > view:first-child > view:first-child {color: #f00;
}/* 最后一列按钮样式 */
.btns > view > view:last-child {color: #fc8e00;
}/* 按钮的盘旋样式类 */
.bg {background: #eee;
}

(四)创建工具模块

在这里插入图片描述

  • 在项目根目录创建utils目录
    在这里插入图片描述

1、数学模块 - math.js

  • utils目录里创建math.js文件
    在这里插入图片描述
// 精准计算功能,用于解决JavaScript浮点数运算精度不准确的问题
module.exports = {// 加法add: function (a, b) {var r1, r2, mtry {r1 = a.toString().split('.')[1].length} catch (e) {r1 = 0}try {r2 = b.toString().split('.')[1].length} catch (e) {r2 = 0}m = Math.pow(10, Math.max(r1, r2))return (a * m + b * m) / m},// 减法sub: function (a, b) {var r1, r2, m, ntry {r1 = a.toString().split('.')[1].length} catch (e) {r1 = 0}try {r2 = b.toString().split('.')[1].length} catch (e) {r2 = 0}m = Math.pow(10, Math.max(r1, r2))// 动态控制精度长度n = (r1 >= r2) ? r1 : r2return ((a * m - b * m) / m).toFixed(n)},// 乘法mul: function (a, b) {var m = 0,s1 = a.toString(),s2 = b.toString()try {m += s1.split('.')[1].length} catch (e) { }try {m += s2.split('.')[1].length} catch (e) { }return Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m)},// 除法div: function (a, b) {var t1 = 0,t2 = 0,r1, r2try {t1 = a.toString().split('.')[1].length} catch (e) { }try {t2 = b.toString().split('.')[1].length} catch (e) { }r1 = Number(a.toString().replace('.', ''))r2 = Number(b.toString().replace('.', ''))return (r1 / r2) * Math.pow(10, t2 - t1)}
}

2、计算模块 - calc.js

(五)实现页面逻辑

(六)特殊情况处理

相关文章:

微信小程序案例3-2 计算器

文章目录 一、运行效果二、知识储备&#xff08;一&#xff09;data-*自定义属性&#xff08;二&#xff09;模块 三、实现步骤&#xff08;一&#xff09;准备工作1、创建项目2、设置导航栏 &#xff08;二&#xff09;实现页面结构1、编写页面整体结构2、编写结果区域的结构3…...

QT QSplitter

分裂器QSplitter类提供了一个分裂器部件。和QBoxLayout类似&#xff0c;可以完成布局管理器的功能,但是包含在它里面的部件,默认是可以随着分裂器的大小变化而变化的。 比如一个按钮放在布局管理器中,它的垂直方向默认是不会被拉伸的,但是放到分裂器中就可以被拉伸。还有一点不…...

银行支付凭证截图生成器在线,工商邮政农业招商建设,画板+透明标签+图片框

用易语言设计了一个非常牛X的截图生成器&#xff0c;娱乐使用哈&#xff0c;软件我在这里也不会分享&#xff0c;模版网上找的&#xff0c;百度图库搜到的&#xff0c;上面的LOGO用的是一个在线生成器&#xff0c;然后标签用的黑月透明标签&#xff0c;加一个通用对话框读取图片…...

微服务概述

微服务架构是一种软件设计和开发范式&#xff0c;旨在将大型应用程序分解为一组小而独立的服务单元&#xff0c;这些单元可以独立开发、测试、部署和扩展。每个服务都专注于一个明确定义的业务功能&#xff0c;并通过轻量级的通信机制进行交互。以下是微服务架构的一些关键方面…...

LabVIEW中NIPackageManager功能介绍

LabVIEW中PackageManager功能介绍 使用NIPackage Manager可安装、更新、修复和删除NI软件。 安装NI软件 使用PackageManager浏览和安装NI软件。 1. 在浏览产品选项卡上&#xff0c;单击产品类别以显示该类别中的可用产品。 2. 选择要安装的产品&#xff0c;然后单击…...

【C语言】sem_getvalue

sem_getvalue 是 POSIX 线程库中用于获取信号量当前值的一个函数。信号量&#xff08;Semaphore&#xff09;是用于编程中的同步工具&#xff0c;用于管理多个线程或进程对共享资源的并发访问。通常用于限制可以同时访问共享资源的线程数量。函数 sem_getvalue 的声明通常出现在…...

Linux的shell的$# | fi | 说明

$# | fi | 说明 在Linux的Shell脚本中&#xff0c;$# 是一个特殊变量&#xff0c;表示传递给脚本的参数个数。 例如&#xff0c;如果你运行一个脚本并传递了三个参数&#xff0c;那么在脚本内部使用 $# 将会得到 3。这对于确定脚本在执行时接收到了多少个参数是非常有用的。以…...

C //例 7.12 用选择法对数组中10个整数按由小到大排序。

C程序设计 &#xff08;第四版&#xff09; 谭浩强 例 7.12 例 7.12 用选择法对数组中10个整数按由小到大排序。 IDE工具&#xff1a;VS2010 Note: 使用不同的IDE工具可能有部分差异。 代码块 方法&#xff1a;使用指针、动态分配内存 #include <stdio.h> #include …...

Spring Bean循环依赖问题及解决

什么是循环依赖 类与类之间的依赖关系形成了闭环&#xff0c;就会导致循环依赖问题的产生。举例来说&#xff0c;假设存在两个服务类A和服务类B&#xff0c;如果A通过依赖注入的方式引用了B&#xff0c;且B通过依赖注入的方式引用了A&#xff0c;那么A和B之间就存在循环依赖。…...

Golang源码分析 | 程序引导过程

环境说明 CentOS Linux release 7.2 (Final&#xff09; go version go1.16.3 linux/amd64 GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-80.el7使用gdb查看程序入口 编写一个简单的go程序 // main.go package mainfunc main() {print("Hello world") } 编译go …...

第三章:人工智能深度学习教程-基础神经网络(第四节-从头开始的具有前向和反向传播的深度神经网络 – Python)

本文旨在从头开始实现深度神经网络。我们将实现一个深度神经网络&#xff0c;其中包含一个具有四个单元的隐藏层和一个输出层。实施将从头开始&#xff0c;并实施以下步骤。算法&#xff1a; 1. 可视化输入数据 2. 确定权重和偏置矩阵的形状 3. 初始化矩阵、要使用的函数 4. 前…...

【入门Flink】- 08Flink时间语义和窗口概念

Flink-Windows 是将无限数据切割成有限的“数据块”进行处理&#xff0c;这就是所谓的“窗口”&#xff08;Window&#xff09;。 注意&#xff1a;Flink 中窗口并不是静态准备好的&#xff0c;而是动态创建——当有落在这个窗口区间范围的数据达到时&#xff0c;才创建对应的窗…...

【 OpenGauss源码学习 —— 列存储(CStore)(六)】

列存储&#xff08;CStore&#xff09;&#xff08;六&#xff09; 概述CStore::GetCUDataFromRemote 函数CStore::CheckConsistenceOfCUDescCtl 函数CStore::CheckConsistenceOfCUDesc 函数CStore::CheckConsistenceOfCUData 函数额外补充 声明&#xff1a;本文的部分内容参考…...

MUYUCMS v2.1:一款开源、轻量级的内容管理系统基于Thinkphp开发

MuYuCMS&#xff1a;一款基于Thinkphp开发的轻量级开源内容管理系统&#xff0c;为企业、个人站长提供快速建站解决方案。它具有以下的环境要求&#xff1a; 支持系统&#xff1a;Windows/Linux/Mac WEB服务器&#xff1a;Apache/Nginx/ISS PHP版本&#xff1a;php > 5.6 (…...

SDL2 显示文字

1.简介 SDL本身没有显示文字功能&#xff0c;它需要用扩展库SDL_ttf来显示文字。ttf是True Type Font的缩写&#xff0c;ttf是Windows下的缺省字体&#xff0c;它有美观&#xff0c;放大缩小不变形的优点&#xff0c;因此广泛应用很多场合。 使用ttf库的第一件事要从Windows的…...

c++ future 使用详解

c future 使用详解 std::future 头文件 #include <future>。 类模板&#xff0c;定义如下&#xff1a; template<class T> class future; template<class T> class future<T&>; template<> class future<void>;作用&#xff…...

好用的C C++ 日志宏 OutputDebugStringA 写到文件或界面

日志宏 #include <cstdio> #define OUTPUT_DEBUG_STRING(fmt, ...) do { \char szOutMsgFinal[10240] {0}; \std::snprintf(szOutMsgFinal, sizeof(szOutMsgFinal), "[%s|%d] " fmt "\n", __func__, __LINE__, ##__VA_ARGS__); \OutputDebugString…...

如何在ModelScope社区魔搭下载所需的模型

本篇文章介绍如何在ModelScope社区下载所需的模型。 若您需要在ModelScope平台上有感兴趣的模型并希望能下载至本地&#xff0c;则ModelScope提供了多种下载模型的方式。 使用Library下载模型 若该模型已集成至ModelScope的Library中&#xff0c;则您只需要几行代码即可加载…...

NLP在网安领域中的应用(初级)

NLP在网安领域的应用 写在最前面1. 威胁情报分析1.1 社交媒体情报分析&#xff08;后面有详细叙述&#xff09;1.2 暗网监测与威胁漏洞挖掘 2. 恶意软件检测2.1 威胁预测与趋势分析 3. 漏洞管理和响应4. 社交工程攻击识别4.1 情感分析与实时监测4.2 实体识别与攻击者画像构建4.…...

03.UDP套接字与原始套接字

UDP套接字 注意在UDP套接字中,要使用recvfrom和sendto API: recvfrom: 接收数据包,并存储源地址(UDP) 函数原型: int WSAAPI recvfrom([in] SOCKET s,[out] char *buf,[in] int len,[...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...