鸿蒙Js实战,计算器功能开发

场景:

通过动态设置按钮组件button实现计算器的键盘,通过文本text显示计算的表达书,可以计算+,-,*,/,可以一个一个移除,可以重置 等。

下面我们开始今天的文章,还是老规矩,通过如下几点来说:

1,实现思路

2,代码解析

3,实现效果

3,总结

一,实现思路

计算器的键盘,本来是想使用grid的 但是有一些默认属性不好控制,等后续组件完善了在做优化,目前grid适合一些均衡布局,通过监听计算符号添加判断逻辑,计算结果也是通过添加的计算类型进行计算,目前支持一级计算,后面做连续计算。

二,代码解析

子组件:

1,hml文件

实用了四个for循环实现了键盘效果,后面想了一下其实一个就能搞定,动态换行就行,时间有限后续优化(总感觉计算器挺简单,其实做起来还需要点时间)

<div class="container"><text class="input-content">{{inputcontent}}</text><div class="menu-content"><div class="caluater" for="{{ caluater }}" ><button class="content" onclick="calculatorClick({{ $item.id }})">{{ $item.id }}</button></div></div><div class="menu-content"><div class="caluater" for="{{ caluater1 }}"><button class="content2" on:click="calculatorClick({{ $item.id }})">{{ $item.id }}</button></div></div><div class="menu-content"><div class="caluater" for="{{ caluater2 }}"><button class="content2" on:click="calculatorClick({{ $item.id }})">{{ $item.id }}</button></div></div><div class="list2-content"><div class="list3-content"><div class="list2-content"><div class="caluater" for="{{ caluater3 }}"><button class="content2" on:click="calculatorClick({{ $item.id }})">{{ $item.id }}</button></div></div><div class="list2-content"><div class="caluater" for="{{ caluater4 }}"><button class="content2" on:click="calculatorClick({{ $item.id }})">{{ $item.id }}</button></div></div></div><button class="equals" onclick="calculatorResult">=</button></div>
</div>

2,css文件

样式比较简单,主要控制键盘和表达式文本的颜色和大小

.container {flex-direction: column;justify-content: flex-end;align-items: flex-end;width: 100%;
}
.input-content{background-color: #00ffffff;text-align: right;font-size: 25px;padding: 10px;font-weight: bold;
}
.menu-content{width: 100%;background-color: brown;allow-scale: true;
}
.caluater {flex-direction: row;width: 100%;height: 70px;background-color: #00ffffff;margin-left: 5px;margin-right: 5px;margin-top: 10px;
}
.content{font-size: 30px;font-weight: bold;radius: 10px;width: 100%;height: 100%;text-color: #007EFF;background-color: #A8CCFB;
}
.content2{font-size: 30px;font-weight: bold;radius: 10px;width: 100%;height: 100%;text-color: #000000;background-color: #dddcdc;
}
.list2-content{flex-direction: row;justify-content: center;align-items: center;background-color: brown;
}
.list3-content{flex-direction: column;margin-bottom: 10px;
}
.equals{width: 30%;height: 150px;font-size: 30px;font-weight: bold;radius: 10px;margin-left: 5px;margin-right: 5px;
}

3,js文件

js中主要实现逻辑,请看具体计算的判断。

