知识点:

wxml:

hover-class: 实现点击态效果 hover-class样式显示的原理是 点击时把样式加到class的样式中,冲突时,谁在后面就显示谁!

data-val: 用于传数据,e.target.dataset.val调用

js:

Number()会得到数字(整数,小数)或者NaN; parseInt()会得到 整数或者NaN,不会有小数的情况

stringObject.substr(start,length):substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。

string.indexOf("ABC"):返回大于等于0的整数值则表示包含此字符串,若不包含则返回-1

index.wxml:

<!--index.wxml-->
<view class="result">
<view class="result-num">{{num}}</view>
<view class="result-op">{{op}}</view>
</view> <view class="btns">
<view>
<!-- hover-class,实现点击态效果
hover-class样式显示的原理是 点击时把样式加到class的样式中,冲突时,谁在后面就显示谁!
data-val:用于传数据,e.target.dataset.val调用
-->
<view hover-class="bg" bindtap="resultBtn">C</view>
<view hover-class="bg" bindtap="delBtn">DEL</view>
<view hover-class="bg" bindtap="opBtn" data-val="%">%</view>
<view hover-class="bg" bindtap="opBtn" data-val="/">÷</view>
</view>
<view>
<view hover-class="bg" bindtap="numtBtn" data-val="7">7</view>
<view hover-class="bg" bindtap="numtBtn" data-val="8">8</view>
<view hover-class="bg" bindtap="numtBtn" data-val="9">9</view>
<view hover-class="bg" bindtap="opBtn" data-val="*">×</view>
</view>
<view>
<view hover-class="bg" bindtap="numtBtn" data-val="4">4</view>
<view hover-class="bg" bindtap="numtBtn" data-val="5">5</view>
<view hover-class="bg" bindtap="numtBtn" data-val="6">6</view>
<view hover-class="bg" bindtap="opBtn" data-val="-">-</view>
</view>
<view>
<view hover-class="bg" bindtap="numtBtn" data-val="1">1</view>
<view hover-class="bg" bindtap="numtBtn" data-val="2">2</view>
<view hover-class="bg" bindtap="numtBtn" data-val="3">3</view>
<view hover-class="bg" bindtap="opBtn" data-val="+">+</view>
</view>
<view>
<view hover-class="bg" bindtap="numtBtn" data-val="0">0</view>
<view hover-class="bg" bindtap="dotBtn">.</view>
<view hover-class="bg" bindtap="opBtn" data-val="=">=</view>
</view>
</view>

index.wxss

/**index.wxss**/
/* 上下切分 */
page{ display: flex; /* 弹性布局 */
flex-direction: column; /* 设置子元素的排列方向 */
height: 100%;
}
.result{
flex: 1;
background: #f3f6fe;
}
.btns{
flex: 1;
}
/* ---------------------------------------- */ /* 键盘样式 */
.bg{
background:#eee;
}
.btns{
flex: 1;
display: flex;
flex-direction: column;
font-size: 17pt;
border-top: 1rpx solid #ccc;
border-left: 1rpx solid #ccc;
}
.btns > view{ /* 这里的view纵向排列*/
flex: 1;
display: flex; /* 设置为弹性布局 */
}
.btns > view > view{ /* 这里的view横向排列*/
flex-basis: 25%; /*flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。*/
border-right: 1rpx solid #ccc;
border-bottom: 1rpx solid #ccc;
box-sizing: border-box;
display: flex;
align-items: center; /* 垂直居中 */
justify-content: center; /* 水平居中 */
}
.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;
}
/* ------------------------------ */ /* 显示器样式 :数字、运算符显示的位置*/
.result{
flex: 1;
background: #f3f6fe;
position: relative;
}
.result-num{
position: absolute;
font-size: 27pt;
bottom: 5vh;
right: 3vw;
}
.result-op{
font-size: 20pt;
position: absolute;
bottom: 1vh; /* vh:视窗高度,1vh等于视窗高度的1% ; 视窗高度固定为100vh*/
right: 3vw; /* vw 视窗宽度,1vw等于视窗宽度的1% ; 视窗宽度度固定为100wh*/
}

