鸿蒙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.mzph.cn/news/230221.shtml

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

相关文章

【网络安全】-Linux操作系统基础

文章目录 Linux操作系统目录结构Linux命令格式Linux文件和目录操作命令Linux用户和用户组操作命令Linux查看和操作文件内容命令Linux文件压缩和解压缩命令Linux网络管理命令Linux磁盘管理和系统状态命令Linux安全加固总结 Linux是一个强大的操作系统&#xff0c;广泛用于服务器…

HarmonyOS 4应用开发:1.从环境搭建到Hello World

在踏上HarmonyOS应用开发之旅之前&#xff0c;需要进行一些必要的准备工作。首先&#xff0c;你需要下载并安装DevEco Studio&#xff0c;并进行相应的环境配置。 一、下载和安装DevEco Studio 前往DevEco Studio官方的下载地址&#xff0c;点击“立即下载”跳转至下载页面。…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)控件的部分公共属性和事件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;控件的部分公共属性和事件 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、公共属性 常用的公共属性有&#xff1a; 宽(with)、高(height)、…

深度学习记录--随机初始化

权重 权重&#xff0c;指的是变量系数w&#xff0c;决定了变量的变化率 它会改变dw&#xff0c;进而改变下一轮的w(改变更新) 神经网络的权重 对于神经网络(含隐藏层) 由于权重的对称性&#xff0c;我们的隐层的神经单元输出始终不变&#xff0c;出现隐藏神经元的对称性 …

WPF 显示PDF、PDF转成图片

1.NuGet 安装 O2S.Components.PDFView4NET.WPF 2.添加组件 工具箱中&#xff0c;空白处 右键&#xff0c;选择项 WPF组件 界面&#xff0c;选择NuGet安装库对面路径下的 O2S.Components.PDFView4NET.WPF.dll 3.引入组件命名空间&#xff0c;并使用 <Windowxmlns"htt…

antd-table:通过rowClassName实现斑马条纹样式+通过rowSelection实现单选功能效果——基础积累

斑马条纹 对于element-ui是有个stripe斑马条纹的属性的&#xff0c;最终呈现的效果如下&#xff1a; antd-table中是没有这个属性的&#xff0c;但是可以通过rowClassName&#xff1a;可以给对应行添加指定类名。 实现方法&#xff1a; <a-table:rowClassName"getRo…

每日一练2023.12.18——天梯赛的善良【PTA】

题目链接&#xff1a;L1-079 天梯赛的善良 题目要求&#xff1a; 天梯赛是个善良的比赛。善良的命题组希望将题目难度控制在一个范围内&#xff0c;使得每个参赛的学生都有能做出来的题目&#xff0c;并且最厉害的学生也要非常努力才有可能得到高分。 于是命题组首先将编程能…

Qt for Android设置安卓程序默认横屏+全屏

我的qt版本是5.14.1&#xff0c;网上查到的方法是&#xff0c;把编译出的build文件夹中的AndroidManifest.xml文件复制出来然后修改&#xff0c;然后把修改后的xml文件加入pro文件&#xff0c;语法为ANDROID_PACKAGE_SOURCE_DIR $$PWD/AndroidManifest.xml&#xff08;具体&am…

vue3如何动态添加组件到dom中(jsx,h(),render)

背景&#xff0c;在写自定义指令的时候遇见&#xff0c;需要把svg图标组件动态添加到div中&#xff0c;然后把方法绑定到图标上 1、创建jsx import IconSvg from "/components/IconSvg/IconSvg.vue";const renderDom () > {return (<IconSvg class"ico…

【算法与数据结构】122、LeetCode买卖股票的最佳时机 II

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;股票要想盈利&#xff0c;必须低买高卖。在第N天买入&#xff0c;然后在第M天卖出&#xff0c;所获的利…

Docker使用4-Persist the DB

写在前面 主题是Persist the DB&#xff0c;这里是链接。本文主要学习如何持久化容器中的数据。 实践 使用docker运行一个随机生成1-10000的数的命令。下面是两个命令用&&合并在一起&#xff0c;第一个命令是生成随机数并输出到data.txt&#xff0c;后面的命令是保持…

echarts 饼图3样式

父组件&#xff1a; <pieChartNormal :opt"contractStatics" style"width: 100%;height: 100%;" />import pieChartNormal from "./components/pieChartNormal";data() {return {contractStatics: {seriesData: [{name: 技术服务类,value:…

优思学院|有了人工智能,质检员快将失业了吗?

从前&#xff0c;质检员是执着于质量的守护者。他们拥有工作轻松、压力小、时间自由的优势&#xff0c;然而&#xff0c;这种优越感背后隐藏着容易得罪人、进步空间受限、上升机会有限的挑战&#xff0c;近年&#xff0c;随着人工智能、自动化等理念推陈出新&#xff0c;许多传…

AI浪潮下,大模型如何在音视频领域运用与实践?

视频云大模型算法「方法论」。 刘国栋&#xff5c;演讲者 在AI技术发展如火如荼的当下&#xff0c;大模型的运用与实践在各行各业以千姿百态的形式展开。音视频技术在多场景、多行业的应用中&#xff0c;对于智能化和效果性能的体验优化有较为极致的要求。如何运用好人工智能提…

Redis最实用的基础入门数据结构和常用指令使用教程

1.单线程redis操作为什么那么快&#xff1f; 一方面&#xff0c;Redis 的大部分操作在内存上完成&#xff0c;再加上它采用了高效的数据结构&#xff0c;例如哈希表和跳表&#xff0c;这是它实现高性能的一个重要原因。另一方面&#xff0c;就是 Redis 采用了多路复用机制&…

LeetCode刷题--- 找出所有子集的异或总和再求和

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述递归递归、搜…

vue2入门

vue2官方文档&#xff1a;安装 — Vue.js 1、安装 新建"vue"文件夹——>新建vue1.html 直接用<script>标签引入vue&#xff1a; <script src"https://cdn.jsdelivr.net/npm/vue2.7.14/dist/vue.js"></script> tips: CDN:一个网络…

Postman介绍和快速使用

Postman 是什么&#xff1f; Postman 是一个流行的API&#xff08;Application Programming Interface&#xff09;开发工具&#xff0c;它使得开发者可以很容易地创建、测试、共享和文档化API。Postman 提供了一个友好的用户界面&#xff0c;来发送HTTP请求&#xff0c;接收响…

【PHP】一个邮箱点击验证的完整示例

目录 1.效果展示 2.发送验证码 3.进行验证 以绑定邮箱为例&#xff0c;注册验证的话修改判断逻辑 1.效果展示 2.发送验证码 /*** 发点击验证* 参数 email*/public function sendClick(){$param $this->request->post();// 邮箱email的validate规则验证&#xff0c;略…

基于云主机的k8s环境搭建

1. 申请三台云主机(按量付费即可) 内网IP配置节点角色172.17.0.92C4Gk8s-master172.17.0.82C2Gk8s-node1172.17.0.172C2Gk8s-node2 2. 安装Kubernetes集群(全部节点执行以下操作) 关闭防火墙 systemctl stop firewalld systemctl disable firewalld关闭selinux sed -i s/e…