ES之module

news2024/11/29 9:42:01

模块:一个一个的局部作用域的代码块

模块系统需要解决的主要问题

  • 模块化的问题
  • 消除全局变量
  • 管理加载顺序

Module的基本用法

模块里面都是局部无法访问

切换幻灯片示例

Base.js

// 默认参数
const DEFAULTS = {
    // 初始索引
    initialIndex: 0,
    // 切换时是否有动画
    animation: true,
    // 切换速度,单位 ms
    speed: 300
};
// base
const ELEMENT_NODE = 1;
const SLIDER_ANIMATION_CLASSNAME = 'slider-animation';

// 父类
class BaseSlider {
    constructor(el, options) {
        console.log(options)
        if (el.nodeType !== ELEMENT_NODE)
            throw new Error('实例化的时候,请传入 DOM 元素!');

        // 实际参数
        this.options = {
            ...DEFAULTS,
            ...options
        };

        const slider = el;
        const sliderContent = slider.querySelector('.slider-content');
        const sliderItems = sliderContent.querySelectorAll('.slider-item');

        // 添加到 this 上,为了在方法中使用
        this.slider = slider;
        this.sliderContent = sliderContent;
        this.sliderItems = sliderItems;

        this.minIndex = 0;
        this.maxIndex = sliderItems.length - 1;
        this.currIndex = this.getCorrectedIndex(this.options.initialIndex);

        // 每个 slider-item 的宽度(每次移动的距离)
        this.itemWidth = sliderItems[0].offsetWidth;

        this.init();
    }

    // 获取修正后的索引值
    // 随心所欲,不逾矩
    getCorrectedIndex(index) {
        if (index < this.minIndex) return this.maxIndex;
        if (index > this.maxIndex) return this.minIndex;
        return index;
    }

    // 初始化
    init() {
        // 为每个 slider-item 设置宽度
        this.setItemsWidth();

        // 为 slider-content 设置宽度
        this.setContentWidth();

        // 切换到初始索引 initialIndex
        this.move(this.getDistance());

        // 开启动画
        if (this.options.animation) {
            this.openAnimation();
        }
    }

    // 为每个 slider-item 设置宽度
    setItemsWidth() {
        for (const item of this.sliderItems) {
            item.style.width = `${this.itemWidth}px`;
        }
    }

    // 为 slider-content 设置宽度
    setContentWidth() {
        this.sliderContent.style.width = `${
            this.itemWidth * this.sliderItems.length
        }px`;
    }

    // 不带动画的移动
    move(distance) {
        this.sliderContent.style.transform = `translate3d(${distance}px, 0px, 0px)`;
    }

    // 带动画的移动
    moveWithAnimation(distance) {
        this.setAnimationSpeed(this.options.speed);
        this.move(distance);
    }

    // 设置切换动画速度
    setAnimationSpeed(speed) {
        this.sliderContent.style.transitionDuration = `${speed}ms`;
    }

    // 获取要移动的距离
    getDistance(index = this.currIndex) {
        return -this.itemWidth * index;
    }

    // 开启动画
    openAnimation() {
        this.sliderContent.classList.add(SLIDER_ANIMATION_CLASSNAME);
    }

    // 关闭动画
    closeAnimation() {
        this.setAnimationSpeed(0);
    }

    // 切换到 index 索引对应的幻灯片
    to(index) {
        index = this.getCorrectedIndex(index);
        if (this.currIndex === index) return;

        this.currIndex = index;
        const distance = this.getDistance();

        if (this.options.animation) {
            return this.moveWithAnimation(distance);
        } else {
            return this.move(distance);
        }
    }

    // 切换上一张
    prev() {
        this.to(this.currIndex - 1);
    }

    // 切换下一张
    next() {
        this.to(this.currIndex + 1);
    }

    // 获取当前索引
    getCurrIndex() {
        return this.currIndex;
    }
}

export default BaseSlider;

slider.js

import BaseSlider from "./base.js";

