ES6模块化开发计算器小案例续

 前言

f96cd2e378735c53f0bcdf652ff592fa.png

大家好 我是歌谣 接着上节webpack进行数据得一个说明

  index.html

a5c1a997e3baf90611c6c8ddb4e0ec96.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>计算小案例</title>
    </head>
    <body>
        <div class="calculator J_calculater">
            <p>结果:<span class="result">0</span></p>
            <div class="input_wrap">
                <input type="text" value="0" class="num-input" placeholder="第一个数字"/>
                <input type="text" value="0" class="num-input" placeholder="第二个数字"/>
            </div>
            <div class="btn-group">
                <button data-method="plus">+</button>
                <button data-method="minus">-</button>
                <button data-method="mul">*</button>
                <button data-method="div">/</button>
            </div>
        </div>
    </body>
    <script type="module" src="./index.js"></script>
    </html>
</body>
</html>

index.js

848334c8df894f7c051ad96ec31dd72b.png

import Calculator from "./Calculator";
;((doc)=>{
    var oCalculator = document.getElementsByClassName("J_calculater")[0]
    const init=()=>{
        new Calculator(oCalculator).init()
    }
    init()
})(document)

 calculator.js

f6cc20d1d72a11b6e718bbc84544fc80.png

export default class Calculator {
    constructor(el) {
        this.name = "Calculator"
        this.oResult = el.getElementsByClassName("result")[0]
        this.oBtnGroup = el.getElementsByClassName("btn-group")[0]
        this.oInputs = el.getElementsByClassName("num-input")
    }
    init() {
        this.bindEvent()
    }
    bindEvent() {
        this.oBtnGroup.addEventListener("click", this.onBtnClick.bind(this), false)
    }
    onBtnClick(ev) {
        const e = ev || window.event,
            tar = e.target || e.srcElement,
            tagName = tar.tagName.toLowerCase();
        console.log(tagName)
        if (tagName === 'button') {
            const method = tar.getAttribute("data-method");
               var fval = Number(this.oInputs[0].value.replace(/\s+/g, ''))||0;
               var sval = Number(this.oInputs[1].value.replace(/\s+/g, ''))||0;
                switch (method) {
                    case 'plus':
                       this.oResult.innerText=fval+sval
                        break;
                    case 'minus':
                        this.oResult.innerText=fval-sval
                        break;
                    case 'mul':
                        this.oResult.innerText=fval*sval
                        break;
                    case 'div':
                        this.oResult.innerText=fval/sval
                        break;
                    default:
                        break
                }
        }
    }
}

 运行结果

f82dd5eff3540242057010da1932fbaf.png

1d597cf16ddeb586b2e8069d4b1c4b0b.png

355a0b88fb6837a0ae1f3a644d6c23d4.png

b1a04d59fddcfd1853bce2924dc793c8.png

07728e42f48375f6ac4ce5599e9d1c79.png

 变化1

829539765a9949002723b8f645a400ba.png

  caculater.js

c2f72ae37fdcbe9f9e23b3ce0f86d48a.png

import Compute from "./Compute"
export default class Calculator extends Compute {
    constructor(el) {
        super()
        this.name = "Calculator"
        this.oResult = el.getElementsByClassName("result")[0]
        this.oBtnGroup = el.getElementsByClassName("btn-group")[0]
        this.oInputs = el.getElementsByClassName("num-input")
    }
    init() {
        this.bindEvent()
    }
    bindEvent() {
        this.oBtnGroup.addEventListener("click", this.onBtnClick.bind(this), false)
    }
    onBtnClick(ev) {
        const e = ev || window.event,
            tar = e.target || e.srcElement,
            tagName = tar.tagName.toLowerCase();
        console.log(tagName)
        if (tagName === 'button') {
            const method = tar.getAttribute("data-method");
            console.log(method, "method is")
            var fval = Number(this.oInputs[0].value.replace(/\s+/g, '')) || 0;
            var sval = Number(this.oInputs[1].value.replace(/\s+/g, '')) || 0;
            this.setResult(method, fval, sval)
        }
    }
    setResult(method, fval, sval) {
        console.log(method, fval, sval)
        this.oResult.innerText = this[method](fval, sval)
    }
}

computed.js

e604723f9371aa908ff5a01141a53043.png

export default class Compute{
    plus(a,b){
        return a+b;
    }
    minus(a,b){
        return a-b
    }
    mul(a,b){
        return a*b
    }
    div(a,b){
        return a/b
    }
}

运行结果

2f260710a197ae5be55d50422d2c4d18.png

01c66cae5d11e0083092ea3de9f0439e.png

92e8061abf905f1f22e0f4f88b47d448.png

 变化二装饰器模式

8880cf17937fc4d6ed8d1ccfba92ed50.png

 配置

8072dfcd1f97d01264b85b9c876abc4c.png

{
    "presets": ["env"],
    "plugins": ["babel-plugin-transform-runtime","transform-decorators-legacy"]
}

 Caculator.js

d1e18014ca362753b5c5020014271747.png

import Compute from "./Compute"
@Compute
export default class Calculator {
    constructor(el) {
        this.name = "Calculator";
        this.oResult = el.getElementsByClassName("result")[0];
        this.oBtnGroup = el.getElementsByClassName("btn-group")[0];
        this.oInputs = el.getElementsByClassName("num-input");
    }
    init() {
        this.bindEvent()
    }
    bindEvent() {
        this.oBtnGroup.addEventListener("click", this.onBtnClick.bind(this), false)
    }
    onBtnClick(ev) {
        const e = ev || window.event,
            tar = e.target || e.srcElement,
            tagName = tar.tagName.toLowerCase();
        console.log(tagName)
        if (tagName === 'button') {
            const method = tar.getAttribute("data-method");
            console.log(method, "method is")
            var fval = Number(this.oInputs[0].value.replace(/\s+/g, '')) || 0;
            var sval = Number(this.oInputs[1].value.replace(/\s+/g, '')) || 0;
            this.setResult(method, fval, sval)
        }
    }
    setResult(method, fval, sval) {
        console.log(method, fval, sval)
        this.oResult.innerText = this[method](fval, sval)
    }
}

 Computed.js

