当前位置:首页 > 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);

使用闭包封装状态

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

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实现组件化

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

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableElem…

vue实现多级组件

vue实现多级组件

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

vue组件传值实现分页

vue组件传值实现分页

Vue组件传值实现分页的方法 在Vue中实现分页功能,通常需要父子组件之间的数据传递。以下是几种常见的传值方式: 使用props传递数据 父组件通过props向子组件传递当前页码和总页数等分页信息:…

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div c…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML…