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

news2024/11/26 11:53:30

文章目录

      • 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.coloradmin.cn/o/167762.html

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

相关文章

进程、线程及python的多线程编程

目录 一.进程、线程和并行执行 1.什么是进程、线程 注意 2.什么是并行执行 二.python的多线程编程 threading模块 语法 多线程编程的传参 演示 三.总结 一.进程、线程和并行执行 1.什么是进程、线程 现代操作系统比如Mac OS X,UNIX, Linux, Windows等,都是…

CSC|2023年艺术类人才培养特别项目解读及建议

目前国家留学基金委(CSC)官网已经发布了2023年艺术类人才培养特别项目通知,知识人网小编现将其选派工作流程、选派办法、申请材料及说明(访问学者、博士后)原文转载并加以解读、提出建议。知识人网解读及建议一、2023年…

新产品Digi XBee RR无线模块迁移指南

(咨询申请 - 上海皕科电子有限公司--专注物联网 登记后,可提供相关资料,购买XBee模块,有机会获得USB评估底板及相关中文资料,或者免费申请借用评估套件) 目录 一、简介 1、MicroPython 2、蓝牙 3、文件…

SpringBoot+easypol前后端分离实现excel导出(保姆级教程)

本篇博文目录1.后端2.前端(采用axios)3.运行效果1.后端 导入easypoi的依赖 <!--用来处理POL相关的操作:easypol--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.2.0</version&…

Cadence OrCAD: 层次化设计中的电源和地符号

Cadence OrCAD: 层次化设计中的电源和地符号 层次化设计操作步骤&#xff1a;Cadence OrCAD: 层次化设计 Hierarchical Design 本文介绍一个小问题&#xff1a;分层设计中的电源和地符号的作用范围。 电源符号默认作用范围 OrCAD中电源和地符号默认是全局的&#xff0c;也就…

2023年1月中国数据库排行榜:OceanBase 持续两月登顶,前四甲青云直上开新局

一元复始&#xff0c;万象更新。 国产数据库在经历过耕获菑畲的一年后&#xff0c;产品、生态、人才队伍建设等都取得了重大的进展。2023年1月 墨天轮中国数据库流行度排行 火热出炉&#xff0c;本月排行榜“属性”列新增“多模型”&#xff0c;榜单前十名变动较小&#xff0c;…

基于springboot,vue影院订票系统

开发工具&#xff1a;IDEA服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8项目构建&#xff1a;maven数据库&#xff1a;mysql5.7系统用户前台和管理后台两部分&#xff0c;项目采用前后端分离前端技术&#xff1a;vue elementUI服务端技术&#xff1a;springbootmybatis项目功…

JAVA开发(Netty框架与NIO)

所谓IO即input和output的缩写&#xff0c;是对数据的流入和流出的一种抽象。其中NIONIO主要有三大核心部分&#xff1a;Channel&#xff08;通道&#xff09;&#xff0c;Buffer&#xff08;缓冲区&#xff09;,Selector&#xff08;选择器&#xff09;。Channel(通道)&#xf…

Day54 跨域CORS资源JSONP回调域名接管劫持

前言&#xff1a; #知识点&#xff1a; 1、子域名接管-检测&探针&利用 2、COSP跨域资源-检测&探针&利用 3、JSONP跨域回调-检测&探针&利用 #前置知识点&#xff1a; -同源策略(SOP)-“同源”包括三个条件&#xff1a;同协议 同域名 同端口 同源策…

C/C++之(五)洛谷刷题基础题 --- 新年好

学习之路&#xff0c;长路漫漫&#xff0c;写学习笔记的过程就是把知识讲给自己听的过程。 唯有热爱&#xff0c;可抵岁月漫长&#xff0c;唯有热爱&#xff0c;不畏世间无常&#xff01; 新的一年祝你大展宏“兔” 新的一年&#xff0c;大家记得不要忘记刷题(⊙o⊙)&#xff…

NTN(四) RRC related

