Vue利用计算属性和侦听属性实现简易计算器

计算器功能:

1.加减乘除模可以随意切换
使用表单元素< seclect >

2.当输入框中数字改变时实时得出运算结果
方法1:v-model绑定input框的值,绑定input键盘按下和鼠标点击时触发自定义方法getResult,该方法用来计算表达式的值。
方法2:使用computed计算属性
方法3:使用watch侦听属性

3.可以使用上下按钮调节数字大小
使用input 属性 type=“number”

4.结果框禁止输入
input添加事件οnfοcus=“this.blur()”

一、利用原生JS事件

通过methods中自定义方法,然后在input表单上通过v-on绑定keyup键盘事件,实现实时更新计算结果的功能。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<!--当键盘按下或者鼠标点击时触发getResult事件-->
			<input id="input" type="number" v-model="num1" @keyup="getResult" @click="getResult" /> 
			 <select v-model="selected" @click="getResult">
				<option value ="">请选择</option>
			 	<option value ="+">+</option>
				<option value ="-">-</option>
				<option value ="*">*</option>
				<option value ="/">/</option>
				<option value ="%">%</option>
			 </select>
			<input type="number" v-model="num2" @keyup="getResult" @click="getResult"/>
			<input type="text" v-model="result" onfocus="this.blur()" />
		</div>
		<script type="text/javascript">
			var vm = new Vue({
				el:'#app',
				data:{
					num1:0,//第一输入框中的数字
					num2:0,//第二输入框中的数字
					result:null,//计算结果
					selected:''//默认选择的运算符 可以设置为 '','+','-','*','/','%'
				},
				methods:{
					//计算表达式num1 (+ or - or * or / or %) num2 的值
					getResult(){
						if(this.selected === '') //未选择运算符时跳过运算
							return
						var str = this.num1 + this.selected + this.num2;//拼接表达式
						this.result = eval(str);//使用eval计算表达式的值
					}
				},
				created:function(){
					this.getResult() //如果设定了初值,计算该表达式的结果
				}
			})
		</script>
	</body>
</html>

二、通过computed计算属性

将计算结果设定为一个computed计算属性,该属性与两个表单中的数字相关联,每当数字发生改变自动计算出结果。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<input id="input" type="number" v-model="num1" placeholder="请输入数字" />
			 <select v-model="selected">
				<option value ="">请选择</option>
			 	<option value ="+">+</option>
				<option value ="-">-</option>
				<option value ="*">*</option>
				<option value ="/">/</option>
				<option value ="%">%</option>
			 </select>
			<input type="number" v-model="num2" placeholder="请输入数字"/>
			<input type="text" v-model="result" onfocus="this.blur()" placeholder="请输入完整的表达式"/>
		</div>
		<script type="text/javascript">
			var vm = new Vue({
				el:'#app',
				data:{
					num1:0,//第一输入框中的数字
					num2:0,//第二输入框中的数字
					selected:''//默认选择的运算符 可以设置为 '','+','-','*','/','%'
				},
				computed:{
					result:function(){
						if(this.selected === '' || this.num1=='' || this.num2 =='') //表达式不完整时跳过运算
							return null
						return eval(`${this.num1}${this.selected}(${this.num2})`)//使用eval和模板字符串计算表达式的值
					}
				}
			})
		</script>
	</body>
</html>

eval(${this.num1}${this.selected}(${this.num2}))这里this.num2一定要加括号,否则num2为负值时运算会报错。

三、使用watch侦听属性

Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性。
每当侦听的属性发生改变时,vue会执行该属性对应的函数。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<input id="input" type="number" v-model="num1" placeholder="请输入数字" /> 
			 <select v-model="selected">
				<option value ="">请选择</option>
			 	<option value ="+">+</option>
				<option value ="-">-</option>
				<option value ="*">*</option>
				<option value ="/">/</option>
				<option value ="%">%</option>
			 </select>
			<input type="number" v-model="num2" placeholder="请输入数字"/>
			<input type="text" v-model="result" onfocus="this.blur()" placeholder="请输入完整的表达式"/>
		</div>
		<script type="text/javascript">
			var vm = new Vue({
				el:'#app',
				data:{
					num1:0,
					num2:0,
					result:null,
					selected:''
				},
				methods:{
					//求出计算结果的方法
					com:function(){
						//当表达式不完整时停止运算
						if(this.selected === '' || this.num1=='' || this.num2==''){
							this.result = null
							return
						}
						this.result = eval(`${this.num1}${this.selected}(${this.num2})`)
					}
				},
				watch:{
					//如果num1发生改变,下面的函数就会运行
					num1:function(){
						this.com()
					},
					//如果num2发生改变,下面的函数就会运行
					num2:function(){
						this.com()
					},
					//如果selected发生改变,下面的函数就会运行
					selected:function(){
						this.com()
					}
				},
				created(){
					this.com()
				}
			})
		</script>
	</body>
</html>

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值