Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ES6模块化开发计算器

ES6模块化开发计算器

作者头像
爱学习的前端歌谣
发布于 2023-11-20 08:07:37
发布于 2023-11-20 08:07:37
14000
代码可运行
举报
文章被收录于专栏:前端小歌谣前端小歌谣
运行总次数:0
代码可运行

前言

大家好 我是歌谣 今天继续延续上一节课程的编写 本次要说模块化 将html的文件分块拼装上去

目录结构

caculator.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import Compute from "./Compute"
import ResultComponent from "./Header";
import InputGroupComponent from "./Middle";
import BtnGroupComponent from "./Footer";
import {
    trimSpace,
    digitalize
} from "./tools"
@Compute
export default class Calculator {
    constructor(el) {
        this.name = "Calculator";
        this.el = el
        this.resultComponent = new ResultComponent()
        this.inputGroupComponent = new InputGroupComponent()
        this.btnGroupComponent = new BtnGroupComponent()
    }
    init() {
        this.render()
        this.bindEvent()
    }
    render() {
        const oFrag = document.createDocumentFragment()
        oFrag.append(this.resultComponent.tpl())
        oFrag.append(this.inputGroupComponent.tpl())
        oFrag.append(this.btnGroupComponent.tpl())
        this.el.appendChild(oFrag)
    }
    bindEvent() {
        const el=this.el
        this.oResult = el.getElementsByClassName("result")[0];
        this.oBtnGroup = el.getElementsByClassName("btn-group")[0];
        this.oInputs = el.getElementsByClassName("num-input");
        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)
    }
}

compute.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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
    }
}

index.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!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">
            
        </div>
    </body>
    
    </html>
</body>
</html>

index.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import Calculator from "./Calculator";
;((doc)=>{
    var oCalculator = document.getElementsByClassName("J_calculater")[0]
    const init=()=>{
        new Calculator(oCalculator).init()
    }
    init()
})(document)

局部tpl文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<button data-method="plus">+</button>
 <button data-method="minus">-</button>
 <button data-method="mul">*</button>
<button data-method="div">/</button>

配合tpl文件的js文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tpl from "./index.tpl"
export default class BtnGroupComponent{
    constructor(){
        this.name="BtnGroupComponent"
    }
    tpl(){
        const oDiv=document.createElement("div")
        oDiv.className='btn-group'
        oDiv.innerHTML=tpl()
        return oDiv
    }
}

依赖配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const HtmlWebpackPlugin = require('html-webpack-plugin')
path = require("path")
module.exports = {
    mode: 'development',
    entry: {
        index: path.resolve(__dirname, "./index.js")
    },
    output: {
        path: path.resolve(__dirname + "/dist"),
        filename: 'js/[name].js'
    },
    module: {
        rules: [{
            test: /\.js$/,
            loader: 'babel-loader',
            exclude: path.resolve(__dirname, "node_modules"),
        },
        {
            test: /\.css$/,
            use: [
                'style_loader',
                'css_loader'
            ]
        },
        {
            test: /\.scss$/,
            use: [
                'style_loader',
                'css_loader',
                'scss-loader'
            ]
        },
        {
            test: /\.tpl$/,
            use: [
                {
                    loader: 'ejs-loader',
                    options: {
                        esModule: false,
                        variable: 'data',
                    },
                },
            ],
        }
       ]
   
    },
    plugins: [
        new HtmlWebpackPlugin({
            filename: 'index.html',
            template: path.resolve(__dirname, "./index.html"),
            chunks: ['index'],
            excludeChunks: ['node_modules']
        })
    ],
    devServer: {
        open: true,
        host: "localhost",
        port: "3002"
    }
}

