第五届字节跳动青训营 前端进阶学习笔记(二)JavaScript编码规范

news/2024/10/30 11:32:14/

文章目录

      • 1.前言
      • 2.写好JS的一些基本原则

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

1.前言

本次课程主要讲解了有关JavaScript编码原则和代码优化的相关问题。

重点内容:

  • HTML、CSS、JS各司其责
  • 具备正确性、扩展性、复用性的组件封装
  • 函数式编程思想
  • 代码优化

2.写好JS的一些基本原则

  • 各司其责
  • 组件封装
  • 过程抽象

各司其责

首先,良好的前端代码应该是HTML、CSS和JS三部分代码各司其责的,也就是各自控制各自所负责的部分。主要需要注意以下几点:

  • 避免不必要的由JS直接操作CSS
  • 使用class来切换样式而不是修改style
  • 能单独使用CSS实现的样式,尽量使用CSS,追求纯展示性内容0JS

比如在下面的一个例子中:

image.png

我们来实现一个深色模式切换的功能,通常会按照下面这种形式实现

image.png

这样当我们点击切换按钮的时候,页面就会切换到深色模式显示。

image.png

但是上述代码还存在很强的优化空间,首先,我们可以通过class来优化这一过程,减少DOM的操作次数。
image.png image.png

此外,我们还能使用纯CSS的方法来实现这一功能。借助label标签和:checked伪类的特性,我们在不借助JS代码的情况下,实现了切换界面深浅主题的功能。

image.png image.png

组件封装

组件设计的基本原则:封装性、正确性、扩展性、复用性

下面我们来封装一个轮播图组件

  • HTML结构:

image.png

  • CSS样式:

image.pngalt="image.png" />

- JS代码:

image.png
首先,构建轮播图组件的基本结构、展现效果和行为。

image.png
下一步,我们开始构建轮播图的控件,轮播图控件我们通过自定义事件的方式来控制原点控制的状态切换,以此来与轮播图组件解耦。

image.png

image.png
这里,我们在Silder的构造函数里,定义控件的方法。并且新增了start和stop方法,用来实现具体的控件行为。

class Slider {constructor(id, delay=3000) {this.container = document.querySelector(`#${id}`);this.sliders = document.querySelectorAll('.slider__item, .slider__item--selected');this.delay = delay;const controlContainer = document.querySelector('.slider__control');if(controlContainer) {const controls = document.querySelectorAll('.slider__control-item, .slider__control-item--selected');controlContainer.addEventListener('mouseover', evt=> {const idx = Array.from(controls).indexOf(evt.target);if(idx >= 0) {this.toslider(idx);this.stop();}});controlContainer.addEventListener('mouseout', evt=> {this.start();})this.container.addEventListener('silde', evt => {const idx = evt.detail.index;const selected = document.querySelector('.slider__control-item--selected');if(selected) {selected.className = 'slider__control-item';} controls[idx].className && (controls[idx].className = 'slider__control-item--selected');})}const pre = document.querySelector('.slider__control--previouse');if(pre) {pre.addEventListener('click', evt => {this.stop();this.preslider();this.start();evt.preventDefault();})}const next = document.querySelector('.slider__control--next');if(next) {next.addEventListener('click', evt => {this.stop();this.nexslider();this.start();evt.preventDefault();})}}getCurrent() {const current = document.querySelector('.slider__item--selected');return current;}getCurrentIndex() {return Array.from(this.sliders).indexOf(this.getCurrent());}toslider(idx) {const current = this.getCurrent();if(current) {current.className = 'slider__item';}this.sliders[idx] && (this.sliders[idx].className = 'slider__item--selected');const detail = {index: idx};const event = new CustomEvent('silde', {bubbles: true, detail});this.container.dispatchEvent(event);}preslider() {const idx = this.getCurrentIndex();this.toslider((this.sliders.length + idx - 1) % this.sliders.length);}nexslider() {const idx = this.getCurrentIndex();this.toslider((idx + 1) % this.sliders.length);}start() {this.stop();this.timer = setInterval(()=>this.nexslider(), this.delay);}stop() {clearInterval(this.timer);}}

