[ 前端与 HTML | 青训营笔记]

57 阅读3分钟

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

一、本堂课重点内容

  1. JavaScript 好代码的标准
  2. 组件的定义解析及特征
  3. 组件封装基本方法
  4. 过程抽象概念
  5. 高阶函数使用模式

二、详细知识点介绍

JavaScript 好代码的标准

  • 各司其职 让Html css和js职能分离
  • 组件封装 好的ui组件具有正确扩展复用性
  • 过程抽象 应用函数式编程思维

eg.深夜食堂例子

    <input id="modeCheckBox" type="checkbox">
    <div class="content">
        <header>
          <label id="modeBtn" for="modeCheckBox"></label>
          <h1>深夜食堂</h1>
        </header>
    <main>
        <div class="pic">
            <img src="https://p2.ssl.qhimg.com/t0120cc20854dc91c1e.jpg">
          </div>
          <div class="description">
            <p>
            xxx
            </p>
          </div>
    </main>
    </div>
    #modeCheckBox {
        display: none;
    }

    #modeCheckBox:checked + .content {
        background-color: black;
        color: white;
        transition: all 1s;
    }
  • HTML/CSS/JS 各司其责
  • 应当避免不必要的由JS直接操作样式
  • 可以用class 来表示状态
  • 纯展示类交互寻求零Js方案

组件封装

组件的定义解析及特征

组件是指web页面上抽出来一个个包含模板(HTML)、功能(JS)和样式(CSS)的单元。 好的组件具备封装性、正确性、扩展性、复用性

组件封装基本方法

组件封装的基本方法

  • 结构设计
  • 展现效果
  • 行为设计
  • API 功能
  • Event 控制流

eg.利用原生 JS 实现电商网站轮播图

1. 结构:HTML
  • 轮播图是一个典型的列表结构,我们可以使用无序列表ul元素来实现
2. 表现:CSS
  • 使用CSS绝对定位将图片重叠在同一个位置
  • 轮播图切换状态使用修饰符modifier
  • 轮播图切换动画使用CSS transition
3. 行为:JS
  • API设计应保证原子操作,职责单一,满足灵活性
4. 行为:控制流
  • 使用自定义事件来解耦
5. 重构
  1. 插件化 (解耦)

    • 将控制元素抽取成插件
    • 插件与组件之间通过依赖注入的方式建立联系
  2. 模板化

    • 将HTML 模板化,更易于扩展
  3. 组件框架 (抽象)

    • 将通用组件模型抽象出来
class Component{
    constructor(id, opts = {name, data:[]}){
      this.container = document.getElementById(id);
      this.options = opts;
      this.container.innerHTML = this.render(opts.data);
    }
    registerPlugins(...plugins){
      plugins.forEach(plugin => {
        const pluginContainer = document.createElement('div');
        pluginContainer.className = `.${name}__plugin`;
        pluginContainer.innerHTML = plugin.render(this.options.data);
        this.container.appendChild(pluginContainer);

        plugin.action(this);
      });
    }
    render(data) {
      return ''
    }
}

总结

  • 组件设计原则:封装性、正确性、扩展性、复用性
  • 实现组件的步骤:结构设计、展现设计、行为设计
  • 三次重构:插件化、模板化、抽象化、组件框架

过程抽象

过程抽象的概念:

为了能够让需求覆盖不同的事件处理,我们可以将这个需求剥离出来。这个过程我们称为过程抽象。

用来处理局部细节控制的一些方法

高阶函数
  • 以函数做为参数
  • 以函数作为返回值
  • 常用于作为函数装饰器
         function HOF0(fn) {
           return function(...args) {
             return fn.apply(this, args);
           }
         }
常用高阶函数
Trottle 节流函数
debounce 防抖
consumer/2 同步转异步、延时调用
lterative 迭代
为什么要使用高阶函数?

诚函数,无副作用可预期,易测正确性,使用高阶函数减少非诚函数,增加可维护性

left-pad实例

介绍left-pad后面的故事和代码的质量和性能优化,从while循环累加,到内置repectAPI,并讲解repeact底层快速幂去优化时间复杂度,从O(n)优化到O(logn)。讲解了一下快速幕实现的原理,接着还有一些业内优化时间复杂度的方案。

三、总结

通过月影老师的js课程,我对如何写好js有更多的理解,通过模块化、组件化的思维,可以将js写得更加具备可以扩展性、可复用,还有一些性能优化方面的内容也值得我继续学习与实践。这堂课给我拓展了许多新方向,收获不少。

四、引用

月影老师的js课程juejin.cn/course/byte…