当前位置:首页 > JavaScript

原生js实现组件化

2026-04-04 17:17:19JavaScript

原生 JavaScript 实现组件化

原生 JavaScript 可以通过模块化、自定义元素、事件驱动等方式实现组件化。以下是几种常见的方法:

基于类的组件化

使用 ES6 的类(Class)封装组件逻辑,通过实例化类来创建组件。

class ButtonComponent {
  constructor(text, onClick) {
    this.text = text;
    this.onClick = onClick;
  }

  render() {
    const button = document.createElement('button');
    button.textContent = this.text;
    button.addEventListener('click', this.onClick);
    return button;
  }
}

// 使用组件
const button = new ButtonComponent('Click me', () => {
  console.log('Button clicked!');
});
document.body.appendChild(button.render());

基于自定义元素(Web Components)

使用 Custom Elements API 定义新的 HTML 元素,实现组件化。

class CustomButton extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({ mode: 'open' });
    this.shadowRoot.innerHTML = `
      <style>
        button {
          background: blue;
          color: white;
          border: none;
          padding: 8px 16px;
          cursor: pointer;
        }
      </style>
      <button><slot></slot></button>
    `;
  }
}

// 注册自定义元素
customElements.define('custom-button', CustomButton);

// 使用组件
const button = document.createElement('custom-button');
button.textContent = 'Click me';
document.body.appendChild(button);

基于事件驱动的组件通信

通过自定义事件实现组件间的通信。

class EventEmitter {
  constructor() {
    this.events = {};
  }

  on(event, listener) {
    if (!this.events[event]) {
      this.events[event] = [];
    }
    this.events[event].push(listener);
  }

  emit(event, ...args) {
    if (this.events[event]) {
      this.events[event].forEach(listener => listener(...args));
    }
  }
}

// 组件A
class ComponentA extends EventEmitter {
  constructor() {
    super();
    this.render();
  }

  render() {
    const button = document.createElement('button');
    button.textContent = 'Emit Event';
    button.addEventListener('click', () => {
      this.emit('customEvent', 'Hello from ComponentA');
    });
    document.body.appendChild(button);
  }
}

// 组件B
class ComponentB extends EventEmitter {
  constructor() {
    super();
    this.on('customEvent', this.handleEvent);
  }

  handleEvent(data) {
    console.log('Received:', data);
  }
}

// 使用组件
const componentA = new ComponentA();
const componentB = new ComponentB();
componentA.on('customEvent', data => {
  console.log('ComponentB received:', data);
});

基于闭包的模块化

使用闭包和 IIFE(立即执行函数)封装组件逻辑,避免全局污染。

const CounterComponent = (() => {
  let count = 0;

  const increment = () => {
    count++;
    updateDisplay();
  };

  const updateDisplay = () => {
    const display = document.getElementById('counter-display');
    if (display) {
      display.textContent = count;
    }
  };

  const render = () => {
    const container = document.createElement('div');
    container.innerHTML = `
      <div id="counter-display">${count}</div>
      <button id="counter-button">Increment</button>
    `;
    container.querySelector('#counter-button').addEventListener('click', increment);
    return container;
  };

  return { render };
})();

// 使用组件
document.body.appendChild(CounterComponent.render());

总结

原生 JavaScript 实现组件化的方法包括:

原生js实现组件化

  • 使用 ES6 类封装组件逻辑。
  • 通过 Custom Elements 定义可复用的 HTML 元素。
  • 使用事件驱动实现组件通信。
  • 通过闭包和模块化避免全局污染。

每种方法适用于不同场景,可以根据需求选择合适的方式。

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

相关文章

js实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

vue组件的实现

vue组件的实现

Vue 组件的实现方式 Vue 组件可以通过多种方式实现,主要包括单文件组件(SFC)、全局注册和局部注册。以下是常见的实现方法: 单文件组件(SFC) 单文件组件是 Vue 最推荐的组件化开发方式…

vue穿梭框组件实现

vue穿梭框组件实现

实现 Vue 穿梭框组件的基本思路 穿梭框(Transfer)组件通常用于在两个列表之间移动数据项。核心功能包括左侧列表、右侧列表、移动按钮(左移、右移、全选等)以及数据项的渲染与交互。 基础结构设…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(func,…

vue实现tooltips组件

vue实现tooltips组件

实现基础 Tooltip 组件 创建一个名为 Tooltip.vue 的单文件组件,包含模板、样式和逻辑: <template> <div class="tooltip-con…