Web前端之路

H5实现计算器组件(Vue组件)

2020-08-03  本文已影响0人  喆哲

之前做H5页面的时候就碰到过这样的需求,一个盘点系统,车间希望要直接使用计算器,最好能直接调用还能准确赋值,APP调用原生的计算器恐怕都很难实现,要想做到也只有自己封装,今天把它又完善了一下,加入了:1、等式连续运算 2、单个组件化 3、显示运算公式和提示等功能

823.png

下面运算式,上面结果,超过3值个运算弹出提示。输入,删除,清空实时赋值。

644.png

确认后通过数据id准确赋值,没有计算公式则加入输入值,取消或者其他方式关闭则无动作。

751.png

watch属性触发,将等式字符串切成operatorArr 和resultDisplayArr 两个数组, 然后使用reduce属性连续处理等式,得到结果

watch: {
resultDisplay() {
    let resultDisplayArr = this.resultDisplay.replace(/÷/g,"+").replace(/-/g,"+").replace(/x/g,"+")
    resultDisplayArr = resultDisplayArr.split('+') // 截出等式数字数组
    if (resultDisplayArr.length) {
        this.resultStatus = resultDisplayArr.length
    }    
    let operatorArr = []
    // 截出等式运算符数组
    let lastResultDisplay = this.resultDisplay.substr( this.resultDisplay.length-1, 1)
    if (lastResultDisplay==='+' || lastResultDisplay==='-' 
            || lastResultDisplay==='x' || lastResultDisplay==='÷') {
        return
    }
    for(let i of this.resultDisplay){
        if (i==='+' || i==='-' || i==='x' || i==='÷') {
            operatorArr.push(i)
        }
    }
    if (resultDisplayArr.length > 2) {
        this.promptInfoShow = true
    } else {
        this.promptInfoShow = false
    }
    if (resultDisplayArr.length > 1) {
        this.resultInput = resultDisplayArr.reduce((acc,cur,inx,src) => {
            let valueA = null // 首项
            let valueB = null // 次项
            // 上次计算的数
            if (acc) {
                valueA = Number(acc)
            } else {
                valueA = Number(resultDisplayArr[inx-1])
            }                        
            valueB = Number(resultDisplayArr[inx])
            // 计算它
            if (operatorArr.length > 0 && valueB) {
                if (operatorArr[inx-1] === '+') {
                    acc = valueA + valueB
                    return acc
                }else if (operatorArr[inx-1] === '-') {
                    acc = valueA - valueB
                    return acc
                }else if (operatorArr[inx-1] === 'x') {
                    acc = valueA * valueB
                    return acc
                }else if (operatorArr[inx-1] === '÷') {
                    acc = valueA / valueB
                    return acc
                }
            }  
        })
    }
}
},
上一篇下一篇

猜你喜欢

热点阅读