当前位置:首页 > 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路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js实现全选

js实现全选

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

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

uniapp倒计时组件

uniapp倒计时组件

uniapp倒计时组件实现方法 使用内置组件实现 uniapp提供了<countdown>组件用于倒计时功能,支持自定义格式和样式。示例代码如下: <countdown :t…