index.json

{
"navigationBarBackgroundColor":"#fff",
"navigationBarTitleText":"计算器",
"navigationBarTextStyle":"black",
"usingComponents": {}
}

index.js

// index.js
// 获取应用实例
const app = getApp() Page({
data: {
num:"1",
op:"+"
}, result:null,
isClear:false, /*true:替换当前数字 false:新数字接在当前数字末尾 */ numtBtn:function(e){
var num = e.target.dataset.val if(this.data.num == '0' || this.isClear){
// 数字替换
this.setData({num:num})
this.isClear = false
}else{
// 数字拼接
this.setData({num:this.data.num + num})
}
}, opBtn:function(e){
var op = this.data.op //取出用户上一次输入的运算符
var num = Number(this.data.num) //Number()会得到数字(整数,小数)或者NaN; parseInt()会得到 整数或者NaN,不会有小数的情况
this.setData({op:e.target.dataset.val}) // 赋值这一次用户输入的运算符
if(this.isClear){
return
}
this.isClear = true if(this.result == null){
this.result = num
return
} if(op == '+'){
this.result = this.result + num
}else if(op == '-'){
this.result = this.result - num
}else if(op == '*'){
this.result = this.result * num
}else if(op == '/'){
this.result = this.result / num
}else if(op == '%'){
this.result = this.result % num
}
this.setData({num:this.result + ''}) // 数字转换为字符串
}, dotBtn:function(){
if(this.isClear){
this.setData({num:'0.'})
this.isClear = false
return
}
if(this.data.num.indexOf('.') >= 0){ //string.indexOf("ABC"):返回大于等于0的整数值则表示包含此字符串,若不包含则返回-1
return
}
this.setData({num:this.data.num + '.'})
}, delBtn: function(){
// stringObject.substr(start,length) :substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。
var num = this.data.num.substr(0, this.data.num.length - 1)
this.setData({num:num == '' ? '0' : num})
}, resultBtn: function(){
this.result = null
this.isClear = false
this.setData({num: '0', op:''})
}, })

效果