微信同步更新欢迎关注同名modem协议笔记。 这篇主要是与RRC层相关的内容&#xff0c;按照cell selection/re-selection->idle->connected 的顺序&#xff0c;对涉及NTN的内容进行总结。首先看下NTN RF相关的内容&#xff0c;这部分对应38.101-5这本spec。 NTN freq inf…

操作系统面试题(史上最全、持续更新)

尼恩面试宝典专题40&#xff1a;操作系统面试题&#xff08;史上最全、持续更新&#xff09; 本文版本说明&#xff1a;V28 《尼恩面试宝典》升级规划为&#xff1a; 后续基本上&#xff0c;每一个月&#xff0c;都会发布一次&#xff0c;最新版本&#xff0c;可以联系构师尼…

一个高效的通用光学卫星数据正射校正程序

李国春 随着高分辨率对地观测卫星发射的日益增多&#xff0c;对数据处理软件的要求也越来越高。通常每个系列卫星都有自己的数据特点并需要专门的处理软件&#xff0c;但卫星数量的增加为每种卫星单独设计软件的压力越来越大。本文介绍的一种处理方案旨在能够正射校正处理大多…

矩阵形状的读取和改变ndarray.shape()方法

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】矩阵形状的读取和改变ndarray.shape()方法[太阳]选择题以下说法正确的是&#xff1a;import numpy as np a np.array([[1,2,3],[4,5,6]])print("【显示】a\n",a)print("【显示】…

【第十六篇】Camunda系列-动态表单

动态表单 接下来我们看看动态表单的应用,在Camunda中表单分为内置表单和动态表单。 1.内置表单 内置表单就是在绘制流程图的时候同时绘制表单。这种方式其实就是绑定了对应的流程变量,不是太灵活。但还是来讲解下。 1.1 启动流程绑定 我们先来看下在启动流程的时候就设置相…

点击化学Alkynyl Myristic COOH,82909-47-5,13-十四炔酸

基础产品数据&#xff08;Basic Product Data&#xff09;&#xff1a;CAS号&#xff1a;82909-47-5中文名&#xff1a;炔基-肉豆蔻酸&#xff0c;13-十四炔酸英文名&#xff1a;Alkynyl Myristic Acid&#xff0c;Alkynyl Myristic COOH试剂基团反应特点&#xff08;Reagent g…

c++模板,选择排序,字符数组,字符串

目录 1.模板 1.1模板概念 1.2.函数模板 1.2.1函数模板语法&#xff0c;函数模板的调用--1.自动类型推导&#xff0c;2.显示指定类型 1.2.2函数模板注意事项 ​编辑 1.2.3函数模板的案例&#xff0c;选择排序&#xff0c;字符数组&#xff0c;字符串 1.2.4普通函数与函数…

C语言中的回调函数 和 函数指针

以冒泡排序为例&#xff1a; void sort(int *a, int size) {int i, j;for (i 0; i < size-1; i){for (j 0; j < size - i - 1; j){if (a[j] > a[j1]){int num a[j];a[j] a[j1];a[j1] num;}}}}int main(){int arr[9] {1,2,3,4,5,6,7,8,9};sort(arr, 9); // sort…

列表元素的最大值,最小值,出现的次数和列表长度

1 获取列表中的最大元素和最小元素&#xff1a; 使用max和min可以分别获取一个列表中最大元素和最小元素的值&#xff0c;其语法格式为&#xff1a; max(list) 和min(list) 例&#xff1a;ls[12,34,56,87]#创建列表并赋给ls print(ls中最大元素值为&#xff1a;max(ls))#输出…

JDY-10M BLE组网模块介绍

JDY-10M BLE组网模块简介JDY-10透传模块是基于蓝牙4.0协议标准&#xff0c;工作频段为2.4GHZ范围&#xff0c;调制方式为GFSK&#xff0c;最大发射功率为8db&#xff0c;最大发射距离50米&#xff0c;具有功耗低、尺寸小、信号强、数据传输稳定等特性。JDY-10M BLE组网模块特征…