微信小程序计算器实现(更新中)

页面配置(index.json)

代码:

{
  "navigationBarBackgroundColor": "#fff",
  "navigationBarTitleText": "计算器",
  "navigationBarTextStyle": "black"
}

逐行分析:

第一行:navigationBarBackgroundColor设置导航栏标题的背景颜色,

第二行:navigatinBarTitleText设置导航栏标题

第三行:navigationBarTextStyle设置标题的颜色,仅黑色与白色可选。

页面配置(index.wxml)

代码:

<view class="result">
  <view class="result-num">{{num}}</view>
  <view class="result-op">{{op}}</view>
</view>
<view class="btns">
  <view>
    <view hover-class="bg" bindtap="resetBtn">C</view>
    <view hover-class="bg" bindtap="delBtn">DEL</view>
    <view hover-class="bg" bindtap="opBtn" data-val="%">%</view>
    <view hover-class="bg" bindtap="opBtn" data-val="/">÷</view>
  </view>
  <view>
    <view hover-class="bg" bindtap="numBtn" data-val="7">7</view>
    <view hover-class="bg" bindtap="numBtn" data-val="8">8</view>
    <view hover-class="bg" bindtap="numBtn" data-val="9">9</view>
    <view hover-class="bg" bindtap="opBtn" data-val="*">×</view>
  </view>
  <view>
    <view hover-class="bg" bindtap="numBtn" data-val="4">4</view>
    <view hover-class="bg" bindtap="numBtn" data-val="5">5</view>
    <view hover-class="bg" bindtap="numBtn" data-val="6">6</view>
    <view hover-class="bg" bindtap="opBtn" data-val="-">-</view>
  </view>
  <view>
    <view hover-class="bg" bindtap="numBtn" data-val="1">1</view>
    <view hover-class="bg" bindtap="numBtn" data-val="2">2</view>
    <view hover-class="bg" bindtap="numBtn" data-val="3">3</view>
    <view hover-class="bg" bindtap="opBtn" data-val="+">+</view>
  </view>
  <view>
    <view hover-class="bg" bindtap="numBtn" data-val="0">0</view>
    <view hover-class="bg" bindtap="dotBtn">.</view>
    <view hover-class="bg" bindtap="opBtn" data-val="=">=</view>
  </view>
</view>

逐行分析:

view:容器组件。

class:组件被wxss渲染的标志物。

{{num}}:插值表达式,显示变量num的值,num定义在js文件中。

hover-class:鼠标点在组件上,组件由hover-class的类渲染(wxss)。

第一行:创建view组件,class="result",说明在wxss中.result定义的样式可以应用于此组件上。

第二行:创建子组件,class="result-num",说明在wxss中.result-num定义的样式可以应用于此组件上。{{num}}显示num的值。

第三行:创建子组件,class="result-op",说明在wxss中.result-op定义的样式可以应用于此组件上。{{op}}显示op的值。

第六行:子组件view

第七行:子组件view ,hover-class="bg":当鼠标点在view组件上,此组件由wxss中的.bg渲染。bindtap="resetBtn":当view组件被点击时,触发resetBth事件处理函数。C:在一行上显示。

第八行:子组件view,hover-class="bg":当鼠标点在view组件上,此组件由wxss中的.bg渲染。bindtap="delBtn":当view组件被点击时,触发delBtn事件处理函数。DEL:在一行上显示。

渲染页面(index.wxss)

代码

page {
  display: flex;
  flex-direction: column;
  height: 100%;
  color: #555;
}

.result {
  flex: 1;
  background: #f3f6fe;
  position: relative;
}

.result-num {
  position: absolute;
  font-size: 27pt;
  bottom: 5vh;
  right: 3vw;
}

.result-op {
  font-size: 15pt;
  position: absolute;
  bottom: 1vh;
  right: 3vw;
}

.btns {
  flex: 1;
}

/* 按钮样式 */

.bg {
  background: #eee;
}

.btns {
  flex: 1;
  display: flex;
  flex-direction: column;
  font-size: 17pt;
  border-top: 1rpx solid #ccc;
  border-left: 1rpx solid #ccc;
}

.btns > view {
  flex: 1;
  display: flex;
}

.btns > view > view {
  flex-basis: 25%;
  border-right: 1rpx solid #ccc;
  border-bottom: 1rpx solid #ccc;
  box-sizing: border-box;
  display: flex;
  align-items: center;
  justify-content: center;
}

.btns > view:last-child > view:first-child {
  flex-basis: 50%;
}

.btns > view:first-child > view:first-child {
  color: #f00;
}

.btns > view > view:last-child {
  color: #fc8e00;
}

分析1:

page {
  display: flex;
  flex-direction: column;
  height: 100%;
  color: #555;
}

page下

flex:弹性盒(Flexbox)容器

