欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

微信小程序实现计算器小功能

程序员文章站 2022-03-27 08:09:20
微信小程序现在越来越火爆了,我也看到很多在校大学生都在自学了,那些专门从事app开发,网页开发的工作者更是看到了小程序的前景,在小程序领域也掺上一脚,本人也是自学小程序的,初期跟很多人一样,遇到一些不...

微信小程序现在越来越火爆了,我也看到很多在校大学生都在自学了,那些专门从事app开发,网页开发的工作者更是看到了小程序的前景,在小程序领域也掺上一脚,本人也是自学小程序的,初期跟很多人一样,遇到一些不懂的想问问别人,到贴吧去,一大堆广告,根本没人帮忙解决问题。

今天教一些刚入门的同学做一款计算器,如果c语言是编程的最佳入门语言,那计算器应该算得上是小程序的入门demo了,希望刚入门的同学们认真品味下面的代码,从wxml到js,再到wxss(页面的布局),每个代码都要弄懂他的意思

废话不多说,先上效果图,这是我入门时候自己做的一款计算器,很简单,逻辑也很单一,只是我们身边最常见的计算器的逻辑,我觉得从这个demo我更深刻学习到了wxss页面的布局知识

微信小程序实现计算器小功能

微信小程序实现计算器小功能

代码附上:

app.json

 {
  "pages":[
    "pages/index/index",
    "pages/logs/logs"
  ],
  "window":
  {
  "navigationbarbackgroundcolor": "#000000",
  "navigationbartextstyle": "white", 
  "navigationbartitletext": "智能计算器"
  },
 "tabbar": {   //补充说一下,我这个tabbar是用来设置底部tab的
   "color":"#ff69b4",
   "selectedcolor":"#0000ff",
   "backgroundcolor":"#ffff00",
  "list": [
    {
      "pagepath": "pages/index/index",
      "text": "计 算 机"
    },
    {
      "pagepath": "pages/logs/logs",
      "text": "日志"
    },
    {
      "pagepath":"pages/logs/logs",
      "text":"回家"
    }
  ]
}
}

/*app.wxss/*

.container {
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: space-between;
  padding: 200rpx 0;
  box-sizing: border-box;
} 

**其中一些组件不认识的话, 建议到多看几遍

index.wxml:

<template name="calculator-key">
  <button hover-start-time="{{5}}" hover-stay-time="{{100}}" hover-class="calculator-key-hover" data-key="{{classname}}" class="calculator-key {{classname}}">{{display}}</button>
</template>

<view class="calculator">
  <view class="calculator-display">
    <view class="calculator-display-text">{{displayvalue}}</view>
  </view>
  <view class="calculator-keypad">
    <view class="input-keys">
      <view class="function-keys" catchtap="ontapfunction">
        <template is="calculator-key" data="{{classname: 'key-clear', display: cleardisplay ? 'c' : 'c'}}"/>
        <template is="calculator-key" data="{{classname: 'key-sign', display: '+/-'}}"/>
        <template is="calculator-key" data="{{classname: 'key-percent', display: '%'}}"/>
   </view>
      <view class="digit-keys" catchtap="ontapdigit">
        <template is="calculator-key" data="{{classname: 'key-0', display: '0'}}"/>
        <template is="calculator-key" data="{{classname: 'key-dot', display: '●'}}"/>
        <template is="calculator-key" data="{{classname: 'key-1', display: '1'}}"/>
        <template is="calculator-key" data="{{classname: 'key-2', display: '2'}}"/>
        <template is="calculator-key" data="{{classname: 'key-3', display: '3'}}"/>
        <template is="calculator-key" data="{{classname: 'key-4', display: '4'}}"/>
        <template is="calculator-key" data="{{classname: 'key-5', display: '5'}}"/>
        <template is="calculator-key" data="{{classname: 'key-6', display: '6'}}"/>
        <template is="calculator-key" data="{{classname: 'key-7', display: '7'}}"/>
        <template is="calculator-key" data="{{classname: 'key-8', display: '8'}}"/>
        <template is="calculator-key" data="{{classname: 'key-9', display: '9'}}"/>
      </view>
    </view>
    <view class="operator-keys" catchtap="ontapoperator">
        <template is="calculator-key" data="{{classname: 'key-divide', display: '÷'}}"/>
        <template is="calculator-key" data="{{classname: 'key-multiply', display: '×'}}"/>
        <template is="calculator-key" data="{{classname: 'key-subtract', display: '−'}}"/>
        <template is="calculator-key" data="{{classname: 'key-add', display: '+'}}"/>
        <template is="calculator-key" data="{{classname: 'key-equals', display: '='}}"/>
    </view>
  </view>
</view>

index.js:

page({
  data: {
    value: null, // 上次计算后的结果,null表示没有上次计算的结果
    displayvalue: '0', // 显示数值
    operator: null, // 上次计算符号,null表示没有未完成的计算
    waitingforoperand: false // 前一按键是否为计算符号
  },

  onload: function (options) {
    this.calculatoroperations = {
      'key-divide': (prevvalue, nextvalue) => prevvalue / nextvalue,
      'key-multiply': (prevvalue, nextvalue) => prevvalue * nextvalue,
      'key-add': (prevvalue, nextvalue) => prevvalue + nextvalue,
      'key-subtract': (prevvalue, nextvalue) => prevvalue - nextvalue,
      'key-equals': (prevvalue, nextvalue) => nextvalue
    }
  },

  /* ac操作,一下回到* */
  clearall() {
    this.setdata({
      value: null,
      displayvalue: '0',
      operator: null,
      waitingforoperand: false
    })
  },

  /* 仅清空当前显示的输入值 */
  cleardisplay() {
    this.setdata({
      displayvalue: '0'
    })
  },

  ontapfunction: function (event) {
    const key = event.target.dataset.key;

    switch (key) {
      case 'key-clear':
        if (this.data.displayvalue !== '0') {
          this.cleardisplay();
        } else {
          this.clearall();
        }

        break;

      case 'key-sign':
        var newvalue = parsefloat(this.data.displayvalue) * -1

        this.setdata({
          displayvalue: string(newvalue)
        })

        break;

      case 'key-percent':
        const fixeddigits = this.data.displayvalue.replace(/^-?\d*\.?/, '')
        var newvalue = parsefloat(this.data.displayvalue) / 100

        this.setdata({
          displayvalue: string(newvalue.tofixed(fixeddigits.length + 2))
        });

        break;

      default:
        break;
    }
  },

  ontapoperator: function (event) {
    const nextoperator = event.target.dataset.key;
    const inputvalue = parsefloat(this.data.displayvalue);

    if (this.data.value == null) {
      this.setdata({
        value: inputvalue
      });
    } else if (this.data.operator) {
      const currentvalue = this.data.value || 0;
      const newvalue = this.calculatoroperations[this.data.operator](currentvalue, inputvalue);

      this.setdata({
        value: newvalue,
        displayvalue: string(newvalue)
      });
    }

    this.setdata({
      waitingforoperand: true,
      operator: nextoperator
    });
  },

  ontapdigit: function (event) {
    const key = event.target.dataset.key; // 根据data-key标记按键

    if (key == 'key-dot') {
      // 按下点号
      if (!(/\./).test(this.data.displayvalue)) {
        this.setdata({
          displayvalue: this.data.displayvalue + '.',
          waitingforoperand: false
        })
      }
    } else {
      // 按下数字键
      const digit = key[key.length - 1];

      if (this.data.waitingforoperand) {
        this.setdata({
          displayvalue: string(digit),
          waitingforoperand: false
        })
      } else {
        this.setdata({
          displayvalue: this.data.displayvalue === '0' ? string(digit) : this.data.displayvalue + digit
        })
      }
    }
  }
})