// 子类
class Slider extends BaseSlider {
    constructor(el, options) {
        super(el, options);

        this._bindEvent();
    }

    _bindEvent() {
        document.addEventListener('keyup', ev => {
            // console.log(ev.keyCode);
            if (ev.keyCode === 37) {
                // ←
                this.prev();
            } else if (ev.keyCode === 39) {
                // →
                this.next();
            }
        });
    }
}

export default Slider;

index.js

import Slider from "./slider.js";
new Slider(document.querySelector('.slider'), {
    initialIndex: 1,
    animation: true,
    speed: 1000
});

slider.css

/* css reset */
* {
    padding: 0;
    margin: 0;
}
a {
    text-decoration: none;
    outline: none;
}
img {
    vertical-align: top;
}

/* layout */
.slider-layout {
    width: 80%;
    height: 420px;
    margin: 0 auto;
}

/* slider */
.slider,
.slider-content,
.slider-item,
.slider-img {
    width: 100%;
    height: 100%;
}
.slider {
    overflow: hidden;
}
.slider-item {
    float: left;
}
.slider-animation {
    transition-property: transform;
    transition-duration: 0ms;
}

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Class 的应用</title>
    <link rel="stylesheet" href="css/slider.css"/>
</head>
<body>
<div class="slider-layout">
    <div class="slider">
        <div class="slider-content">
            <div class="slider-item">
                <a href="javascript:;"
                ><img src="imgs/1.jpeg" alt="1" class="slider-img"
                /></a>
            </div>
            <div class="slider-item">
                <a href="javascript:;"
                ><img src="imgs/2.jpeg" alt="1" class="slider-img"
                /></a>
            </div>
            <div class="slider-item">
                <a href="javascript:;"
                ><img src="imgs/3.jpeg" alt="1" class="slider-img"
                /></a>
            </div>
            <div class="slider-item">
                <a href="javascript:;"
                ><img src="imgs/4.jpeg" alt="1" class="slider-img"
                /></a>
            </div>
        </div>
    </div>
</div>

<script src="js/index.js" type="module"></script>
</body>
</html>

一个文件就是一个模块,只要你会用到import或export,在使用script标签加载的时候,就要加上type="module"

export default和import from注意事项

  • 一个模块只能有一个export default
  • 一个模块没有导出也可以将其导入 直接import就行
  • 被导入的代码都会执行一遍,也仅会执行一遍
  • 导出export default age,导入import aaa from '/js/module.js' 导入名字可以为aaa与age对应

export和import注意事项 

  • export声明或语句 export const age=18;/export {age};两种导出方式 import {age} from '/js/module.js'(不能随意命名,名字必须相同)
// 记住导出不能匿名
// 多个导出
// export function fn(){};
// export class className{};
// export const age=18;

function fn(){};
class className{};
const age=18;
export {fn as func,className,age};
export default 18;
<script type="module">
    // 1.导出导入起别名
    import {func, className as Person, age} from "./js/module.js";

    // 2.整体导入
    // 会导入所有输出,包括通过export default导出的
    import * as obj from "./js/module.js";

    // 3.同时导入
    // 要求:一定是export default在前
    // import age2,{func, className as Person, age} from "./js/module.js";
    console.log(Person);
    console.log(func);
    console.log(obj);
</script>

 

Module的注意事项

  • 模块顶层的注意事项
  • 模块中,顶层的this指向undefined
  • import关键字和import()函数
  • import命令具有提升效果,会提升到整个模块的头部,率先执行(import执行时,代码块还没执行)
  • import()可以按条件导入,import()返回的是一个Promise对象
  • 导入导出的复合写法
//复合写法导出的,无法在当前模块中使用
export {age} from './module.js';
console.log(age);

// 等价于下面两个
//import {age} from './module.js';
//export {age} from './module.js';
//可以在当前模块中使用
//console.log(age);

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Repvgg推理时融合BN

Batch Normalization是谷歌研究员于2015年提出的一种归一化方法&#xff0c;其思想非常简单&#xff0c;一句话概括就是&#xff0c;对一个神经元&#xff08;或者一个卷积核&#xff09;的输出减去统计得到的均值&#xff0c;除以标准差&#xff0c;然后乘以一个可学习的系数&…

