如何写好JavaScript|青训营笔记

61 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第6天

写好JS的一些原则

各司其职: 让HTML,CSS,和JavaScript只能分离

案例: 写一段JS, 控制一个页面, 让它支持浅色和深色两种浏览模式, 如果你来实现, 你会怎么做.

新人版本: JS直接操作DOM, 修改字体颜色, 修改文本内容. 这是不可取的, 违反了"各司其职"的有原则

优化版本: 减少JS对DOM的操作. 在CSS中书写"浅色模式"与"深色模式"两种样式的CSS, 然后通过JS修改类名className方式,来切换样式模式.

终极版本: 不写JS代码. 通过checkbox来扩展其作用范围到夜间切换的小图标, 然后在CSS中 通过点击下图标改变checkbox的状态来给content加上另一种反色样式

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .content {
            width: 100px;
            height: 100px;
            background-color: white;
            transition: all 1s;
        }

        #modeCheckBox:checked+.content {
            background-color: black;
            color: white;
            width: 100px;
            height: 100px;
            font-size: 30px;
        }

        /* #modeBtn::after {
            content:'☀';
        }
        #modeCheckBox:checked + .box #modeBtn::after {
            content:'🌙';
        } */
    </style>
</head>

<body>
    <!-- 位置1 -->
    <label for="modeCheckBox" id="modeBtn">按钮1</label>
    <input type="checkbox" id="modeCheckBox">
    <!-- 位置2 -->
    <!-- <label for="modeCheckBox" id="modeBtn">按钮2</label> -->
    <div class="content">
        <!--  位置3 -->
        <!-- <label for="modeCheckBox" id="modeBtn">按钮3</label> -->
        <div class="box">这是个盒子</div>
    </div>
    <!-- 位置4 -->
    <!-- <label for="modeCheckBox" id="modeBtn">按钮4</label> -->
    <!-- <input type="checkbox" id="modeCheckBox"> -->
</body>

总结:

  1. HTML/CSS/JS各司其责
  2. 应该避免不必要的由JS直接操作的样式
  3. 可以用class来表示状态
  4. 纯展示类交互寻求零JS方案

组件封装: 好的UI组件具备正确性, 扩展性, 复用性

书写轮播图

结构HTML

使用ul+li无序列表来实现

image.png

表现CSS

CSS:

  • 使用CSS绝对定位将图片重叠在同一位置
  • 轮播图切换的状态使用修饰符(modifier)
  • 轮播图的切换动画使用CSS tansition image.png

行为JS

API:

  • 得到当前的选中元素
  • 得到当前选中元素的索引
  • 滑动到哪个index的元素上的方法
  • 轮播下一张图片
  • 轮播上一张图片

image.png

image.png

重构: 模板化

解耦: 将HTML模板化, 更易于扩展

抽象: 通过组件通用模型抽象出来

总结

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

实现组件的步骤: 结构设计, 展现效果, 行为设计

三次重构: 模板化, 插件化, 抽象化(组件框架)

组件是指web页面上抽象出来一个个含模板(HTML), 功能(JS) 和样式(CSS)的单元. 好的组件具备四种特性.

过程抽象: 应用函数式编程思想/范式

过程抽象: 用来处理局部细节控制的一些方法; 函数式变成思想的基础应用

image.png

点击保证只执行一次

image.png 经典的过程抽象 once 函数

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

image.png

Throttle 节流函数, mousemove限制

image.png

Debounce 防抖函数 自动保存

image.png 键盘300ms不触发 才执行自动保存

Consumer/2

image.png

每隔一个时间 执行这个代码

image.png

延时调用

iterative: 迭代器

image.png

为什么要用高阶函数去解决这些问题?

纯函数: 结果可预期, 无副作用

非纯函数

image.png

调用次数影响

命令式于声明式

image.png

image.png

命令式: 怎么做, 注重解决的每一个步骤,

声明式: 做什么, 封装函数, 使用通过调用方法来达到目的

当需要修改代码时, 声明式更有优势,只需要添加状态;命令式需要增加代码逻辑

image.png

写代码应该注意: 使用场景

image.png

image.png

repeat 比 for while 在短字符 补齐 性能更好

交通灯

数据抽象

image.png

过程抽象

image.png

函数式交通灯

image.png