index.wxss:

page {
  height:100%;
}

.calculator {
  width: 100%;
  height: 100vh;
  border:solid 1px;
  background: rgb(238, 5, 5);
  position: relative;
  box-shadow: 0px 0px 20px 0px rgb(211, 41, 41);
  display: flex;
  flex-direction: column;
  box-sizing: border-box;
}

.calculator-display {     /*显示器背景颜色*/
  background: #2c2a2c;
  flex: 1;
}

/*todo:解决文本垂直居中问题,显示器数字颜色*/
.calculator-display-text {
  padding: 0 30px;
  font-size: 3em;
  color: rgb(245, 245, 248);
  text-align: right;
}

.calculator-keypad {
  display: flex;

}

.calculator .function-keys {
  display: flex;
  color:rgb(245, 13, 13);

}

.calculator .digit-keys {
  background: #0808f7;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap-reverse;
}

.calculator-key-hover {   /*按钮按下以后的颜色*/
  box-shadow: inset 0px 0px 25vw 0px hsla(71, 90%, 48%, 0.898);
}



.calculator-key {
background-color:aqua;

  display: block;
  width: 25vw;
  height: 25vw;
  line-height: 25vw;
  border-top: 1px solid rgb(6, 245, 78);
  border-right: 1px solid rgb(19, 241, 12);
  text-align: center;
  box-sizing: border-box;
}

.calculator .function-keys .calculator-key {
  font-size: 2em;

}

.calculator .digit-keys .calculator-key {
  font-size: 3em;
}

.calculator .digit-keys .key-0 {
  width: 50vw;
  text-align: left;
  padding-left: 9vw;
}

.calculator .digit-keys .key-dot {
  padding-top: 1em;
  font-size: 0.75em;
}

.calculator .operator-keys .calculator-key {
  color: rgb(248, 165, 10);
  border-right: 0;
  font-size: 3em;
}

.calculator .function-keys {
  background: linear-gradient(to bottom, rgb(6, 6, 240) 0%, rgb(52, 5, 240) 100%);
}

.calculator .operator-keys {
  background:  linear-gradient(to bottom, rgba(252,156,23,1) 0%, rgba(247,126,27,1) 100%);
}

.input-keys {
  width: 100%;
}

.operator-keys {
  width: 100%;
}

微信小程序实现计算器小功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。