3f0052f2aa8fc862be9daf0ec5d19dd3.png

export default (target) => {
    target.prototype.plus=function(a, b){
        return a + b;
    }
    target.prototype.minus=function(a, b){
        return a - b
    }
    target.prototype.mul=function(a, b){
        return a * b
    }
    target.prototype.div=function(a, b){
        return a / b
    }
}

index.js

f00c4bfb85a9b27fe663d710a5cfafc2.png

import Calculator from "./Calculator";
;((doc)=>{
    var oCalculator = document.getElementsByClassName("J_calculater")[0]
    const init=()=>{
        new Calculator(oCalculator).init()
    }
    init()
})(document)

 运行结果

ab65d4412faf1645a878572c5eb0902f.png

898303a0ac417d98d91dbb068ede3dc3.png

 最终结构目录

f6649f1b9c8fe4b418a848a5881c1e4a.png

344c29c987f6ee6c2a0a17b0ef8a4f2c.png

 tool.js

a9165150c332bdec5483db0538c8690c.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>计算小案例</title>
    </head>
    <body>
        <div class="calculator J_calculater">
            <p>结果:<span class="result">0</span></p>
            <div class="input_wrap">
                <input type="text" value="0" class="num-input" placeholder="第一个数字"/>
                <input type="text" value="0" class="num-input" placeholder="第二个数字"/>
            </div>
            <div class="btn-group">
                <button data-method="plus">+</button>
                <button data-method="minus">-</button>
                <button data-method="mul">*</button>
                <button data-method="div">/</button>
            </div>
        </div>
    </body>
    
    </html>
</body>
</html>

 index.js

f6db719d02d39577d382ea862f58caa4.png

import Calculator from "./Calculator";
;((doc)=>{
    var oCalculator = document.getElementsByClassName("J_calculater")[0]
    const init=()=>{
        new Calculator(oCalculator).init()
    }
    init()
})(document)

 computed.js

1f95e45809b78b75068b4e53dcd0730b.png

// export default class Compute{
//     plus(a,b){
//         return a+b;
//     }
//     minus(a,b){
//         return a-b
//     }
//     mul(a,b){
//         return a*b
//     }
//     div(a,b){
//         return a/b
//     }
// }




export default (target) => {
    target.prototype.plus=function(a, b){
        return a + b;
    }
    target.prototype.minus=function(a, b){
        return a - b
    }
    target.prototype.mul=function(a, b){
        return a * b
    }
    target.prototype.div=function(a, b){
        return a / b
    }
}

 caculator.js

60db2fb48dda1b4c3cafbab80f0a7813.png

import Compute from "./Compute"
import {
    trimSpace,
    digitalize
} from "./tools"
@Compute
export default class Calculator {
    constructor(el) {
        this.name = "Calculator";
        this.oResult = el.getElementsByClassName("result")[0];
        this.oBtnGroup = el.getElementsByClassName("btn-group")[0];
        this.oInputs = el.getElementsByClassName("num-input");
    }
    init() {
        this.bindEvent()
    }
    bindEvent() {
        this.oBtnGroup.addEventListener("click", this.onBtnClick.bind(this), false)
    }
    onBtnClick(ev) {
        const e = ev || window.event,
            tar = e.target || e.srcElement,
            tagName = tar.tagName.toLowerCase();
        console.log(tagName)
        if (tagName === 'button') {
            const method = tar.getAttribute("data-method");
            console.log(method, "method is")
            var fval = digitalize(trimSpace(this.oInputs[0].value));
            var sval = digitalize(trimSpace(this.oInputs[1].value));
            this.setResult(method, fval, sval)
        }
    }
    setResult(method, fval, sval) {
        console.log(method, fval, sval)
        this.oResult.innerText = this[method](fval, sval)
    }
}

装饰器配置.babelrc

0700b4163b8727804a8254a4f4f3c0a9.png

{
    "presets": ["env"],
    "plugins": ["babel-plugin-transform-runtime","transform-decorators-legacy"]
}

 依赖

13f9ea5d30c0d09a29e11ce68a098ee4.png

{
  "name": "demo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev":"webpack-dev-server --config webpack.config.js",
    "webpack":"webpack --config webpack.config.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "babel-core": "^6.26.3",
    "babel-loader": "7",
    "babel-plugin-transform-decorators": "^6.24.1",
    "babel-plugin-transform-decorators-legacy": "^1.3.5",
    "babel-plugin-transform-runtime": "^6.23.0",
    "babel-preset-env": "^1.7.0",
    "css-loader": "^6.8.1",
    "ejs-loader": "^0.5.0",
    "html-webpack-plugin": "^5.5.3",
    "node-sass": "^9.0.0",
    "sass-loader": "^13.3.2",
    "style-loader": "^3.3.3",
    "webpack": "^5.89.0",
    "webpack-cli": "^5.1.4",
    "webpack-dev-server": "^4.15.1"
  }
}

 运行结果

394556509c880f006145f9f2a4f0e70d.png

6155786aed6480e1a15141822e3235be.png

b4c1ffef686aa8467b33e2d291a988e6.png

点击上方 蓝字 关注我们

下方查看历史文章

75c86c1fc84589d476841bc9ca5765e8.png

ES5计算器小案例

原型和原型链深入

原型和原型链

构造函数和实例化原理

构造函数和实例化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值