一个初入IC的硅农,硬件编程经验3个月。偶然接触了微信小程序编程,然后自己写了一个计算器,希望得到改进意见。

功能:

1、计算 - * /和%;

2、主要是当得出结果的时候,可以显示原来的数都是什么。用手机上的计算器都是一按等于号,我的两个操作数也没了,很烦。所以自己写的时候就在得到结果的时候操作数不变。

计算器样子就是下面这样子:

样子不太会设计,主要是js部分啦。

WXML代码

由于wxml的很多方法和属性我都还不太了解,所以有的设置方法可能显得繁琐。

<!--pages/caculator/caculator.wxml-->
<!-- 计算区 -->
<view class="caculatorArea">
  <!-- 显示数据与运算符 -->
  <view class="dataArea1">{{firstNum}}</view>
  <view class="dataArea2">{{operatorShow}}</view>
  <view class="dataArea3">{{secondNum}}</view>
  <!-- 显示结果 -->
  <view class="resultArea">result:   {{result}}</view>
</view>
<!-- 输入区 -->
<view class="inputArea">
<!-- 按键第一排 -->
  <view class="fstRaw">  
    <button class="clear" bindtap="clearEvent" data-value="C" >C</button>
    <button class="divide" bindtap="opEvent"  data-value="/">/</button>
    <button class="mutiply" bindtap="opEvent" data-value="*">*</button>
    <button class="back" bindtap="backEvent" data-value="←">←</button>
  </view>
  <!-- 按键第二排 -->
  <view class="secRaw">  
    <button class="seven" bindtap="numEvent" data-value="7">7</button>
    <button class="eight" bindtap="numEvent" data-value="8" >8</button>
    <button class="nine" bindtap="numEvent" data-value="9">9</button>
    <button class="minus" bindtap="opEvent" data-value="-">-</button>
  </view>
   <!-- 按键第三排 -->
   <view class="thdRaw">  
    <button class="four" bindtap="numEvent" data-value="4">4</button>
    <button class="five" bindtap="numEvent" data-value="5">5</button>
    <button class="six" bindtap="numEvent" data-value="6">6</button>
    <button class="plus" bindtap="opEvent" data-value=" "> </button>
  </view>
     <!-- 按键第四排 -->
  <view class="forRaw">   
    <button class="one" bindtap="numEvent" data-value="1">1</button>
    <button class="two" bindtap="numEvent"  data-value="2">2</button>
    <button class="three" bindtap="numEvent" data-value="3">3</button>
    <button class="equal" bindtap="opEvent" data-value="=">=</button>
  </view>
     <!-- 按键第五排 -->
  <view class="fifRaw">  
    <button class="abs" bindtap="opEvent" data-value="%">%</button>
    <button class="zero" bindtap="numEvent" data-value="0">0</button>
    <button class="dot" bindtap="dotEvent" data-value=".">.</button>
  </view>
</view>

js代码 

这个代码是真的让我快崩了,最后达到的效果,能跑就行。。由于软件的代码写的很少,所以在一些判断的时候显得很繁琐。比如如何区分目前输入的数字是属于第一个操作数还是第二个操作数(因为我想在两行显示数字,因此这就成了一个问题),我的办法是设置了一个flag,请问有没有知道更简单的方法的?