运行结果

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端小歌谣 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
说一说 @Autowired 注解实现原理
使用Spring开发时,进行配置主要有两种方式,一是xml的方式,二是java config的方式。 Spring技术自身也在不断的发展和改变,从当前SpringBoot的火热程度来看,java config的应用是越来越广泛了,在使用java config的过程当中,不可避免的会有各种各样的注解打交道,其中,使用最多的注解应该就是@Autowired注解了。这个注解的功能就是注入一个定义好的bean。 那么,这个注解除了常用的属性注入方式之外还有哪些使用方式呢?它在代码层面又是怎么实现的呢?
程序员小假
2025/06/19
510
说一说 @Autowired 注解实现原理
面试官:Spring中的注解@Autowired是如何实现的
现在面试,基本上都是面试造火箭????,工作拧螺丝????。而且是喜欢问一些 Spring 相关的知识点,比如 @Autowired 和 @Resource 之间的区别。魔高一丈,道高一尺。很快不少程
业余草
2021/12/06
4180
面试官:Spring中的注解@Autowired是如何实现的
Spring中@Autowired和@Resource的区别
最近有非常多的小伙伴从大厂毕业了,导致招聘也卷得相当厉害,不管是应届生、中开、高开,都会问技术原理。还经常问一些日常开发不太需要了解的知识点对比。今天,就给大家分享一个应届生被问到的一道面试题,在Spring中,@Autowired注解和@Resource注解的区别。
Tom弹架构
2022/08/22
3420
Spring中@Autowired和@Resource的区别
Spring 中 @Autowired 和 @Resource 的区别
@Autowired注解是由Spring提供的,它可以用来对构造方法、成员变量及方法参数进行标注,它能够根据对象类型完成自动注入,代码如下。
程序猿DD
2023/08/09
2550
Spring 中 @Autowired 和 @Resource 的区别
精进Spring—Spring常用注解【经典总结】
Spring的一个核心功能是IOC,就是将Bean初始化加载到容器中,Bean是如何加载到容器的,可以使用Spring注解方式或者Spring XML配置方式。
Java编程指南
2019/10/23
5410
精进Spring—Spring常用注解【经典总结】
注解@Autowired是如何实现的
使用spring开发时,进行配置主要有两种方式,一是xml的方式,二是java config的方式。spring技术自身也在不断的发展和改变,从当前springboot的火热程度来看,java config的应用是越来越广泛了,在使用java config的过程当中,我们不可避免的会有各种各样的注解打交道,其中,我们使用最多的注解应该就是@Autowired注解了。这个注解的功能就是为我们注入一个定义好的bean。那么,这个注解除了我们常用的属性注入方式之外还有哪些使用方式呢?它在代码层面又是怎么实现的呢?这是本篇文章着重想讨论的问题。
chengcheng222e
2021/11/04
7570
思尐-ChatGPT:你不懂可以来问我啊!
Hello,大家好,我是java小面。不知道大家有没有自己实现过一个注解来替换Spring原有注解的经历,有人说Spring不是有注解给你用吗?干嘛还要特地的去实现一个来替换呢?
灬沙师弟
2023/03/07
1990
思尐-ChatGPT:你不懂可以来问我啊!
Spring 自定义注解你了解过吗?
https://juejin.im/post/5cf376e16fb9a07eee5eb6eb
南风
2020/09/11
5820
@Autowired、@Qualifier、@Resource
根据目标Java类型完成自动装配的工作,该注解等于@Autowired(required = true)。
收心
2022/11/14
7360
springboot 自定义注解 入参赋值
        主要有@Target,@Retention,@Document,@Inherited 用来修饰注解。
用户5899361
2022/11/14
1.3K0
使用 Spring 中的 @Lazy 注解
只有一个参数,默认是true,也就是说只要加了这个注解就会延迟加载。 @Lazy注解则必须在第一次调用的时候才会加载。 @Lazy注解注解的作用主要是减少springIOC容器启动的加载时间。
一个会写诗的程序员
2021/03/02
2K0
Spring注解
自动按照类型注入。当ioc容器中有且只有一个类型匹配时可以直接注入成功。当有超过一个匹配时,则使用变量名称(写在方法上就是方法名称)作为bean的id,在符合类型的bean中再次匹配,能匹配上就可以注入成功。当匹配不上时,是否报错要看required属性的取值。
酒楼
2023/11/13
2210
【Spring编程细节】Autowired注入的变量怎样存在的?
最近的一项工作内容是将旧系统较为原生的框架升级到Spring boot 2.7.x,模块的变化见下图。
花花Binki
2024/03/04
2750
【Spring编程细节】Autowired注入的变量怎样存在的?
《面试1v1》java注解
我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。
JavaPub
2023/08/05
1580
《面试1v1》java注解
Spring系列第十七讲 深入理解Java注解及Spring对注解的增强(上)
代码中注释大家都熟悉吧,注释是给开发者看的,可以提升代码的可读性和可维护性,但是对于java编译器和虚拟机来说是没有意义的,编译之后的字节码文件中是没有注释信息的;而注解和注释有点类似,唯一的区别就是注释是给人看的,而注解是给编译器和虚拟机看的,编译器和虚拟机在运行的过程中可以获取注解信息,然后可以根据这些注解的信息做各种想做的事情。比如:大家对@Override应该比较熟悉,就是一个注解,加在方法上,标注当前方法重写了父类的方法,当编译器编译代码的时候,会对@Override标注的方法进行验证,验证其父类中是否也有同样签名的方法,否则报错,通过这个注解是不是增强了代码的安全性。
易兮科技
2020/11/24
1.3K0
Spring系列第十七讲 深入理解Java注解及Spring对注解的增强(上)
【Spring注解驱动开发】如何实现方法、构造器位置的自动装配?我这样回答让面试官很满意!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2020/10/29
4780
Java5 注解(Annotation)
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。注解是结合反射来运行的,注解相当于一个标识,不做具体的操作,具体操作是由反射来完成的。
HLee
2021/05/26
7370
Java5 注解(Annotation)
@Target注解和@Retention注解
对这两个注解不明白的可以参考: @Target:注解的作用目标 @Target(ElementType.TYPE)——接口、类、枚举、注解 @Target(ElementType.FIELD)——字段、枚举的常量 @Target(ElementType.METHOD)——方法 @Target(ElementType.PARAMETER)——方法参数 @Target(ElementType.CONSTRUCTOR) ——构造函数 @Target(ElementType.
向着百万年薪努力的小赵
2022/12/02
7530
@Target注解和@Retention注解
@Autowired注解到底怎么实现的,你能说清楚么?
使用spring开发时,进行配置主要有两种方式,一是xml的方式,二是java config的方式。
Java小咖秀
2021/07/12
6910
Spring源码分析(十五)Spring中常用注解使用以及源码分析
从Java5.0开始,Java开始支持注解。Spring做为Java生态中的领军框架,从2.5版本后也开始支持注解。相比起之前使用xml来配置Spring框架,使用注解提供了更多的控制Spring框架的方式。
石臻臻的杂货铺[同名公众号]
2021/07/14
5980
相关推荐
说一说 @Autowired 注解实现原理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验