微信小程序案例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

(五)实现页面逻辑

(六)特殊情况处理

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uni-app点击按钮弹出提示框-uni.showModal(OBJECT),选择确定和取消

参考文档&#xff1a; https://uniapp.dcloud.io/api/ui/prompt?idshowmodal 显示模态弹窗&#xff0c;可以只有一个确定按钮&#xff0c;也可以同时有确定和取消按钮。类似于一个API整合了 html 中&#xff1a;alert、confirm。 uni.showModal({title: 提示,content: 这是一…

【优化版】DOSBox及常用汇编工具的详细安装教程

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、图解数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. dosbox的介绍、下载和安装1.1 dosbos简介1.2 dosbox的下载1.2.1 方式一&a…

SparkSQL之Analyzed LogicalPlan生成过程

经过AstBuilder的处理&#xff0c;得到了Unresolved LogicalPlan。该逻辑算子树中未被解析的有UnresolvedRelation和UnresolvedAttribute两种对象。Analyzer所起到的主要作用就是将这两种节点或表达式解析成有类型的&#xff08;Typed&#xff09;对象。在此过程中&#xff0c;…

Django路由层

路由层&#xff08;urls&#xff09; Django的路由层是负责将用户请求映射到相应的视图函数的一层。在Django的MVT架构中&#xff0c;路由层负责处理用户的请求&#xff0c;然后将请求交给相应的视图函数进行处理&#xff0c;最后将处理结果返回给用户。 在Django中&#xff0c…

基于springboot+vue的学生毕业离校信息网站

项目介绍 该学生毕业离校系统包括管理员、学生和教师。其主要功能包括管理员&#xff1a;首页、个人中心、学生管理、教师管理、离校信息管理、费用结算管理、论文审核管理、管理员管理、留言板管理、系统管理等&#xff0c;前台首页&#xff1b;首页、离校信息、网站公告、留…

初探地理编码(2023.11.12)

地理编码相识 2023.11.12 引言1、地理编码简介2、地理编码API和服务&#xff08;解决方案供应商 / 厂商&#xff09;2.1 高德2.2 百度2.3 超图2.4 天地图2.5 ArcGIS2.6 MapBox2.7 Cesium2.8 MapLocation 3、python实例3.1 pip安装依赖库&#xff08;python 3.6&#xff09;3.2 …

Hive 知识点八股文记录 ——(一)特性

Hive通俗的特性 结构化数据文件变为数据库表sql查询功能sql语句转化为MR运行建立在hadoop的数据仓库基础架构使用hadoop的HDFS存储文件实时性较差&#xff08;应用于海量数据&#xff09;存储、计算能力容易拓展&#xff08;源于Hadoop&#xff09; 支持这些特性的架构 CLI&…

【计算机网络】VRRP协议理论和配置

目录 1、VRRP虚拟路由器冗余协议 1.1、协议作用 1.2、名词解释 1.3、简介 1.4、工作原理 1.5、应用实例 2、 VRRP配置 2.1、配置命令 2.2、拓扑与配置&#xff1a; 1、VRRP虚拟路由器冗余协议 1.1、协议作用 虚拟路由冗余协议(Virtual Router Redundancy Protocol&am…

北邮22级信通院数电:Verilog-FPGA(9)第九周实验(2)实现下降沿触发的JK触发器(带异步复位和置位功能)

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 JK.v module JK (input clk,input J,input K,input…

基于SSM的考研图书电子商务平台的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

ChatGPT+Roblox,元宇宙的AI叙事逻辑#Leveling Up

MixCopilot 嗨&#xff0c;亲爱的听众朋友们&#xff01;欢迎收听我们的播客节目&#xff01;我是你们的主播&#xff1a;MixCopilot 混合副驾。今天我们要为大家带来的是我们的AI革命系列节目之一。这个系列节目聚焦于AI领域的一些最有影响力的建设者&#xff0c;他们将会讨论…

【C语言 | 预处理】C语言预处理详解(一) —— #define、#under、#if、#else、#elif、#endif、#include、#error

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

汇编与反汇编

程序处理的4个步骤 我们的第一个LED程序涉及两个文件&#xff1a;start.S、main.c&#xff0c;它们的处理过程如下&#xff1a; 对于汇编程序&#xff0c;经过汇编之后&#xff0c;转换成目标文件&#xff08;里面包含机器码&#xff09;。对于C程序&#xff0c;经过预处理之…

前端---CSS的样式汇总

文章目录 CSS的样式元素的属性设置字体设置文字的粗细设置文字的颜色文本对齐文本修饰文本缩进行高设置背景背景的颜色背景的图片图片的属性平铺位置大小 圆角矩形 元素的显示模式行内元素和块级元素的转化弹性布局水平方向排列方式&#xff1a;justify-content垂直方向排序方式…

人工智能基础_机器学习023_理解套索回归_认识L1正则---人工智能工作笔记0063

然后上一节我们说了L1,L2正则是为了提高,模型的泛化能力, 提高泛化能力,实际上就是把模型的公式的w,权重值,变小对吧. 然后我们这里首先看第一个L1正则,是怎么做到把w权重变小的 可以看到最上面是线性回归的损失函数,然后 L1可以看到,这个正则,就是在损失函数的基础上给损失…

sqli-labs关卡14(基于post提交的双引号闭合的报错注入)通关思路

文章目录 前言一、回顾上一关知识点二、靶场第十四关通关思路1、判断注入点2、爆显位3、爆数据库名4、爆数据库表5、爆数据库列6、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不…

C语言 每日一题 牛客网 11.13 Day17

找零 Z国的货币系统包含面值1元、4元、16元、64元共计4种硬币&#xff0c;以及面值1024元的纸币。 现在小Y使用1024元的纸币购买了一件价值为N(0 < N≤1024)的商品&#xff0c;请问最少他会收到多少硬币&#xff1f; 思路 运用if语句进行判断分类 代码实现 int main() {…

11.13 牛客刷题8/10

11.13 信号完整性 指针地址 的加减&#xff0c;注意 最后转为16进制

ElasticSearch文档分析

ElasticSearch文档分析 包含下面的过程&#xff1a; 将一块文本分成适合于倒排索引的独立的 词条将这些词条统一化为标准格式以提高它们的“可搜索性”&#xff0c;或者 recall 分析器执行上面的工作。分析器实际上是将三个功能封装到了一个包里&#xff1a; 字符过滤器 首先&a…

Go的优雅退出

Go优雅退出/停机以前主要通过signal来实现&#xff0c;当然现在也是通过signal来实现&#xff0c;只是从go 1.16开始&#xff0c;新增了更加友好的API: func NotifyContext(parent context.Context, signals ...os.Signal) (ctx context.Context, stop context.CancelFunc) 该…