Page({
    data:{
      result:"",    
      firstNum:"", 
      secondNum:"",
      operatorUse:"",
      operatorShow:"",
    },
    var rst=""
    numFlag:true,
    optContinue:false,
    resultFlag:false,  //  结果标志位     1代表有结果,0代表没结果
    fstIsClear:true,      //  第一个数字是否清除标志位   1代表前面没数,0代表有数
    secIsClear:true,      //第二个数字是否清除的标志位   1代表前面没数,0代表有数
    numEvent(n){
        let numValue=n.currentTarget.dataset.value;
        if(this.resultFlag==true){         //如果得出了结果,并且按数字键的话,那么直接进行下一个计算,当前计算结束
            this.setData({
                firstNum:numValue,
                secondNum:"",
                secIsClear:true,
                operatorShow:"",
                operatorUse:"" 
            })
            this.resultFlag=false
        }else if(this.numFlag==true){     //如果此时没有按操作符,则归为第一个数   
            if(this.data.firstNum=="0"){  //假如第一个数现在是0,那么0不进行保存
                this.setData({
                    firstNum:numValue      
                  });
            }else{                 //如果第一个数不是0,那么进行拼接            
                this.setData({
                    firstNum:this.data.firstNum numValue      
                  });
                  this.fstIsClear=false;
            }}else{                          //如果此时已经按过操作符,则归为第二个数
               if(this.data.secondNum=="0"){//假如第二个数现在是0,那么0不进行保存
                  this.setData({
                    secondNum:numValue       
                });
            }else{               
                this.setData({
                    secondNum:this.data.secondNum numValue       
                });
                this.secIsClear=false;
            }
        }
    },
    opEvent(o){
        let optLast=this.data.operatorUse;
        let optCurrent=o.currentTarget.dataset.value;
        if(optCurrent!=null && this.data.secondNum=="" && this.data.fisrtdNum==""){
            this.numFlag=true; //都为空时,连续点击操作符不更换数字顺序
        }else if(optCurrent!=null && this.data.secondNum=="" && this.data.fisrtdNum!=""){
            if(optCurrent=="="){
                this.numFlag=true;
            }else{ 
            this.numFlag=false;//1有数2没数时,连续点击操作符,再次点击数字归为第二个
            }
        }
        else if(optCurrent!=null && this.data.secondNum!=""&& this.data.fisrtdNum!=""){ 
             if(optCurrent=="="){       
                 this.numFlag=!this.numFlag; //都不为空时,点击操作符后,数字绑定的顺序改变
             }else{
                this.numFlag=false;
             }
        }
        if(optLast=="="){
            this.setData({
                firstNum:rst, 
                secondNum:"",
                secIsClear:true,
                result:""   
              });
              this.resultFlag=false;
        }
        rst=Number(this.data.firstNum)     //将第一个数转换为数字类型
        var secNum=Number(this.data.secondNum)    //将第二个数转换为数字类型
 
        this.setData({
            operatorUse:optCurrent         //得到操作符,用于js判断
        });
        if(optCurrent=="="){               //得到操作符,用于wxml显示 
          if(optLast!="="){
            this.setData({
                operatorShow:optLast
            });  
        }else{
            this.setData({
                operatorShow:""
            });  
        }                 
        }else{
            this.setData({
                operatorShow:optCurrent
            })         
        }
        if(optLast==" "){                             //依据操作符进行操作
            rst=rst secNum;
        }else if(optLast=="-"){
            rst=rst-secNum ;   
        }else if(optLast=="*"){
            rst=rst*secNum;
        }else if(optLast=="/"){
            rst=rst/secNum;
        }else if(optLast=="%"){
            rst=rst%secNum;
        }      
        if(optCurrent=="="){          //当输入的操作符为=时,进行结果显示
            this.setData({
            result:rst
            })
            this.resultFlag=true
        }
        if(optCurrent!="=" && optLast!=""){
            this.setData({
                firstNum:rst, 
                secondNum:"",
                secIsClear:true,
                result:""   
              });
                this.resultFlag=false;  //表明此时有结果了
                this.optContinue=true;  //表明要进行连续计算了
        }
    },
    dotEvent(){
          if(this.numFlag==true){
              if(this.fstIsClear==true){
                this.fstIsClear==false 
                this.setData({
                    firstNum:"0."
                  });
              }else{                     //如果此前有数,则输入.为.
                if(this.data.firstNum.indexOf(".")>0){
                    return;
                }else{     
                    this.setData({
                    firstNum:this.data.firstNum "."
                });
            }
            }            
          }else{
             if(this.secIsClear==true){ 
                this.secIsClear==false 
               this.setData({
                  secondNum:"0."
              })
          }else{
              if(this.data.secondNum.indexOf(".")>0){
                  return;
              }else{
                  this.setData({
                  secondNum:this.data.secondNum "."
            })
        }
        }
    }
},
    backEvent(){
        var fstNumDel=0;
        var secNumDel=0;  
    if(this.resultFlag==true){
        return;
    }else{
      if(this.numFlag==true){
        fstNumDel=this.data.firstNum.substr(0,this.data.firstNum.length-1);
        this.setData({
            firstNum:fstNumDel
        });
        if(this.data.firstNum==""){
            this.fstIsClear=true;
        }
    }else{
        secNumDel=this.data.secondNum.substr(0,this.data.secondNum.length-1);
        this.setData({
            secondNum:secNumDel
        });
        if(this.data.secondNum==""){
            this.secIsClear=true;
        }
    }
    }
 
},
    clearEvent(){
      this.setData({
        firstNum:"",
        secondNum:"",
        operatorUse:"",
        operatorShow:"",
        result:""
      })
      this.numFlag=true;
      this.resultFlag=false;
      this.isClear=true;
      this.fstIsClear=true;
      this.secIsClear=true;
}
 
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持Devmax。

微信小程序实现简易的计算器功能的更多相关文章

  1. 微信小程序之html5 canvas绘图并保存到系统相册

    这篇文章主要介绍了微信小程序之html5 canvas绘图并保存到系统相册,需要的朋友可以参考下

  2. 微信小程序如何获取图片宽度与高度

    这篇文章主要给大家介绍了关于微信小程序如何获取图片宽度与高度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. 基于JavaScript实现网页计算器

    这篇文章主要为大家详细介绍了基于JavaScript实现网页计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  4. 微信小程序多项选择器checkbox

    这篇文章主要为大家详细介绍了微信小程序多项选择器checkbox,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. 微信小程序实现收缩式菜单

    这篇文章主要为大家详细介绍了微信小程序实现收缩式菜单,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  6. 微信小程序自定义状态栏

    这篇文章主要为大家详细介绍了微信小程序自定义状态栏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  7. 微信小程序实现简单的购物车功能

    这篇文章主要为大家详细介绍了微信小程序实现简单的购物车功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  8. js实现网页计算器

    这篇文章主要为大家详细介绍了js实现网页计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. 微信小程序实现手机号码验证

    这篇文章主要为大家详细介绍了微信小程序实现手机号码验证,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. 微信小程序预览二进制流文件的方法

    这篇文章主要为大家详细介绍了微信小程序预览二进制流文件的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部