数字孪生|可视化图表之堆叠面积图

上一篇文章为大家介绍了分组条形图的相关内容&#xff0c;本文介绍的是堆叠面积图。 堆叠面积图是一种特殊的面积图&#xff0c;可以用来比较在一个区间内的多个变量。堆叠面积图和普通的面积图基本一样&#xff0c;唯一的区别就是堆叠面积图每个数据系列的起点都是基于前一个数…

再学C语言30:函数——ANSI C的函数原型

一、ANSI C关于函数原型的规则 ANSI C在函数声明中同事说明所使用的的参数类型&#xff0c;即在函数原型中声明返回值类型、参数、参数个数、参数类型 int function(int a, int b); // 形式一 int function(int, int); // 形式二// 以上两种形式的定义均满足规范要求 好…

基于无线通信物联网的水库安全监测系统

水库安全监测一直是我国防洪防汛工作的重点&#xff0c;库区的雨量、水位的实时监测&#xff0c;建立水库监测系统能够有效防止洪涝灾害的发生&#xff0c;确保水库和下游地区的安全。 物通博联推出的水库安全监测系统是基于无线通信物联网技术打造的系统平台&#xff0c;由雨…

路由器基础

交换机基本功能 1.基于源MAC地址学习2.基于目标MAC地址转发3.数据过滤4.防环 交换机基于MAC地址表进行转发&#xff0c;MAC地址表默认自动产生&#xff0c;MAC地址组成三元组&#xff1a;Mac地址、端口、VLAN。默认MAC条目信息存活时间为300s并且可以修改 泛洪&#xff08;洪…

局域网主机状态管理工具LanNeighborManager

有鉴于以下两种需求&#xff0c;做了一个小工具&#xff0c;查看局域网内的IP占用情况及联通状态&#xff1a;1&#xff09;在现场需要分配静态IP&#xff0c;但是不确定已经被占用的IP地址&#xff1b;2&#xff09;查看当前局域网内当前活跃的IP地址。该工具的主要功能有&…

华宏转债上市价格预测

华宏转债基本信息转债名称&#xff1a;华宏转债&#xff0c;评级&#xff1a;AA-&#xff0c;发行规模&#xff1a;5.15亿元。正股名称&#xff1a;华宏科技&#xff0c;今日收盘价&#xff1a;17.68&#xff0c;转股价格&#xff1a;15.65。当前转股价值 转债面值 / 转股价格…

2023.1.2-1.18 AI行业周刊(第131期):程序员的艰辛和感悟

转眼间&#xff0c;还有两周不到的时间&#xff0c;就要到除夕了。今年的春节和元旦离得很近&#xff0c;只有二十多天的时间。 班上部门的同事&#xff0c;一个个也都开始阳康&#xff0c;回到工作岗位&#xff0c;做春节前产品的最后一次版本迭代。 一晃从去年三月份进入新…

3-计算字符串的编辑距离(华为机试)

题目 Levenshtein 距离&#xff0c;又称编辑距离&#xff0c;指的是两个字符串之间&#xff0c;由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符&#xff0c;插入一个字符&#xff0c;删除一个字符。编辑距离的算法是首先由俄国科学…

Bonitasoft认证绕过和RCE漏洞分析及复现(CVE-2022-25237)

一、漏洞原理 漏洞简述 Bonitasoft 是一个业务自动化平台&#xff0c;可以更轻松地在业务流程中构建、部署和管理自动化应用程序&#xff1b; Bonita 是一个用于业务流程自动化和优化的开源和可扩展平台。 Bonita Web 2021.2版本受到认证绕过影响&#xff0c;因为其API认证…

没有为请求的 URL 配置默认文档,并且没有在服务器上启用目录浏览

