当前位置:首页 > 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 结构与动态内容。模板定义组件骨架,插槽填充可变部分。

<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 监听状态变化,自动触发视图更新。

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() 动态加载组件资源,实现按需加载。

原生js实现组件化

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
分享给朋友:

相关文章

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

vue实现多级组件

vue实现多级组件

Vue 多级组件实现方法 在 Vue 中实现多级组件通常涉及父子组件通信、动态组件或递归组件等技术。以下是几种常见实现方式: 父子组件嵌套 通过逐层嵌套组件实现多级结构,适用于固定层级场景: &l…

vue实现组件跟随

vue实现组件跟随

Vue 实现组件跟随效果 实现组件跟随效果通常需要监听鼠标或触摸事件,动态更新组件位置。以下是几种常见实现方式: 使用鼠标事件绑定 <template> <div class=…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…