如何写好JS学习(1) | 青训营笔记

1,202 阅读3分钟

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

写好JS的一些原则

  • 各司其责:让HTML、CSS和JavaScript职能分离。
  • 组件封装:好的UI组件具备正确性、扩展性、复用性。
  • 过程抽象:应用函数式编程思想。

深夜食堂案例总结:

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

组件封装

例子

用原生 JS 写一个电商网站的轮播图,应该怎么实现?

结构:HTML

轮播图是一个典型的列表结构,我们可以使用无序列表ul元素来实现。

表现:CSS

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

行为:JS

行为:API

行为:控制流

  • 使用自定义事件来解耦。

总结:基本方法

  • 结构设计
  • 展现效果
  • 行为设计
    1. API (功能)
    2. Event (控制流)

重构:插件化

思考:改进空间?

如果让你来重构这个轮播图组件,你会怎么做?

重构:插件化

解耦

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

重构:模板化

解耦

  • 将HTML模板化,更易于扩展

抽象

  • 将组件通用模型抽象出来

总结

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

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

  • 三次重构

    1. 插件化
    2. 模板化
    3. 抽象化(组件框架)

过程抽象

  • 用来处理局部细节控制的一些方法
  • 函数式编程思想的基础应用

例子

操作次数限制

  • 一些异步交互
  • 一次性的HTTP请求

高阶函数

Once

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

HOF

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

常用高阶函数

HOF

思考和讨论

  • 为什么要使用高阶函数?

编程范式

命令式与声明式

例子

总结

  • 过程抽象 / HOF / 装饰器
  • 命令式 / 声明式

写代码最应该关注什么?

  • 风格?
  • 效率?
  • 约定?
  • 使用场景?
  • 设计?

当年的Leftpad事件

  function leftpad(str, len, ch) {
      str = String(str);
      var i = -1;
      if (!ch && ch !== 0) ch = ' ';
      len = len - str.length;
      while (++i < len) {
          str = ch + str;
      }
      return str;
  } 

事件本身的槽点:

  • NPM 模块粒度
  • 代码风格
  • 代码质量/效率
  function leftpad(str, len, ch) {
      str = "" + str;
      const padLen = len - str.length;
      if(padLen <= 0) {
        return str;
      }
      return (""+ch).repeat(padLen)+str;
  } 
  • 代码更简洁
  • 效率提升

小结:这一节是我学的最困难的课,便将月影大大的讲解过程记录在此,以便知识填充后再学习。