题目:

vue代码

 <template>
<div class="colculate">
<div>
<select v-model="num1" placeholder="数字1">
<option
v-for="item in numLimitList"
:key="item"
:label="item"
:value="item">
</option>
</select>
<select v-model="checkOperate" placeholder="处理符">
<option
v-for="item in operateFlag"
:key="item"
:label="item"
:value="item">
</option>
</select>
<select v-model="checkNum2" placeholder="数字2">
<option
v-for="item in numLimitList"
:key="item"
:label="item"
:value="item">
</option>
</select>
<button class="colculate-btn" @click="colculateNum">Colculate</button>
</div>
<div>Answer: <span class="show-result"> {{value}} </span></div>
</div>
</template> <script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator"; const operateFlag = ['+', '-', '*', '/']
const numLimitList = Array(100).fill('').map((_, v) => v) @Component
export default class Colculate extends Vue {
@Prop() private msg!: string;
message: string = 'Hello!'
operateFlag: string[] = operateFlag
numLimitList: number[] = numLimitList
num1: number = 0
num2: number = 0
operate: string = '+'
value: any = ''
set checkOperate(nVal: string) {
if (this.num2 === 0 && nVal === '/') {
this.value = '除数不能为0'
} else {
this.operate = nVal
}
}
get checkOperate() {
return this.operate
}
set checkNum2(nVal: number) {
if (this.operate === '/' && nVal === 0) {
this.value = '除数不能为0'
} else {
this.num2 = nVal
}
}
get checkNum2() {
return this.num2
}
colculateNum (): void {
switch (this.operate) {
case '+': this.value = this.num1 + this.num2; break
case '-': this.value = this.num1 - this.num2; break
case '*': this.value = this.num1 * this.num2; break
case '/':
if (this.num2 === 0) {
this.value = '除数不能为0'
} else {
this.value = this.num1 / this.num2;
}
break
default: this.value = '错误的操作符'
}
}
}
</script> <style lang="scss" scoped>
.colculate {}
</style>

详解:

功能-->计算num1和num2不同操作[+-*/]的计算式的结果,

num1-->计算式的第一个值,不需要做任何处理

num2-->计算式的第二个值,注意点:当是除法时,num2不能为0,如果用户操作改为0,则会提示用户‘除数不能为0’

operate-->计算式的操作符,注意点:当num2为0时,如果用户改操作符为'/'时,则会提示用户‘除数不能为0’

点击计算Colculate按钮时计算组成式子的结果,并显示出来

代码:

1、准备操作符的改变时的检查

 set checkOperate(nVal: string) {
if (this.num2 === 0 && nVal === '/') {
this.value = '除数不能为0'
} else {
this.operate = nVal
}
}

2、准备num2值改变时的检查

 set checkNum2(nVal: number) {
if (this.operate === '/' && nVal === 0) {
this.value = '除数不能为0'
} else {
this.num2 = nVal
}
}

3、计算值的方法

 colculateNum (): void {
switch (this.operate) {
case '+': this.value = this.num1 + this.num2 + ''; break
case '-': this.value = this.num1 - this.num2 + ''; break
case '*': this.value = this.num1 * this.num2 + ''; break
case '/':
if (this.num2 === 0) {
this.value = '除数不能为0'
} else {
this.value = this.num1 / this.num2 + '';
}
break
default: this.value = '错误的操作符'
}
}

实际操作:

计算实时处理验证为0的情况

单元测试:

 import { shallowMount } from "@vue/test-utils";
