如何写 “好” JavaScript (01)

本文探讨了JavaScript编程中的原则,强调HTML、CSS、JS各司其职,避免直接操作样式。通过代码示例展示了如何正确实现页面模式切换,提出使用class而非直接修改样式。此外,介绍了组件封装的概念及其重要性,包括封装性、正确性、扩展性和复用性,并以轮播图组件为例,展示了组件设计的结构设计、展现效果和行为设计的三次重构过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写好 JS 的一些原则

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

各司其职

表1-1 三者职责

JavaScriptBehavioral
CSSPresentational
HTMLStructural

HTML、CSS、JavaScript 三者各司其职,描述的是其各自在页面中承担的责任(如表1-1所述),并不是描述代码文件层面的分离(HTML、CSS、JS 分处三个文件)。

代码示例

点击按钮,切换页面的浏览模式(浅色或深色)。
页面的浏览模式切换示例

代码实现方案一

<body>
    <button id="modeBtn">🌞</button>
    <h1>huaqi</h1>

    <script>
      const btn = document.getElementById("modeBtn");
      btn.addEventListener("click", e => {
        const body = document.body;
        if (e.target.innerHTML === "🌞") {
          body.style.backgroundColor = "black";
          body.style.color = "white";
          e.target.innerHTML = "🌜";
        } else {
          body.style.backgroundColor = "white";
          body.style.color = "black";
          e.target.innerHTML = "🌞";
        }
      });
    </script>
  </body>

注:此方案中,JS 做了 CSS 应该做的事

代码实现方案二

<style>
      #modeBtn {
        font-size: 2rem;
        border: none;
        outline: none;
        cursor: pointer;
        background: inherit;
      }

      body.night {
        background-color: black;
        color: white;
        transition: all 1s;
      }

      #modeBtn::after {
        content: "🌞";
      }

      body.night #modeBtn::after {
        content: "🌜";
      }
    </style>
  </head>
  <body>
    <button id="modeBtn"></button>
    <h1>huaqi</h1>

    <script>
      const btn = document.getElementById("modeBtn");
      btn.addEventListener("click", e => {
        const body = document.body;
        if (body.className !== "night") {
          body.className = "night";
        } else {
          body.className = "";
        }
      });
    </script>
  </body>

在代码的二、三版本中,该版本适应性更强。

注:纯展现类交互,可以仅通过 CSS 完成

代码实现方案三

<style>
      body,
      html {
        width: 100%;
        height: 100%;
        margin: 0;
        padding: 0;
        overflow: hidden;
      }

      body {
        box-sizing: border-box;
      }

      .content {
        height: 100%;
        padding: 10px;
        transition: background-color 1s;
      }

      #modeCheckBox {
        display: none;
      }

      #modeCheckBox:checked + .content {
        background-color: black;
        color: white;
      }

      #modeBtn {
        font-size: 2rem;
        border: none;
        outline: none;
        cursor: pointer;
        background: inherit;
      }

      #modeBtn::after {
        content: "🌞";
      }

      body.night #modeBtn::after {
        content: "🌜";
      }
    </style>
  </head>
  <body>
    <input id="modeCheckBox" type="checkbox" />
    <div class="content">
      <!-- 操作 label 本质上为操作 input -->
      <label id="modeBtn" for="modeCheckBox"></label>
      <h1>huaqi</h1>
    </div>
  </body>

在代码的二、三版本中,该版本适应性较低。
尽量减少 JS 代码的书写,降低 bug 出现的概率。

纯展现类交互,可仅使用 CSS + HTML 完成

结论

  • HTML、CSS、JS 各司其职
  • 避免不必要的由 JS 直接操作样式
  • 可以用 class 来表示状态
  • 纯展示类交互寻求零 JS 方案

组件封装

什么是组件

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

代码示例

使用原生 JS 怎么实现组件化轮播图?

  • 版本一 JS Bin 不具备复用性、数据抽象
    • 结构设计
    • 展现效果
    • 行为设计
      • API(功能)
      • Event(控制流)
  • 插件化 JS Bin 不具备数据抽象
    • 将控制元素抽取为插件
    • 插件与组件之间通过依赖注入方式建立联系
  • 模板化 JS Bin
    • 将 HTML 模板化,更易于扩展
  • 抽象化 JS Bin
    • 将通用的组件模型抽象出来

待优化:CSS 模板化、插件组件化;

总结

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

文章相关源码 github/hua-qi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值