flex-direction:元素排列原则,按列或按行。

height:页面高度

color:页面字体颜色

page: 设置使用页面。display:flex,页面为弹性布局。flex-direction:column,页面中的元素按列放置。height:100%,页面占屏幕的全部。color:#555,页面中字体的颜色为深灰色。

分析2

.result与.btns:都设计了flex:1;这使得它们平分页面的空间。

.result {
  flex: 1;
  background: #f3f6fe;
  position: relative;
}

background:元素背景颜色

position:定位方式

.result:flex:1;占用页面剩余的100%。bakcgroud:#f3f6fe;背景颜色为#f3f6fe。position:relative;相对定位,可偏移。

分析4

.result-num {
  position: absolute;
  font-size: 27pt;
  bottom: 5vh;
  right: 3vw;
}

position:absolute class=result-num的视图位置是绝对的

font-size:27pt 字体大小

bottom:5vh 距离底部是整个容器的百分之五

right:3vw 显示的字与容器右边的距离是宽度的百分之3

分析四:

.bg {
  background: #eee;
}

background:#eee 设置class=’bg‘的视图背景颜色为#eee

分析五:

.btns {
  flex: 1;
  display: flex;
  flex-direction: column;
  font-size: 17pt;
  border-top: 1rpx solid #ccc;
  border-left: 1rpx solid #ccc;
}

flex:1;class=btns的容器将占满剩余空间。

display:flex;设置flex布局。

flex-direction:column;子元素垂直排列。

border-top:1rpx solid  #ccc;

border-left:1rpx solid  #ccc;设置1rpx的实线边框,#ccc为颜色。

分析六

.btns > view {
  flex: 1;
  display: flex;
}

.btns > view :btn下的第一类子元素

flex: 1; 子元素平分btns的空间

display: flex; 子元素进行flex布局

.btns > view > view {
  flex-basis: 25%;
  border-right: 1rpx solid #ccc;
  border-bottom: 1rpx solid #ccc;
  box-sizing: border-box;
  display: flex;
  align-items: center;
  justify-content: center;
}

.btns > view > view :定义btn类下的view下的view的样式

flex-basis: 25%; 每个孙子元素占父元素的25%

border-right: 1rpx solid #ccc;

border-bottom: 1rpx solid #ccc;每个孙子子元素有#ccc颜色的1rpx宽的实线边框

box-sizing: border-box; 元素的宽度和高度将包括内容、内边距和边框

display: flex;

align-items: center; 垂直居中

justify-content: center;水平居中

分析7:

.btns > view:last-child > view:first-child {
  flex-basis: 50%;
}

.btns > view:last-child > view:first-child  btn下子元素的最后一个中的第一个孙元素。

flex-basis: 50%; 占据父元素的50%。

分析8:

.btns > view:first-child > view:first-child {
  color: #f00;
}

.btns > view > view:last-child {
  color: #fc8e00;
}

.btns > view:first-child > view:first-child  btns下的第一个子元素下的第一个孙元素

color: #f00;颜色控制

.btns > view > view:last-child btns所有子元素下的最后一个孙元素

逻辑实现

Page({
  data: {
    num: '0',
    op: '',
    result: null,
    isClear: false,
  },

页面初始化,num为字符0,op为空字符

numBtn: function(e) {
    var num = e.target.dataset.val
    if (this.data.num === '0' || this.isClear) {
      this.setData({
        num: num
      })
      this.isClear = false
    } else {
      this.setData({
        num: this.data.num + num
      })
    }
  },

自定义点击函数函数numBtn

e.target.datasetl.val获取自定义data-val的值。

this.data.num === '0' || this.isClear:||是或者,两者其一成立即可,this.data.num=0 or this.Clear=True。

this.setData:重新赋值并重新渲染视图层。

num: this.data.num + num:字符串拼接

opBtn: function(e) {
    var op = this.data.op
    var num = Number(this.data.num)
    this.setData({
      op: e.target.dataset.val
    })
    if (this.isClear) {
      return
    }
    this.isClear = true
    if (this.result === null) {
      this.result = num
      return
    }
    if (op === '+') {
      this.result = calc.add(this.result, num)
    } else if (op === '-') {
      this.result = calc.sub(this.result, num)
    } else if (op === '*') {
      this.result = calc.mul(this.result, num)
    } else if (op === '/') {
      this.result = calc.div(this.result, num)
    } else if (op === '%') {
      this.result = this.result % num
    }
    this.setData({
      num: this.result + ''
    })
  },

var op = this.data.op:起初页面原始op值

var num=Number(this.data.val):起初页面原始this.data.val的值的数字化

this.setData({op: e.target.dataset.val}):将获取的val的值赋给op

if (this.isClear) {return}:如果页面的中的isClear为True,停止执行函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值