用js/react写一个计算器

2023-11-20

效果图如下

直接上代码

目录如下,Button和Text是自己封装的Button组件和Input组件

Button/index.js

import react, {Component} from "react";
import '../../index.css'

class Button extends Component {
  render() {
    return <input 
      type='button' 
      value={this.props.value} 
      className={this.props.className ? this.props.className : 'button_type'}
    ></input>
  }
}

export default Button

Text/index.js

import react, {Component} from "react";
import '../../index.css'

class Text extends Component {
  render() {
    return <input className="text_type" type='text' value={this.props.value} readOnly={true}></input>
  }
}

export default Text

Counter/index.js

import React, { Component } from "react"
import Button from './components/Button'
import Text from "./components/Text"
import './index.css'

class Counter extends Component {
  constructor() {
    super()
    this.state = {
      text: ''
    }
  }
  onClickButton=(e) => {
    if(e.target.value) {
      let currentValue = e.target.value
      let prvcontent = this.state.text
      let content = ''

      switch (e.target.value) {
        case '+':
        case '-':
        case '*':
        case '/':
          let arr1 = prvcontent.split(' ')
          if(arr1.length > 1) {
            if(arr1[arr1.length -1] === '') {
              arr1.pop()
              arr1.pop()
              prvcontent = arr1.join(' ')
            } else if(arr1.length === 3) {
              switch (arr1[1]) {
                case '+':
                  prvcontent = parseFloat(arr1[0]) + parseFloat(arr1[2])
                  break;
                case '-':
                  prvcontent = parseFloat(arr1[0]) - parseFloat(arr1[2])
                  break;
                case '*':
                  prvcontent = parseFloat(arr1[0]) * parseFloat(arr1[2])
                  break;
                case '/':
                  if(arr1[2] === 0) {
                    prvcontent = '除数不能为零'
                  } else {
                    prvcontent = parseFloat(arr1[0]) / parseFloat(arr1[2])
                  }
                  break;
                default:
                  break;
              }
            }
          }
          content = prvcontent + ' ' + currentValue + ' '
          break;
        case 'C':
          content = ''
          break;
        case 'Back':
          if(prvcontent.length === 1) {
            prvcontent = ''
          } else {
            if(prvcontent[prvcontent.length - 1] === ' ' && prvcontent[prvcontent.length - 3] === ' ') {
              prvcontent = prvcontent.slice(0, prvcontent[prvcontent.length - 3])
            } else {
              prvcontent = prvcontent.slice(0, prvcontent[prvcontent.length - 1])
            }
          }
          content = prvcontent
          break;
        case '=':
          let arr2 = prvcontent.split(' ')
          if(arr2.length > 1) {
            if(arr2[0] && arr2[2]) {
              switch (arr2[1]) {
                case '+':
                  content = parseFloat(arr2[0]) + parseFloat(arr2[2])
                  break;
                case '-':
                  content = parseFloat(arr2[0]) - parseFloat(arr2[2])
                  break;
                case '*':
                  content = parseFloat(arr2[0]) * parseFloat(arr2[2])
                  break;
                case '/':
                  if(arr2[2] === 0) {
                    content = '除数不能为零'
                  } else {
                    content = parseFloat(arr2[0]) / parseFloat(arr2[2])
                  }
                  break;
                default:
                  break;
              }
            } else if(arr2[0] && !arr2[2]) {
              switch (arr2[1]) {
                case '+':
                  content = parseFloat(arr2[0]) + parseFloat(arr2[0])
                  break;
                case '-':
                  content = parseFloat(arr2[0]) - parseFloat(arr2[0])
                  break;
                case '*':
                  content = parseFloat(arr2[0]) * parseFloat(arr2[0])
                  break;
                case '/':
                  if(arr2[0] === 0) {
                    content = '结果未定义'
                  } else {
                    content = parseFloat(arr2[0]) / parseFloat(arr2[0])
                  }
                  break;
                default:
                  break;
              }
            } else if(!arr2[0] && arr2[2]) {
              switch (arr2[1]) {
                case '+':
                  content = 0 + parseFloat(arr2[2])
                  break;
                case '-':
                  content = 0 - parseFloat(arr2[2])
                  break;
                case '*':
                case '/':
                  content = 0
                  break;
                default:
                  break;
              }
            }
          } else if(arr2.length === 1) {
            if(arr2[0]) {
              if(arr2[0] === '.') {
                content = 0
              } else {
                content = arr2[0]
              }
            }
          }
          break;
        default:
          content = prvcontent + currentValue
          break;
      }
      this.setState({
        text: content
      })
    }
  }