import prompt from '@system.prompt';
export default {data: {title: "",inputcontent: "",number1: "",number2: "",type: "",caluater: [{'id': "C",},{'id': "÷",},{'id': "×",},{'id': "←",}],caluater1:[{'id': "7",},{'id': "8",},{'id': "9",},{'id': "+",}],caluater2:[{'id': "4",},{'id': "5",},{'id': "6",},{'id': "-",}],caluater3:[{'id': "1",},{'id': "2",},{'id': "3",}],caluater4:[{'id': "%",},{'id': "0",},{'id': ".",}]},onInit() {},calculatorClick(result){this.inputcontent = this.inputcontent+"";let str = this.inputcontent.substring(this.inputcontent.length-1, this.inputcontent.length);switch(result) {case "←":if(this.inputcontent.length > 0) {let str = this.inputcontent.substring(0, this.inputcontent.length - 1);this.inputcontent = str;}break;case "C":this.inputcontent = "";break;case "+":this.calcula(str,result,"+");break;case "-":this.calcula(str,result,"-");break;case "×":this.calcula(str,result,"×");break;case "÷":this.calcula(str,result,"÷");break;case ".":if(this.inputcontent.length > 0 && str != ".") {this.inputcontent += result;}break;default:this.inputcontent += result;break;}},calcula(str,result,cla){if(this.inputcontent.length > 0 && str != "+" && str != "-" && str != "×" && str != "÷") {this.type = cla;this.inputcontent += result;} else {this.calculatorResult();}},calculatorResult(){// 计算结果var temp = this.inputcontent.split(this.type);console.log("this.inputcontent = "+this.inputcontent)let str = this.inputcontent.substring(this.inputcontent.length-1, this.inputcontent.length);console.log("this.type = "+this.type)if (this.type == "+") {  // 加法计算if(temp.length > 1) {console.log("temp = "+temp)var num1 = parseFloat(temp[0]);var num2 = parseFloat(temp[1]);console.log("num1 = "+num1)console.log("num2 = "+num2)console.log("str = "+str)if(str != "+") {this.inputcontent = num1 + num2;this.type = "";}}} else if(this.type == "-") {  // 减法计算if(temp.length > 1) {var num1 = parseFloat(temp[0]);var num2 = parseFloat(temp[1]);if(str != "-") {this.inputcontent = num1 - num2;this.type = "";}}} else if(this.type == "×") {  // 乘法计算if(temp.length > 1) {var num1 = parseFloat(temp[0]);var num2 = parseFloat(temp[1]);if(str != "×") {this.inputcontent = num1 * num2;this.type = "";}}} else if(this.type == "÷") {  // 除法计算if(temp.length > 1) {var num1 = parseFloat(temp[0]);var num2 = parseFloat(temp[1]);if(str != "÷") {this.inputcontent = num1 / num2;this.type = "";}}}}
}

为了目前的单一计算,现在做了不少的判断,后续做连续计算的时候会有改动,但是目前正常计算没有问题,期待后续更新。

三,实现效果

img

四,总结

开发计算器最主要的是连续计算,连续计算需要添加计算优先级逻辑,后续考虑通过遍历来判断里面的计算。

计算器界面开发通过常用组件就能实现,实现方式可以自己定。

在开发中验证了NaN,这个空的判断很多方式无效的,他是针对Number做的判断。

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

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

相关文章

tensorflow入门

一、怎样入手TensorFlow TensorFlow是一个用于机器学习和深度学习的开源框架&#xff0c;它提供了一种灵活的方式来构建和训练神经网络模型。以下是一些TensorFlow框架入门的建议&#xff1a; 学习Python语言&#xff1a;TensorFlow主要使用Python语言进行开发&#xff0c;因此…

Arma3/武装突袭3东风战役最后一关游戏无法保存的解决办法

Arma3这个游戏玩进去还是非常有可玩性的&#xff0c;可是在玩过了它本体自带的东风系列战役后&#xff0c;在最精髓的最后一关——game over这个关卡&#xff0c;却有个非常头疼的问题。 逃跑其实是非常简单的&#xff0c;但是想要无伤环游全岛确十分困难&#xff0c;因为这关卡…

Gitee基础知识

目录 1-gitee 1.1gitee介绍 1.2git与gitee的关系 1.3在国内为什么选择Gitee 2-注册与创建远程仓库 2.1注册 2.2创建远程仓库 2.3配置ssh公钥 2.3.1公钥的生成方法&#xff1a; 2.3.2 在gitee中配置公钥 2.3.4验证公钥 3-添加与推送远程仓库master 3.1基本命令…

Android vs. iOS:移动操作系统的对决

导言 Android和iOS作为两大主流移动操作系统&#xff0c;影响着数十亿用户的数字生活。Android和iOS&#xff0c;作为移动操作系统的巅峰代表&#xff0c;它们的竞争塑造了全球数十亿用户的数字化生活。本文将深入探讨这两个系统的起源、特点以及它们在用户体验、开发者生态和市…

用23种设计模式打造一个cocos creator的游戏框架----(二十)解析器模式

1、模式标准 模式名称&#xff1a;解析器模式 模式分类&#xff1a;行为型 模式意图&#xff1a;给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;这个解释器使用该表示来解释语言中的句子。 结构图&#xff1a; 适用于&#xff1…

02-knative-serving部署

示例环境 Kubernetes: v1.27.1Knative: v1.12networking layer: istio 可用的部署方式 基于YAML配置文档直接部署 Serving和Eventing需要分别进行部署 借助Knative Operator进行部署 首先部署Knative Operator通过Operator的KnativeServing部署Serving通过Operator的KnativeEv…

福德植保无人机工厂:创新科技与绿色农业的完美结合

亲爱的读者们&#xff0c;欢迎来到福德植保无人机工厂的世界。这里&#xff0c;科技与农业的完美结合为我们描绘出一幅未来农业的新篇章。福德植保无人机工厂作为行业的领军者&#xff0c;以其领先的无人机技术&#xff0c;创新的理念&#xff0c;为我们展示了一种全新的农业服…

在openSUSE-Leap-15.5-DVD-x86_64中使用deepin-wine-6.0.0.62再使用微信3.9.5

在openSUSE-Leap-15.5-DVD-x86_64中使用deepin-wine-6.0.0.62再使用微信3.9.5 参考文章&#xff1a; 《记录-下fedora 33安装deepin qq和微信 &#xff0c;不需要安装deepinwine》 https://tieba.baidu.com/p/7279470269 《opensuse使用virtualbox安装win10》 https://blog.c…

Linux---编辑器 vim

1. vim 的介绍 vim 是一款功能强大的文本编辑器&#xff0c;也是早年 Vi 编辑器的加强版&#xff0c;它的最大特色就是使用命令进行编辑&#xff0c;完全脱离了鼠标的操作。 2. vim 的工作模式 命令模式编辑模式末行模式 说明: vim 打开文件进入的是命令模式 工作模式效果…

Axure情形动作篇(ERP登录效验)

目录 一、ERP系统用户登录效验 1.1 完成步骤 1.2 最终效果 二、省市区联动 三、ERP菜单栏页面跳转 四、下拉加载效果实现 4.1 加载动画实现步骤 4.2 下划界面加载实现 4.3 最终效果 一、ERP系统用户登录效验 1.1 完成步骤 首先搭建ERP系统的登录界面&#xff08;输入…

Kafka 数据乱序

每个broker队列最多能缓存5个没有应答的请求&#xff1a; 发送数据1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5。发送到3的时候没有应答成功&#xff0c;要重发&#xff0c;结果4先过来了&#xff0c;就导致乱序。 解决&#xff1a;开启幂等性 max.in.flight.req…

lua语法

lua语法 1.lua数据类型 lua 脚本输出乱码&#xff0c;将lua脚本改为UTF-8编码&#xff0c;并且需要DOS下修改代码页&#xff1a;CHCP 65001 即可。 基本语法 注释 print("script lua win")-- 单行注释--[[多行注释]]--标识符 类似于&#xff1a;java当中 变量、…