vue實現計算器封裝

前言:根據計算器可增添加減乘除的封裝可擴展,大家請參照效果如下:

在這裏插入圖片描述

文件目錄

我們導入了四個js包,在下面有源代碼,當前計算器頁只有一個valculator.vue文件。

在這裏插入圖片描述

valculator.vue:<html代碼>

template>
  <div class="about">
    <h1>這是個計算器你信嗎</h1>
    <van-cell-group type="text">
      <van-field
        οninput="value=value.replace(/[^\d+(+)+(-)+(*)]/g, '').replace(/^0{1,}/g,'')"
        v-model="inputValue"
        placeholder="請輸入數字"
      />
    </van-cell-group>
    <div style="margin-top:20%">
      <van-grid clickable :column-num="4" :gutter="10">
        <van-grid-item @click="onclick(i)" v-for="(num, i) in dataNum" :key="i" :text="dataNum[i]" />
      </van-grid>
    </div>
  </div>
</template>

valculator.vue:《js方法》

<script>
// eslint-disable-next-line no-unused-vars
import { Field } from 'vant'
export default {
  data () {
    return {
      // 數字加減乘除數組
      dataNum: [
        '+',
        '-',
        '*',
        '/',
        '1',
        '2',
        '3',
        '< X',
        '4',
        '5',
        '6',
        '=',
        '7',
        '8',
        '9',
        '0'
      ],
      inputValue: '', // input當前顯示值
      inputStorage: '', // input輸入值存儲
      calculator: '', // 解析拿到的值

      temporaryVariables1: '', // 存儲臨時計算拼接值1
      temporaryVariables2: '', // 存儲臨時計算拼接值2
      temporaryOperator: '' // 存儲臨時運算符
    }
  },
  methods: {
    // 點擊事件
    onclick (index) {
      this.parsing(index) // 解析當前的值
      this.judge() // 判斷進行運算
    },

    // 解析當前拿到的值
    parsing (index) {
      switch (index) {
        case 4:
          this.calculator = '1'
          break
        case 5:
          this.calculator = '2'
          break
        case 6:
          this.calculator = '3'
          break
        case 8:
          this.calculator = '4'
          break
        case 9:
          this.calculator = '5'
          break
        case 10:
          this.calculator = '6'
          break
        case 12:
          this.calculator = '7'
          break
        case 13:
          this.calculator = '8'
          break
        case 14:
          this.calculator = '9'
          break
        case 15:
          this.calculator = '0'
          break
        case 0:
          this.calculator = '+'
          break
        case 1:
          this.calculator = '-'
          break
        case 2:
          this.calculator = '*'
          break
        case 3:
          this.calculator = '/'
          break
        case 11:
          this.calculator = '='
          break
        case 7:
          this.calculator = 'X'
          this.Clear()
          break
        default:
          break
      }

      //   this.outValue = this.calculator;
      //   this.inputBox();
      //   console.log(this.calculator);
    },

    // 判斷是哪個運算符
    judge () {
      if (this.calculator === '=') {
        this.equal()
      } else if (this.calculator === 'X') {
        this.Clear()
      } else {
        this.showOn() // 顯示當前的值
        this.calculation() // 計算當前的值
      }
    },

    // 計算當前的值
    calculation () {
      // 如果爲空表示當前爲第一個運算符,否則開始計算

      const vae = this.isNumber(this.calculator) // 判斷當前輸入值是否爲數字
      if (this.temporaryOperator === '') {
        if (vae === false) {
          this.temporaryOperator = this.calculator // 存儲當前計算值
        } else {
          this.temporaryVariables1 += this.calculator // 計算的值:加減觸發前拼接的值
        }
      } else {
        if (vae === false) {
          this.temporaryVariables1 = this.Retrieval.retrieval(
            this.temporaryOperator,
            this.temporaryVariables1,
            this.temporaryVariables2
          ) // 如果當前有輸入運算法調取加減乘除

          this.assignmentConversion() // 清空第二個數
          this.temporaryOperator = this.calculator // 計算完後保留當前的運算符
        } else {
          this.temporaryVariables2 += this.calculator // 繼續第二個拼接
        }
      }
    },

    // 判斷是否爲數字:“12.3”等都爲true, “哈哈”、“12.33”等都爲false
    isNumber (val) {
      var regPos = /^\d+(\.\d+)?$/ // 非負浮點數
      var regNeg = /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/ // 負浮點數
      if (regPos.test(val) || regNeg.test(val)) {
        return true
      } else {
        return false
      }
    },

    // 等於
    equal () {
      this.temporaryVariables1 = this.Retrieval.retrieval(
        this.temporaryOperator,
        this.temporaryVariables1,
        this.temporaryVariables2
      ) // 調取加減乘除
      this.assignmentConversion() // 清空第二個數
      this.inputValue = this.temporaryVariables1 // 將計算後的值顯示在屏幕上
      this.inputStorage = '' // 清空之前存儲的值
    },

    // 清空第二個數
    assignmentConversion () {
      this.temporaryVariables2 = '' // 第二個清空用來再次保留
    },

    // 清除顯示的數據
    Clear () {
      this.inputValue = '' // 顯示的值
      this.inputStorage = '' // input輸入值存儲
      this.calculator = '' // 解析拿到的值

      this.temporaryVariables1 = '' // 存儲臨時計算拼接值1
      this.temporaryVariables2 = '' // 存儲臨時計算拼接值2
      this.temporaryOperator = '' // 存儲臨時運算符
    },

    // 顯示當前的值
    showOn () {
      this.inputValue = this.inputStorage // 之前存儲先賦給要顯示的
      this.inputValue += this.calculator // 要顯示的值再次加上當前點擊的值
      this.inputStorage = this.inputValue // 同步要存儲的值
    }
  }
}

