当前位置: 首页 > 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,[...

弯管LRA计算软件(XYZ转LRA)

专业的“弯管LRA计算软件&#xff08;XYZ转LRA&#xff09;”&#xff0c;主要用于将弯管在三维空间中的一系列坐标点&#xff08;XYZ&#xff09;&#xff0c;转换为管道加工所需的关键制造参数&#xff0c;即LRA&#xff08;直线段长度、旋转角度、弯曲夹角&#xff09;。界面…...

从需求到原型自动生成!传统产品经理升级AI产品架构师的智能化研发工作流

在人工智能技术深度渗透各行业的今天&#xff0c;产品研发领域正经历颠覆性变革——传统“需求调研→文档撰写→原型绘制→评审修改”的线性研发模式&#xff0c;已难以适配数字化时代“快速迭代、精准落地”的核心需求。与此同时&#xff0c;聚焦人工智能技能培养与评估的CAIE…...

实时控制循环示例

LCC-S无线电能传输pi移相控制输出电压&#xff0c;效果很棒 SS结构&#xff0c;与其他低阶高阶拓扑也可以做 SS拓扑最近在捣鼓无线电能传输系统时&#xff0c;意外发现LCC-S拓扑搭配π型移相控制&#xff0c;输出效果堪比美颜相机里的磨皮功能。这货不仅能把输出电压纹波压得比…...

ICLR 2026 | 大模型当裁判也“翻车“?北大清华联合多校提出TrustJudge,让LLM评估更值得信赖

让 GPT-4 给两篇文章打分&#xff0c;A 拿了 4 分、B 拿了 3 分。按常理 A 应该比 B 好吧&#xff1f;但换成成对比较&#xff0c;同一个模型却说 "B 更好"。更离谱的情况也有——A > B > C > A 的"石头剪刀布"循环&#xff0c;连传递性都守不住。…...

支持向量机避坑指南:当你的SVM分类效果差时该检查这5个参数

支持向量机避坑指南&#xff1a;当你的SVM分类效果差时该检查这5个参数 在机器学习实践中&#xff0c;支持向量机&#xff08;SVM&#xff09;因其出色的分类性能而广受欢迎&#xff0c;但许多开发者在调参过程中常常陷入困境。本文将深入剖析影响SVM性能的五大关键参数&#x…...

终极指南:raylib轻量级游戏开发库的快速上手与实战应用

终极指南&#xff1a;raylib轻量级游戏开发库的快速上手与实战应用 【免费下载链接】raylib A simple and easy-to-use library to enjoy videogames programming 项目地址: https://gitcode.com/GitHub_Trending/ra/raylib raylib是一个简单易用的游戏编程库&#xff0…...

30 分钟搞定答辩 PPT!Paperxie AI 神器,终结本科生的熬夜改稿噩梦

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AIPPThttps://www.paperxie.cn/ppt/createhttps://www.paperxie.cn/ppt/create 一、答辩 PPT&#xff0c;真的没必要熬到凌晨三点 “论文终于写完了&#xff01;”—— 当你以为能松口气时&#xff0c;答辩…...

赛马娘DMM版汉化优化终极指南:三分钟打造完美中文体验

赛马娘DMM版汉化优化终极指南&#xff1a;三分钟打造完美中文体验 【免费下载链接】umamusume-localify Localify "ウマ娘: Pretty Derby" DMM client 项目地址: https://gitcode.com/gh_mirrors/um/umamusume-localify 还在为赛马娘DMM版的日文界面而头疼吗&…...

汽车电子开发必看:OBD接口中的CAN总线实战指南(附STM32代码)

汽车电子开发实战&#xff1a;OBD接口CAN总线通信与STM32应用解析 1. 汽车电子开发者的CAN总线技术入门 在汽车电子开发领域&#xff0c;CAN总线技术已经成为现代车辆通信系统的核心支柱。这种可靠的串行通信协议最初由博世公司在1980年代开发&#xff0c;专门用于解决汽车内部…...

NDI技术完全上手指南:从原理到实践的6步进阶之路

NDI技术完全上手指南&#xff1a;从原理到实践的6步进阶之路 【免费下载链接】obs-ndi DistroAV (formerly OBS-NDI): NDI integration for OBS Studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-ndi 网络视频传输技术正在重塑内容创作的方式&#xff0c;而NDI&…...