当前位置:首页 > JavaScript

原生js实现组件化

2026-01-31 01:22:37JavaScript

原生 JavaScript 实现组件化

原生 JavaScript 可以通过多种方式实现组件化,以下是几种常见的方法:

使用类和模块化

通过 ES6 的类和模块化语法,可以将组件封装为独立的模块。每个组件可以是一个类,包含自己的状态和方法。

class ButtonComponent {
  constructor(text) {
    this.text = text;
    this.element = document.createElement('button');
    this.element.textContent = this.text;
    this.element.addEventListener('click', this.handleClick.bind(this));
  }

  handleClick() {
    console.log('Button clicked:', this.text);
  }

  render() {
    return this.element;
  }
}

// 使用组件
const button = new ButtonComponent('Click me');
document.body.appendChild(button.render());

使用自定义元素(Web Components)

Web Components 是一组浏览器原生支持的 API,允许创建可重用的自定义元素。

class MyComponent extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({ mode: 'open' });
    this.shadowRoot.innerHTML = `
      <style>
        button {
          background: blue;
          color: white;
        }
      </style>
      <button><slot></slot></button>
    `;
  }
}

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

// 使用组件
document.body.innerHTML = '<my-button>Click me</my-button>';

使用事件委托和动态渲染

通过事件委托和动态渲染,可以将组件的行为和渲染逻辑分离。

const Component = {
  data: { count: 0 },
  template: `
    <div>
      <button id="increment">Increment</button>
      <span id="count">${this.data.count}</span>
    </div>
  `,
  render() {
    const container = document.createElement('div');
    container.innerHTML = this.template;
    container.addEventListener('click', (e) => {
      if (e.target.id === 'increment') {
        this.data.count++;
        container.querySelector('#count').textContent = this.data.count;
      }
    });
    return container;
  }
};

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

使用工厂函数

通过工厂函数创建组件实例,可以灵活地生成多个组件实例。

function createComponent(config) {
  const element = document.createElement(config.tag || 'div');
  element.textContent = config.text || '';
  if (config.className) {
    element.className = config.className;
  }
  if (config.onClick) {
    element.addEventListener('click', config.onClick);
  }
  return element;
}

// 使用组件
const button = createComponent({
  tag: 'button',
  text: 'Click me',
  className: 'btn',
  onClick: () => console.log('Button clicked')
});
document.body.appendChild(button);

使用闭包封装状态

通过闭包封装组件的状态和方法,可以实现私有变量和公共接口的分离。

原生js实现组件化

function CounterComponent() {
  let count = 0;
  const element = document.createElement('div');
  const button = document.createElement('button');
  button.textContent = 'Increment';
  const display = document.createElement('span');
  display.textContent = count;

  button.addEventListener('click', () => {
    count++;
    display.textContent = count;
  });

  element.appendChild(button);
  element.appendChild(display);

  return {
    element,
    getCount: () => count
  };
}

// 使用组件
const counter = CounterComponent();
document.body.appendChild(counter.element);

以上方法展示了如何使用原生 JavaScript 实现组件化,每种方法适用于不同的场景和需求。

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

相关文章

vue实现拖拽实现组件嵌套

vue实现拖拽实现组件嵌套

Vue 拖拽实现组件嵌套 使用 Vue 实现拖拽组件嵌套功能可以通过原生 HTML5 拖拽 API 或第三方库如 vuedraggable 实现。以下是两种方法的详细说明: 使用 HTML5 拖拽…

vue组件的实现

vue组件的实现

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

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

uniapp如何将底部导航组件化

uniapp如何将底部导航组件化

在 uniapp 中将底部导航组件化 将底部导航组件化可以提高代码复用性和维护性。以下是具体实现方法: 创建自定义底部导航组件 新建一个组件文件,例如 tab-bar.vue,放置在 compon…

vue VUE实现日历组件功能

vue VUE实现日历组件功能

Vue 日历组件实现方法 基础日历结构 使用Vue的模板语法构建日历的HTML结构,通常包含头部(年月显示、切换按钮)和日历表格(星期标题和日期格子)。 <template> <…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…