至此一个基本的轮播图组件就封装完毕了。

image.png

在上面的实现过程中,我们在Slider类的构造函数中,定义了各个控件的所有行为,因此各控件的行为和Silder组件是高度耦合的。对此,我们需要将各个控件的行为单独封装为插件,然后通过安装插件的方式,将插件安装在组件上,以此来实现解耦。同时,若日后我们需要增加控件时,只需要添加相应的控件插件就行了。

image.png

image.png

image.png

image.png

在此基础上,我们还可以进一步对模板进行封装,即将控件对应的HTML代码也封装进插件中。

image.png

这样封装好之后,我们只需要一组HTML标签,就能展示整个轮播图组件了。

image.png

过程抽象

过程抽象就是利用函数式编程的思想来处理局部细节控制的一些方法。

  • 高阶函数

    • 以函数作为参数
    • 以函数作为返回值
    • 常用于作为函数装饰器
  • 常用高阶函数

    • Once
    • Throttle
    • Consumber
    • Iterative

http://www.ppmy.cn/news/12773.html

相关文章

2023年基建工程(设计规划施工)经验分享,超多干货

为了彻底打通从工程外业勘探调查、数据资料整理,到内业详细设计之间的一系列障碍,结合工程外业调查的特点,基于安卓(Android)操作系统,精心打磨推出了“外业精灵”移动端应用软件。 该系统把工程外业探勘、…

程序跑起来数据总是关闭及丢失?保存进文件里面美滋滋

文章目录前言文件是什么?程序文件数据文件文件名C语言中的文件打开和关闭文件指针文件的打开和关闭fopenfclose文件的顺序读写文件的随机读写fseekftellrewind文件读取结束的判定feof:我们之间可能有误会文件缓冲总结前言 我们或许都有这样的苦恼&#…

独立产品灵感周刊 DecoHack #044 - 新的一年如何管理你的时间

本周刊记录有趣好玩的独立产品设计开发相关内容,每周发布,往期内容同样精彩,感兴趣的伙伴可以点击订阅我的周刊。为保证每期都能收到,建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。本周看到了很多时间管理的工具类型产品&…

AcWing 4510. 寻宝!大冒险!(暴力枚举)

题目如下: 输入样例1: 5 100 2 0 0 1 1 2 2 3 3 4 4 0 0 1 0 1 0 1 0 0输出样例1: 3样例 111 解释 绿化图上 (0,0)(0,0)(0,0)、(1,1)(1,1)(1,1) 和 (2,2)(2,2)(2,2) 三处均可能埋有宝藏。 输入样例2: 5 4 2 0 0 1 1 2 2 3 3 …

输入测试内容

输入测试内容,历章789987章历

pytest学习——pytest插件的7种用法

1.pytest-repeat 重复跑 安装包 pip install pytest-repeat 第一种用法: 装饰器 pytest.mark.repeat(次数) 示例代码 import pytest pytest.mark.repeat(5) def test_001(): assert 12 if __name__ __main__: pytest.main([-sv,__file__]) 第二种用法&#xff1…

Android应用模块化开发指南

Android应用模块化开发指南 包含多个Gradle模块的项目称为多模块项目。本文包含多模块应用项目的最佳实践和推荐模式。 代码规模变大带来的问题 可扩缩性、可读性和整体代码质量会随着时间的推移而降低,代码维护者未采取积极的措施来保持易于维护的结构。模块化是…

【手写 Vue2.x 源码】专栏目录与重构规划

一,前言 之前参加了很多更文活动,所以就写了不少水文,今年计划投入大量时间做重构,争取达成以下几个目标: 第一,提升专栏的内容质量,能够真正帮助更多有需要的伙伴;第二&#xff0…