  render() {
    return (
      <div>
        <div>
          <Text value={this.state.text}></Text>
        </div>
        <div onClick={this.onClickButton} className="button_div">
          <div>
            <Button value={1}></Button>
            <Button value={2}></Button>
            <Button value={3}></Button>
            <Button value={'Back'} className={"other_button"}></Button>
          </div>
          <div>
            <Button value={4}></Button>
            <Button value={5}></Button>
            <Button value={6}></Button>
            <Button value={'+'}></Button>
            <Button value={'-'}></Button>
          </div>
          <div>
            <Button value={7}></Button>
            <Button value={8}></Button>
            <Button value={9}></Button>
            <Button value={'*'}></Button>
            <Button value={'/'}></Button>
          </div>
          <div>
            <Button value={'C'}></Button>
            <Button value={0}></Button>
            <Button value={'.'}></Button>
            <Button value={'='} className={"other_button"}></Button>
          </div>
        </div>
      </div>
    )
  }
}

export default Counter

Counter/index.css

.button_type {
  width: 30px;
  flex: auto;
  margin: 2px;
}
.other_button {
  width: 64px;
  flex: auto;
  margin: 2px;
}
.text_type {
  width: 158px;
  margin: 2px;
}
.button_div {
  width: 200px;
}

 

本文结构参考了@风吹行舟的《使用React实现一个简单计算器》,计算逻辑是自己写的,如有不足,欢迎指出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用js/react写一个计算器 的相关文章