import Colculate from "@/components/Colculate.vue"; describe("Colculate.vue", () => {
it("计算属性是否正确", () => {
const wrapper = shallowMount(Colculate);
wrapper.setData({ num1: 10 });
wrapper.setData({ operate: "*" });
wrapper.setData({ num2: 12 });
const button = wrapper.find(".colculate-btn");
button.trigger("click");
expect(wrapper.vm.$data.value).toEqual("120");
});
// 一般情况下不会出现这种情况
it("当除数为0时,返回结果是除数不能为0", () => {
const wrapper = shallowMount(Colculate);
wrapper.setData({ num1: 10 });
wrapper.setData({ operate: "/" });
wrapper.setData({ num2: 0 });
const button = wrapper.find(".colculate-btn");
button.trigger("click");
expect(wrapper.vm.$data.value).toEqual("除数不能为0");
});
it("[改除数为0时]当除数为0时,返回结果是除数不能为0", () => {
const wrapper = shallowMount(Colculate);
wrapper.setData({ num1: 10 });
wrapper.setData({ operate: "/" });
wrapper.setData({ num2: 5 });
const button = wrapper.find(".colculate-btn");
button.trigger("click");
expect(wrapper.vm.$data.value).toEqual("2");
wrapper.setData({ num2: 0 });
button.trigger("click");
expect(wrapper.vm.$data.value).toEqual("除数不能为0");
});
it("[改操作符为除法时]当除数为0时,返回结果是除数不能为0", () => {
const wrapper = shallowMount(Colculate);
wrapper.setData({ num1: 10 });
wrapper.setData({ operate: "*" });
wrapper.setData({ num2: 0 });
const button = wrapper.find(".colculate-btn");
button.trigger("click");
expect(wrapper.vm.$data.value).toEqual("0");
wrapper.setData({ operate: "/" });
button.trigger("click");
expect(wrapper.vm.$data.value).toEqual("除数不能为0");
});
});

结果

react

import React, { Component } from 'react'

class App extends Component {
constructor() {
super()
this.state = {
showValue: '',
operate: '+',
num1: 0,
num2: 0
}
}
/**
* 修改数字1
*/
handleChangeNum1 = e => {
this.setState({
num1: Number(e.target.value)
})
}
/**
* 修改操作符
*/
handleChangeOperate = e => {
this.setState({
operate: e.target.value
})
}
/**
* 修改数字2
*/
handleChangeNum2 = e => {
this.setState({
num2: Number(e.target.value)
})
}
/**
* 计算计算式
*/
colculateNum = () => {
let showValue = ''
let { num1, num2, operate } = this.state
switch (operate) {
case '+':
showValue = num1 + num2
break
case '-':
showValue = num1 - num2
break
case '*':
showValue = num1 * num2
break
case '/':
if (num2 === 0) {
showValue = '除数不能为0'
} else {
showValue = num1 / num2
}
break
default:
showValue = '错误的操作符'
}
this.setState({
showValue
})
}
render() {
const operateFlag = ['+', '-', '*', '/']
const numLimitList = Array(100)
.fill('')
.map((_, v) => v)
return (
<div className="colculate">
<div>
<select title="数字1" value={this.state.num1} onChange={this.handleChangeNum1}>
{numLimitList.map(function(item) {
return <option value={item} label={item} key={item} />
})}
</select>
<select title="操作符" value={this.state.operate} onChange={this.handleChangeOperate}>
{operateFlag.map(function(item) {
return <option value={item} label={item} key={item} />
})}
</select>
<select title="数字2" value={this.state.num2} onChange={this.handleChangeNum2}>
{numLimitList.map(function(item) {
return <option value={item} label={item} key={item} />
})}
</select>
<button style={{ marginLeft: '10px' }} onClick={this.colculateNum}>
Colculate
</button>
</div>
<div>
Answer: <span className="show-result">{this.state.showValue}</span>
</div>
</div>
)
}
} export default App

