当前位置:首页 > JavaScript

原生js实现组件化

2026-03-01 16:27:31JavaScript

原生 JavaScript 实现组件化的方法

使用自定义元素(Custom Elements)

通过 customElements.define 定义自定义元素,继承 HTMLElement 类。组件可以封装模板、样式和行为。

class MyComponent extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({ mode: 'open' });
    this.shadowRoot.innerHTML = `
      <style>
        .component { color: red; }
      </style>
      <div class="component">Hello World</div>
    `;
  }
}
customElements.define('my-component', MyComponent);

基于类的封装

通过 ES6 类封装组件逻辑,结合 DOM 操作实现渲染和更新。类的实例管理组件状态和生命周期。

class Counter {
  constructor(selector) {
    this.count = 0;
    this.element = document.querySelector(selector);
    this.render();
    this.element.addEventListener('click', () => this.increment());
  }

  increment() {
    this.count++;
    this.render();
  }

  render() {
    this.element.innerHTML = `Count: ${this.count}`;
  }
}
new Counter('#counter');

模板与插槽

使用 <template><slot> 分离 HTML 结构与动态内容。模板定义组件骨架,插槽填充可变部分。

原生js实现组件化

<template id="user-card">
  <div class="card">
    <slot name="name">Default Name</slot>
    <slot name="email"></slot>
  </div>
</template>

<script>
  const template = document.getElementById('user-card');
  const card = template.content.cloneNode(true);
  document.body.appendChild(card);
</script>

事件委托与通信

通过自定义事件或回调函数实现组件间通信。父组件监听子组件事件并处理数据交换。

class ChildComponent extends HTMLElement {
  fireEvent() {
    this.dispatchEvent(new CustomEvent('child-event', { detail: { data: 123 } }));
  }
}

document.querySelector('child-component')
  .addEventListener('child-event', e => console.log(e.detail.data));

状态管理

利用 ProxyObject.defineProperty 监听状态变化,自动触发视图更新。

原生js实现组件化

const state = new Proxy({ value: 0 }, {
  set(target, key, value) {
    target[key] = value;
    document.getElementById('app').textContent = value;
    return true;
  }
});

state.value = 1; // 自动更新DOM

生命周期钩子

在自定义元素中实现 connectedCallbackdisconnectedCallback 等方法,管理组件的挂载与卸载逻辑。

class LifecycleComponent extends HTMLElement {
  connectedCallback() {
    console.log('Component mounted');
  }
  disconnectedCallback() {
    console.log('Component removed');
  }
}

动态加载组件

通过 fetchimport() 动态加载组件资源,实现按需加载。

const loadComponent = async (name) => {
  const { default: Component } = await import(`./components/${name}.js`);
  customElements.define(name, Component);
};
loadComponent('dynamic-component');

注意事项

  • 样式隔离:使用 Shadow DOM 避免全局样式污染。
  • 性能优化:避免频繁 DOM 操作,必要时使用 requestAnimationFrame 或虚拟 DOM 简化更新。
  • 浏览器兼容性:自定义元素需 polyfill(如 @webcomponents/webcomponentsjs)支持旧版浏览器。

标签: 组件js
分享给朋友:

相关文章

react如何开发组件

react如何开发组件

React 组件开发基础 React 组件分为函数组件和类组件两种形式。函数组件是现代 React 开发的主流方式,结合 Hooks 可以实现完整功能。 函数组件示例: function Gr…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaS…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

react组件如何通讯

react组件如何通讯

React 组件通讯方式 React 组件间的通讯方式主要包括以下几种方法,适用于不同场景下的数据传递和状态管理需求。 父子组件通讯(Props 传递) 父组件通过 props 向子组件传递数据或回…