首页 / 行业
开发一个鸿蒙版仿苹果计算器教程.附代码
2021-10-11 14:17:00
众所周知鸿蒙 JS 框架是非常轻量级的 MVVM 模式。通过使用和 Vue2 相似的属性劫持技术实现了响应式系统。
学习鸿蒙很长时间了,想写一个 demo 进行练练手,就选择开发这个仿苹果计算器程序。
先看效果图:话不多说,上代码
hml:<divclass="container"><divclass="header"><textclass="{{outputClassName}}">{{output}}text>div><divclass="keyboard"><blockfor="{{keyArr}}"><divif="{{$item=='0'}}"class="zeroKeys"onclick="onclickNubmer({{$item}})"><text>{{$item}}text>div><divelif="{{$item=='AC'||$item=='+/-'||$item=='%'}}"class="operatorKeys-top"onclick="onclickOper({{$item}})"><text>{{$item}}text>div><divelif="{{$item=='÷'||$item=='×'||$item=='-'||$item=='+'||$item=='='}}"class="operatorKeys-right"onclick="onclickOper({{$item}})"><text>{{$item}}text>div><divelseclass="keyskeys-nubmer"onclick="onclickNubmer({{$item}})"><text>{{$item}}text>div>block>div>div>
css:
.container{flex-direction:column;background-color:#010101;height:100%;width:100%;}.header{height:36%;width:100%;align-items:flex-end;padding:2px20px2px10px;}.keyboard{height:64%;width:100%;padding:2px10px;flex-wrap:wrap;}.outputText,.outputTextSmall{width:100%;height:100px;color:#FFFFFF;text-align:end;}.outputText{font-size:80px;}.outputTextSmall{font-size:58px;}.keys,.zeroKeys,.operatorKeys-top,.operatorKeys-right{width:74px;height:74px;justify-content:center;align-items:center;border-radius:74px;margin:10px5px;}.keys-nubmer,.zeroKeys{background-color:#333333;}.zeroKeys{width:158px;}.operatorKeys-top{background-color:#a4a4a4;}.operatorKeys-right{background-color:#f79f31;}.keys:active,.zeroKeys:active{background-color:#737373;}.keystext,.zeroKeystext,.operatorKeys-righttext{font-size:42px;color:#FFFFFF;}.operatorKeys-toptext{font-size:36px;color:#010101;}.operatorKeys-top:active{background-color:#d9d9d9;}.operatorKeys-right:active{background-color:#f5c891;}
js:
import{math}from"../../common/js/utils.js";exportdefault{data:{output:"0",outputClassName:"outputText",cache:[],//记录输入内容keyArr:["AC","+/-","%","÷","7","8","9","×","4","5","6","-","1","2","3","+","0",".","="],reOper:"",//记录点击的运算符reStr1:"",//记录第一次输入内容reStr2:"",//记录点击运算符后的内容bool:false//防止第二次输入内容时内容清空},onInit(){this.$watch("output","watchOutPut")},onclickOper(item){if(item=="AC"){this.clearComput();}elseif(item=="+"||item=="-"||item=="×"||item=="÷"){this.reOper=item;this.reStr1=this.output;if(this.cache.length>0){this.startCompute();}this.cache.push(this.reStr1);}elseif(item=="+/-"){this.output="-"+this.output;}elseif(item=="%"){this.output=math.accDiv(this.output,100);}elseif(item=="="){this.reStr2=this.output;this.cache.push(this.reStr2);this.startCompute();}},onclickNubmer(item){if(this.cache.length>0&&!this.bool){this.output="0";this.bool=true;}if(this.output=="0"&&item!="."){this.output=item;}elseif(item=="."){if(this.output.indexOf(".")==-1){if(this.output=="0"){this.output="0."}else{this.output+=item;}}}else{if(this.output.length< 10){this.output+=item;}}},watchOutPut(nVal){if(nVal.length>7&&nVal.length< 10){this.outputClassName="outputTextSmall";}else{this.outputClassName="outputText";}},startCompute(){switch(this.reOper){case"+":this.output=math.accAdd(this.reStr1,this.reStr2);this.reStr1=this.output;break;case"-":this.output=math.accSub(this.reStr1,this.reStr2);this.reStr1=this.output;break;case"×":this.output=math.accMul(this.reStr1,this.reStr2);this.reStr1=this.output;break;case"÷":this.output=math.accDiv(this.reStr1,this.reStr2);this.reStr1=this.output;break;default:break;}},clearComput(){this.output="0";this.reOper="";this.reStr1="";this.reStr2="";this.cache=[];this.bool=false;}}
utils.js:
classMathCalss{//js精准除法函数accDiv(arg1,arg2){lett1=0,t2=0,r1,r2;try{t1=arg1.toString().split('.')[1].length;}catch(e){}try{t2=arg2.toString().split('.')[1].length;}catch(e){}r1=Number(arg1.toString().replace('.',''));r2=Number(arg2.toString().replace('.',''));return(r1/r2)*Math.pow(10,t2-t1);}//js精准加法函数accAdd(arg1,arg2){varr1,r2,m,c;try{r1=arg1.toString().split(".")[1].length;}catch(e){r1=0;}try{r2=arg2.toString().split(".")[1].length;}catch(e){r2=0;}c=Math.abs(r1-r2);m=Math.pow(10,Math.max(r1,r2));if(c>0){varcm=Math.pow(10,c);if(r1>r2){arg1=Number(arg1.toString().replace(".",""));arg2=Number(arg2.toString().replace(".",""))*cm;}else{arg1=Number(arg1.toString().replace(".",""))*cm;arg2=Number(arg2.toString().replace(".",""));}}else{arg1=Number(arg1.toString().replace(".",""));arg2=Number(arg2.toString().replace(".",""));}return(arg1+arg2)/m;}//js精准减法函数accSub(arg1,arg2){letr1,r2,m,n;try{r1=arg1.toString().split('.')[1].length;}catch(e){r1=0;}try{r2=arg2.toString().split('.')[1].length;}catch(e){r2=0;}m=Math.pow(10,Math.max(r1,r2));//动态控制精度长度n=r1>=r2?r1:r2;return(arg1*m-arg2*m)/m;}//js精准乘法函数accMul(arg1,arg2){varm=0,s1=arg1.toString(),s2=arg2.toString();try{m+=s1.split(".")[1].length;}catch(e){}try{m+=s2.split(".")[1].length;}catch(e){}returnNumber(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m);}}exportvarmath=newMathCalss();
为了解决浮点数计算失准问题,我使用一些解决计算失准的函数可供大家参考。编辑:jq
最新内容
手机 |
相关内容
半导体主控技术:驱动自动驾驶革命的
半导体主控技术:驱动自动驾驶革命的引擎,自动驾驶,交通,自动驾驶系统,数据,车辆,自动,随着科技的不断进步,自动驾驶技术已经成为现实晶振在激光雷达系统中的作用
晶振在激光雷达系统中的作用,作用,系统,激光雷达,晶振,可靠性,选择,激光雷达(Lidar)是一种利用激光进行测距的技术,广泛应用于自动驾驶Arbe 4D成像雷达以高分辨率雷达技
Arbe 4D成像雷达以高分辨率雷达技术和先进处理技术消除“幽灵刹车”问题,刹车,成像,分辨率,系统,目标,数据,Arbe 4D成像雷达是一种浅析动力电池熔断器的基础知识及选
浅析动力电池熔断器的基础知识及选型,动力电池,时切,系统安全,作用,产品,系统,BA4558F-E2动力电池熔断器是用于保护动力电池系统安工业物联网数据采集:从Modbus到MQTT
工业物联网数据采集:从Modbus到MQTT,数据采集,物联网,模式,网关,协议,数据,工业物联网(Industrial Internet of Things,IIoT)的核心任务所有遥不可及,终因AI触手可及
所有遥不可及,终因AI触手可及,出行,平台,无人驾驶汽车,导致,人工智能,学习,人类历史上,有许多事物曾被认为是遥不可及的,然而随着科技黑芝麻智能助力亿咖通科技旗下首款
黑芝麻智能助力亿咖通科技旗下首款智能驾驶计算平台成功量产交付,智能驾驶,计算,助力,首款,交付,智能,近年来,智能驾驶技术逐渐成为硅谷:设计师利用生成式 AI 辅助芯片
硅谷:设计师利用生成式 AI 辅助芯片设计,芯片,生成式,硅谷,优化,修改,方法,在硅谷,设计师们正在利用生成式人工智能(AI)来辅助芯片设计