一道笔试题(vue,react)的更多相关文章

  1. Java中有关构造函数的一道笔试题解析

    Java中有关构造函数的一道笔试题解析 1.详细题目例如以下 下列说法正确的有() A. class中的constructor不可省略 B. constructor必须与class同名,但方法不能与c ...

  2. 一道笔试题来理顺Java中的值传递和引用传递

      题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = ...

  3. 一道笔试题和UML思想 ~

    一句软件工程界的名言,让我想起了一个和一道笔试题有关的故事.希望更多的人了解 UML 背后的思想比他的语法更重要,是笔者写作本文的一点小愿望. 一.从一句软件工程名言说起 对很多事情的处理上,东西方都 ...

  4. 由阿里巴巴一道笔试题看Java静态代码块、静态函数、动态代码块、构造函数等的执行顺序

    一.阿里巴巴笔试题: public class Test { public static int k = 0; public static Test t1 = new Test("t1&qu ...

  5. 转:一道笔试题-将int型数组强制转换为char*,再求strlen,涉及大小端

    写出如下程序运行结果: #include<stdio.h> #include<string.h> int main() { int a[2000]; char *p = (ch ...

  6. golang 中 string 转换 []byte 的一道笔试题

    背景 去面试的时候遇到一道和 string 相关的题目,记录一下用到的知识点.题目如下: s:="123" ps:=&s b:=[]byte(s) pb:=&b s ...

  7. 通过一道笔试题浅谈javascript中的promise对象

    因为前几天做了一个promise对象捕获错误的面试题目,所以这几天又重温了一下promise对象.现在借这道题来分享下一些很基础的知识点. 下面是一个面试题目,三个promise对象捕获错误的例子,返 ...

  8. IGT一道笔试题

    1到n连续的n个数 输入m 得出m个有序序列 比如 输入为n=5 ,m=3 则输出 543 542 541 532 531 521  432 431 421 321 当前长度为i,每个位上的取之范围为 ...

  9. 一道笔试题:给定编码规则,实现decode()方法

    public class CodeDecode {     /*变换函数encode()顺序考察已知字符串的字符,按以下规则逐组生成新字符串:       (1)若已知字符串的当前字符不是大于0的数字 ...

随机推荐

  1. ACM-图论-同余最短路

    https://www.cnblogs.com/31415926535x/p/11692422.html 一种没见过的处理模型,,记录一下,,主要是用来处理一个多元一次方程的解的数量的问题,,数据量小 ...

  2. 微信小程序前端页面书写

    微信小程序前端页面书写 WXML(WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件.事件系统,可以构建出页面的结构. 一.数据绑定 1. 普通写法 <view ...

  3. Linux系统基础

    Linux系统基础 目录   简介 0x01 Linux文件与目录管理 0x02 Linux系统用户以及用户组管理 0x03文档的压缩与打包 0x04 apt安装软件 0x05 进程管理 标签 Lin ...

  4. 我家很管事的猫——mycat初步部署实践与问题排查

    mycat,阿里出品的mysql中间件,提供读写分离和分库分表方案.项目中主要使用的是其读写分离功能. [如何部署?] 本文只采用并测试了双主从模式,配置看这一篇足矣: https://www.cnb ...

  5. 基于 HTML5 Canvas 的楼宇自控系统

    前言 楼宇自控是指楼宇中电力设备,如电梯.水泵.风机.空调等,其主要工作性质是强电驱动.通常这些设备是开放性的工作状态,也就是说没有形成一个闭环回路.只要接通电源,设备就在工作,至于工作状态.进程.能 ...

  6. ESP8266开发之旅 进阶篇⑥ ESP-specific APIs说明

    1.前言     在介绍Arduino Core For ESP8266的时候,博主着重讲解了WIFI库的使用,但是并没有涉及到ESP8266硬件本身的一些特有API.所以,这一章我们将讲解ESP82 ...

  7. Qualcomm-Atheros-QCA9377-Wifi-Linux驱动

    资源来自:https://download.csdn.net/download/ichdy/10331646 已经下载好了,发现无法使用,本人系统Centos7.2,如果有安装成功,并且可以正常使用的 ...

  8. 【网络安全】Dos攻击科普文

    目录 DOS攻击 什么是DOS攻击 攻击手段分类 具体的攻击方式举例 优秀博客参考 DDOS攻击 DOS攻击 什么是DOS攻击 DOS是Denial of Service的简称,用中文简单翻译就是拒绝 ...

  9. 【java基础】- java双亲委派机制

    在了解双亲委派机制之前,你应当知道classloader(如果不了解,可以现在去恶补一下哈) 四种classloader 虚拟机自带 引导类加载器(Bootstrap ClassLoader) 扩展类 ...

  10. 数据结构(三十三)最小生成树(Prim、Kruskal)

    一.最小生成树的定义 一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边. 在一个网的所有生成树中,权值总和最小的生成树称为最小代价生成树(Minimum ...