跳转到内容

核心概念

Lit 基于标准 Web Components(Custom Elements + Shadow DOM),可被任何框架或原生 HTML 使用。

Web Components 标准

Lit 构建在 Web Components 标准之上,主要包括:

  • Custom Elements: 允许定义新的 HTML 元素
  • Shadow DOM: 提供样式和 DOM 封装
  • HTML Templates: 定义可复用的 HTML 片段
  • ES Modules: 支持模块化开发

这些标准确保了 Lit 组件可以在任何现代浏览器中运行,并且可以与任何前端框架(如 React、Vue、Angular)无缝集成。

响应式系统

Lit 内置响应式系统,通过声明式属性和状态自动触发 UI 更新。

属性(Properties)

属性是组件的公共 API,可以通过 HTML 属性或 JavaScript 属性进行设置:

js
import { LitElement, html } from 'lit';
import { customElement, property } from 'lit/decorators.js';

@customElement('my-counter')
export class MyCounter extends LitElement {
  @property({ type: Number })
  count = 0;

  render() {
    return html`<p>Count: ${this.count}</p>`;
  }
}

使用:

html
<!-- 通过 HTML 属性设置 -->
<my-counter count="5"></my-counter>

<!-- 通过 JavaScript 设置 -->
<script>
  document.querySelector('my-counter').count = 10;
</script>

状态(State)

状态是组件内部私有的响应式数据:

js
import { LitElement, html } from 'lit';
import { state } from 'lit/decorators.js';

export class MyComponent extends LitElement {
  @state()
  private _isOpen = false;

  render() {
    return html`
      <button @click="${() => { this._isOpen = !this._isOpen; }}">
        ${this._isOpen ? 'Close' : 'Open'}
      </button>
    `;
  }
}

合式开发

Lit 支持组合式开发,便于复用逻辑与结构。

逻辑复用

可以通过混入(mixins)或控制器(controllers)复用逻辑:

js
// 控制器示例
import { LitElement } from 'lit';
import { MyController } from './my-controller.js';

class MyElement extends LitElement {
  private _myController = new MyController(this);

  render() {
    return html`<p>Value: ${this._myController.value}</p>`;
  }
}

结构复用

可以通过模板函数复用结构:

js
const renderCard = (title, content) => html`
  <div class="card">
    <h3>${title}</h3>
    <p>${content}</p>
  </div>
`;

class MyElement extends LitElement {
  render() {
    return html`
      ${renderCard('Card Title', 'Card content...')}
    `;
  }
}

性能优势

Lit 的响应式系统只会更新实际发生变化的部分,而不是重新渲染整个组件,这使得它具有出色的性能表现。