微信小程序——计算器的更多相关文章

  1. 微信小程序计算器Bug版=-=(笔记)

    微信小程序计算器BUG版本 无APPID的测试号登录,先在app.json中更改路径,以及修改头部信息. 首先一个输入框字段用{{screenData}} 功能可以退格,清屏,正负号,正常操作加减乘除 ...

  2. 微信小程序计算器后后续

    改的眼睛都要瞎了,总算是知道问题出哪了 最后一段 在等号里面计算输入的数组,这个判断的主要操作是将输入的数据的数组进行数和符号的拆分然后再计算,把数按字符串输入数组,然后将数和符号进行拆分 ,最后通过 ...

  3. 微信小程序计算器模拟后续

    今天按着自己的思路又重打了一遍 wxml没什么说的,就是分块起名,显示数字和结果的作为屏幕,数字键盘一行四块 <view class="onTop"> <view ...

  4. 近期热门微信小程序demo源码下载汇总

    近期微信小程序demo源码下载汇总,乃小程序学习分析必备素材!点击标题即可下载: 即速应用首发!原创!电商商场Demo 优质微信小程序推荐 -秀人美女图 图片下载.滑动翻页 微信小程序 - 新词 GE ...

  5. 剖析简易计算器带你入门微信小程序开发

    写在前面,但是重点在后面 这是教程,也不是教程. 可以先看Demo的操作动图,看看是个什么玩意儿,GitHub地址(https://github.com/dunizb/wxapp-sCalc) 自从微 ...

  6. 微信小程序开发(2) 计算器

    在这篇微信小程序开发教程中,我们将介绍如何使用微信小程序开发计算器功能. 本文主要分为两个部分,小程序主体部分及计算器业务页面部分 一.小程序主体部分 一个小程序主体部分由三个文件组成,必须放在项目的 ...

  7. 微信小程序-简易计算器

    代码地址如下:http://www.demodashi.com/demo/14210.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...

  8. 强力推荐微信小程序之简易计算器,很适合小白程序员

    原文链接:https://mp.weixin.qq.com/s/gYF7GjTRpeZNoKPAPI9aXA 1 概述 前几日QQ群里的朋友问我有没有计算器小程序案例,今天我们说下小程序计算器,然后就 ...

  9. 微信小程序开发简易计算器改进版

    微信小程序开发计算器有多种方法,但是大部分代码比较复杂.不容易理解.本案例进行了改进,主要是组件bindtap属性绑定的自定义函数clickBtn(),采用了switch语句,使得代码结构更加清晰,学 ...

  10. 微信小程序入门学习-- 简易Demo:计算器

    简单学习下微信小程序 官网 简易教程 · 小程序 https://mp.weixin.qq.com/debug/wxadoc/dev/ 需要通过开发者工具,来完成小程序创建和代码编辑. 下载安装,运行 ...

随机推荐

  1. Hadoop批处理方案 和 MPP架构方案 作为数据仓库的区别

    1,原理对比 MPP方案中的数据通常在节点之间拆分(分片),每个节点仅处理其本地数据.而且,每家都有专门为 MPP 解决方案开发的复杂而成熟的 SQL 优化器.它们都可以在内置语言和围绕这些解决方案的 ...

  2. java NIO原理和代码实践

    一,先说java IO 1,线程阻塞:当线程调用write()或read()时,线程会被阻塞,直到有一些数据可用于读取或数据被完全写入. 2,面向流: 我们需要从流中读取一个或多个字节.它使用流来在数 ...

  3. spring@Validated校验用法

    1.controller添加注解 public BaseResponse addOrUpdateUnit(@RequestBody @Validated RiskUnitDto riskUnitDto ...

  4. PyTorch之初级使用

    使用流程①. 数据准备; ②. 模型确立; ③. 损失函数确立; ④. 优化器确立; ⑤. 模型训练及保存 模块介绍Part Ⅰ: 数据准备torch.utils.data.Dataset torch ...

  5. 003 jmeter连接数据库及jmeter关联提取器

    1.jmeter连接数据库 测试计划-->线程组-->在线程组上右键-添加-配置元件-JDBC Connection Configuration-->在线程组上右键-添加-取样器-J ...

  6. [部署日记]Android Studio在同步Gradle的时候提示Could not resolve com.android.tools.build:gradle:7.0.4

    一波未平一波又起,好家伙直呼好家伙. 问题来源: 在想好APP起什么名字,放哪里后,打开模拟器准备着手处理时发现, Gradle sync出问题了... "Build"窗口提示: ...

  7. 并发多线程学习(五)Java线程的状态及主要转化方法

    1 操作系统中的线程状态转换 首先我们来看看操作系统中的线程状态转换. 在现在的操作系统中,线程是被视为轻量级进程的,所以操作系统线程的状态其实和操作系统进程的状态是一致的. 操作系统线程主要有以下三 ...

  8. c语言动态库与静态库

    // show.h #ifndef __SHOW_H_ #define __SHOW_H_ #include <stdio.h> #include "math.h" v ...

  9. cookie、session入门

    一.cookie是由http制定的 二.使用方法 1.原始方法 使用request接受Cookies请求头 使用response发送set-Cookies响应头 2.常用方法 response.add ...

  10. 2.9 系统IO

    iostream: 输入流 cin; c 指代 character 输出流 cout, cerr(立即刷新缓冲区), clog(缓冲区满后刷新) 命名空间 访问方式 namespace NameSpa ...