valculator.vue:《style》

<style scoped>
div.inputAll {
  position: relative;
}

div.inputOne {
  position: absolute;
  top: 10%;
  /* border-bottom:1px solid gray; */
}

div.inputTwo {
  position: absolute;
  top: 15%;
}

div.inputLine {
  border-bottom: 1px solid gray;
  top: 12.5%;
  position: absolute;
}
</style>

導入其他js文件:

retrieval.js:計算器加減乘除選擇器


// eslint-disable-next-line no-unused-vars
import Add from '../valculator/add'
// eslint-disable-next-line no-unused-vars
import Subtraction from '../valculator/subtraction'
import Multiplication from '../valculator/multiplication'
export default {
  retrieval: function (operator, variables1, variables2) {
    switch (operator) {
      case '+':
        // 調取公共加法
        // eslint-disable-next-line no-undef
        variables1 = Add.add(variables1, variables2)
        break
      case '-':
        // 調取公共減法
        // eslint-disable-next-line no-undef
        variables1 = Subtraction.subtraction(variables1, variables2)
        break
      // eslint-disable-next-line no-duplicate-case
      case '*':
        // 調取公共乘法
        // eslint-disable-next-line no-undef
        variables1 = Multiplication.multiplication(variables1, variables2)
        break
      default:
        break
    }
    return variables1
  }
}

add.js:加法操作

export default {
  add: function (addOne, addTwo) {
    // eslint-disable-next-line no-unused-vars
    addOne = Number(addOne) + Number(addTwo) // 顯示當前的值
    return addOne
  }
}

multiplication.js:乘法操作

export default {
  multiplication: function (addOne, addTwo) {
    // eslint-disable-next-line no-unused-vars
    addOne = Number(addOne) * Number(addTwo) // 顯示當前的值
    return addOne
  }
}

subtraction.js:減法操作

export default {
  subtraction: function (addOne, addTwo) {
    // eslint-disable-next-line no-unused-vars
    addOne = Number(addOne) - Number(addTwo) // 顯示當前的值
    return addOne
  }
}

總結:

我們對於加減同一級別的代碼可以自己添加一個js文件,然後retrieval.js裏面寫進入即可,當然我們最好將這個js文件換成xml就可以實現仿反射+配置文件了,對於乘除法我們需要進一步更改計算器爲每次都是兩個計算,不可以一次性輸入很多數字,這樣可以避免開優先級問題,當然我們要做成優先級是我們很重要的學習理論依據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章