随机推荐

  • 【马士兵】Python基础--15

    Python基础 15 文章目录 Python基础 15 编程思想 类与对象 类的创建 对象的创建 类属性 类方法 静态方法 动态绑定属性和方法 知识点总结 编程思想 类与对象 python中一切皆对象 类的创建 类的名称由一个或多个单词组
  • 【SpringCloud】SpringAMQP总结

    文章目录 1 AMQP 2 基本消息模型队列 3 WorkQueue模型 4 发布订阅模型 5 发布订阅 Fanout Exchange 6 发布订阅 DirectExchange 7 发布订阅 TopicExchange 8 消息转换器
  • 迁移学习 & 凯明初始化

    前言 这一章其实就是之前没做完的事 来补一下 两者其实没啥关系 迁移学习 以下内容学习自迁移学习 斯坦福21秋季 实用机器学习中文版 迁移学习包括什么 feature extraction train a model on a relate
  • 由于缺少调试目标 E:a\b\c\串口配置工具\bin\Debug\串口配置工具.exe“,visual Studio无法开始调试。请生成项目并重试,或者相应OutputPath和AssemblyNa

    最近做一个窗体程序时候出现这个错误 我的项目名称是串口配置工具 建议为英文来命名 项目名称下面有这两个 发现 没有这个串口配置工具 exe 然后再这个 这里面发现这个串口配置工具 exe 最后直接 exe文件把这个复制到 项目名称 bin
  • C++基础——const成员函数

    目录 一 Const成员函数 1 定义 2 格式 3 代码示例 h文件 definition cpp文件 特性 例 那么const对象既可以调用非const型成员函数吗 问题3 const成员函数内可以调用其它的非const成员函数吗 问题
  • 手机运行python 神器,pydroid3 包含库的版本

    初次安装pydroid 或者qpython的同学运行爬虫时是不是蛋疼的一比 lxml根本装不了 虽然可以下载whl折腾 可是也很麻烦 后来我不死心 终于找到了包含库的版本 只有pydroid 64位 https lanzous com id
  • msa2000映射到服务器,HPmsa2000i官方详细的设置操作流程步骤.doc

    HPmsa2000i官方详细的设置操作流程步骤 从本地管理主机登录进入 SMU 如要从本地管理主机登录进入 SMU 在网络浏览器的地址栏中 键入某个控制器机柜的以太网管理端口的 IP 地址 然后按Enter 此时显示 SMU Login 页
  • IDEA java.lang.NullPointerException (no error message)

    今天在不停启动debug 停止debug后无法再启动debug 提示java lang NullPointerException no error message 经百度 删除 project下 gradle无效 恢复代码后无效 且未更改配
  • 【C语言】合并两个数组,降序排列并删除重复元素(通俗易懂)

    问题描述 试着写一个程序 具体内容如下 建立两个整型数组 int n scanf d n int a n 将其合并 对他们进行降序排序 去掉相同项 输出处理过后的数组 输入形式 首先第一行输入第一个数组中的长度n 然后输入n个整型数 然后在
  • MYSQL进阶-msql日志-慢查询日志

    2 慢查询日志 慢查询日志主要用来记录执行时间超过设置的某个时长的SQL语句 能够帮助数据库维护人员找出执行时间比较长 执行效率比较低的SQL语句 并对这些SQL语句进行针对性优化 2 1 开启慢查询日志 可以在my cnf文件或者my i
  • ant design pro 代码学习(七) ----- 组件封装(登录模块)

    以登录模块为例 对ant design pro的组件封装进行相关分析 登录模块包含基础组件的封装 组件按模块划分 同类组件通过配置文件生成 跨层级组件直接数据通信等 相对来说还是具有一定的代表性 1 登录模块流程图 首先 全局了解一下登录模
  • 在idea中安装并且使用easy code插件 ,以及在idea中配置mysql数据库

    在idea中安装并且使用easy code插件 以及在idea中配置mysql数据库 1 从导航栏进入设置页面 2 点击plugins选项 在输入框中输入easy code查找 并点击installed安装 下载安装好了以后需要重启软件 点
  • GNURadio报错Unable to create context(windows10环境)

    GNURadio报错Unable to create context windows10环境 这里本人使用的是GNU Radio3 7 11 iiosupport win64 版本 外设是ADI的ADALM PLUTO 这里本人使用的是GN
  • 多维时序

    多维时序 MATLAB实现ELM极限学习机多维时序预测 股票价格预测 目录 多维时序 MATLAB实现ELM极限学习机多维时序预测 股票价格预测 效果一览 基本介绍 程序设计 结果输出 参考资料 效果一览 基本介绍
  • 2018-12-13 LeetCode Q5 最长回文子串

    5 最长回文子串 给定一个字符串 s 找到 s 中最长的回文子串 你可以假设 s 的最大长度为 1000 示例 1 输入 babad 输出 bab 注意 aba 也是一个有效答案 示例 2 输入 cbbd 输出 bb 暴力解法 6004ms
  • 关于linux进程间的close-on-exec机制

    转载请注明出处 帘卷西风的专栏 http blog csdn net ljxfblog 前几天写了一篇博客 讲述了端口占用情况的查看和解决 关于linux系统端口查看和占用的解决方案 大部分这种问题都能够解决 在文章的最后 提到了一种特殊情
  • 判断字符串的两半是否相似(1704.leetcode)-------------------c++实现

    判断字符串的两半是否相似 1704 leetcode unordered map c 实现 题目表述 给你一个偶数长度的字符串 s 将其拆分成长度相同的两半 前一半为 a 后一半为 b 两个字符串 相似 的前提是它们都含有相同数目的元音 a
  • Tensorflow学习(五)——多任务学习验证码识别实战

    一 验证码生成 验证码生成脚本 使用captcha包提供的ImageCaptcha方法 from captcha image import ImageCaptcha import sys import random import numpy
  • 成功解决笔记本重装系统后没有无线网

    笔记本重装系统后没有无线网 一般的解决思路就是下载笔记本厂家官方提供的各类驱动程序 重新安装驱动 驱动下载的地址 建议到各个厂家的官网上去寻找驱动资源 以本人的笔记本型号为例 点击window R 然后输入dxdiag运行 然后找到该官方开
  • 用js/react写一个计算器

    效果图如下 直接上代码 目录如下 Button和Text是自己封装的Button组件和Input组件 Button index js import react Component from react import index css cl