当前位置:首页 > JavaScript

原生js实现组件化

2026-01-31 01:22:37JavaScript

原生 JavaScript 实现组件化

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

使用类和模块化

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

原生js实现组件化

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>';

使用事件委托和动态渲染

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

原生js实现组件化

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

相关文章

vue.js实现轮播

vue.js实现轮播

vue.js实现轮播的方法 使用第三方库(如Swiper) 安装Swiper库: npm install swiper 在Vue组件中引入Swiper: <template>…

js实现轮播

js实现轮播

实现基础轮播效果 使用HTML结构创建轮播容器和图片元素: <div class="carousel"> <div class="carousel-inner">…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

vue table组件实现

vue table组件实现

Vue 表格组件实现方案 基础表格实现 使用<table>标签结合v-for指令渲染数据是最简单的实现方式: <template> <table> &…