1、问题 使用asp.net mvc写了个网站&#xff0c;部署后出现&#xff1a; 没有为请求的 URL 配置默认文档&#xff0c;并且没有在服务器上启用目录浏览 这个问题 2、解决办法 网上搜了下&#xff0c;无非是两种方法&#xff1a; 1、在web.config中添加 <system.webServ…

概率论【合集】--猴博士爱讲课

重点章节 条件概率&#xff0c;期望等等 第一课 随机事件和概率 1/6 无放回类题目(一次摸多个) 例1.盒子里有3绿4红共7个小球&#xff0c;无放回的摸3个试求摸出1绿2红的概率例2.钱包里有3张100元&#xff0c;5张10元&#xff0c;3张5元的纸币&#xff0c;随机摸3张&#xff0…

excel图表美化:堆栈式柱状图让趋势变化更明显

平时大家都是怎么做图表的呢&#xff1f;是不是直接在Excel上点击插入图表&#xff0c;就完事儿了&#xff1f;虽然这样也能做出图表&#xff0c;但是必定没什么亮点&#xff0c;老板看久了&#xff0c;自然也就腻了&#xff01;我们每个人都想让自己的的图表看起来漂亮&#x…

BGP基础实验(1.10)

目标: 1、首先为所有路由器配置接口ip和环回 r1&#xff1a; [r1]int lo0 [r1-LoopBack0]ip add 1.1.1.1 24 [r1-LoopBack0]int gi 0/0/0 [r1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 r2&#xff1a; [r2]int lo0 [r2-LoopBack0]ip add 2.2.2.2 24 [r2-LoopBack0]int gi …

怎么开发自己的微信小程序_微信小程序快速开发步骤

小程序开发除了专业人士会自己开发之外&#xff0c;就是外包开发和模板搭建这两种方法。 外包小程序开发需要持续不断地与外包团队沟通&#xff0c;投入的精力也不少&#xff0c;总体价格不低&#xff0c;基本在万元左右&#xff0c; 最适合新手的还是小程序模板搭建啦~ 微信怎…

JAVA---泛型

一、什么是泛型 Java的泛型 (generics) 是在JDK5中推出的新概念&#xff0c;在泛型推出之前&#xff0c;程序员需要构建一个元素为Object的集合&#xff0c;该集合能够存储任意的数据类型对象&#xff0c;而在使用该集合的过程中&#xff0c;需要程序员明确知道存储每个元素的数…

Qt OpenGL(07)通过递归细分绘制球面

文章目录Qt OpenGL通过递归细分逼近球面思路下面就是绘制的代码&#xff1a;Widget.cpp顶点着色器片段着色器Qt OpenGL通过递归细分逼近球面 在OpenGL中绘制球面&#xff0c;不是太简单的事情。因为球面和圆都不是OpenGL所支持的图元&#xff0c;因此我们将通过一种称为递归细分…

年货小史:最土年货中藏着最真实的烟火气

农历新年很快就要到了&#xff0c;这让我有些恍惚&#xff0c;觉得从前那个满是烟火的新年&#xff0c;仿佛已经是很遥远的事了。几家电商平台最近又开始了红红火火的年货节&#xff0c;上去转了转&#xff0c;几个平台看下来&#xff0c;拼多多的“年味”似乎最贴近记忆中的烟…

MySQL的锁机制之全局锁和表锁

文章目录前言一、全局锁全局锁的介绍以及使用全局锁的应用场景不加锁导致的危害加锁和其他方法对比二、表锁表锁的介绍以及使用表锁的应用场景前言 对mysql锁的总结学习&#xff0c;本文将围绕&#xff0c;加锁的概念&#xff0c;加锁的应用场景和优化&#xff0c;以及不加锁会…

【C进阶】第十四篇——字符串函数

strlen - 求字符串长度 函数介绍 模拟实现(三种方式) strcpy - 字符串拷贝 函数介绍 模拟实现 strcat - 字符串追加 函数介绍 模拟实现 strcmp - 字符串比较 函数介绍 模拟实现 strstr - 字符串查找 函数介绍 模拟实现 strtok - 字符串分割 函数介绍 strerror…