当前位置:首页 > JavaScript

原生js实现组件

2026-04-07 16:38:34JavaScript

原生 JavaScript 实现组件

使用构造函数模式

定义一个构造函数,通过 new 关键字创建组件实例。适用于需要封装数据和方法的场景。

function Component(options) {
  this.data = options.data;
  this.render = function() {
    document.getElementById('app').innerHTML = this.data.content;
  };
}

const myComponent = new Component({
  data: { content: 'Hello, World!' }
});
myComponent.render();

使用类(ES6)

通过 class 语法实现更现代的组件结构,支持继承和封装。

class Component {
  constructor(options) {
    this.state = options.state;
  }

  setState(newState) {
    this.state = { ...this.state, ...newState };
    this.render();
  }

  render() {
    document.getElementById('app').innerHTML = this.state.content;
  }
}

const myComponent = new Component({
  state: { content: 'Initial Content' }
});
myComponent.setState({ content: 'Updated Content' });

使用闭包封装私有变量

通过闭包实现私有变量,避免外部直接修改内部状态。

function createComponent(config) {
  let state = config.initialState;

  function update(newState) {
    state = { ...state, ...newState };
    render();
  }

  function render() {
    document.getElementById('app').innerHTML = state.text;
  }

  return { update, render };
}

const component = createComponent({
  initialState: { text: 'Private State' }
});
component.update({ text: 'New Private State' });

基于 DOM 的自定义元素

使用 CustomElementRegistry 定义自定义 HTML 元素,支持生命周期钩子。

class MyElement extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({ mode: 'open' });
    this.shadowRoot.innerHTML = `<p>Custom Element</p>`;
  }

  connectedCallback() {
    console.log('Element added to DOM');
  }
}

customElements.define('my-element', MyElement);

事件驱动组件

通过事件监听实现交互逻辑,适合动态 UI 更新。

原生js实现组件

function EventDrivenComponent() {
  const button = document.createElement('button');
  button.textContent = 'Click Me';
  button.addEventListener('click', () => {
    document.body.append('Button clicked! ');
  });
  document.body.append(button);
}

EventDrivenComponent();

关键注意事项

  • 性能优化:避免频繁 DOM 操作,可使用文档片段(DocumentFragment)批量更新。
  • 解耦设计:将渲染逻辑与业务逻辑分离,例如使用观察者模式管理状态变化。
  • 浏览器兼容性:自定义元素需注意 Polyfill 支持(如 @webcomponents/webcomponentsjs)。

扩展实现示例(带模板)

class TemplateComponent {
  constructor(templateId, targetId) {
    this.template = document.getElementById(templateId).content;
    this.target = document.getElementById(targetId);
  }

  render(data) {
    const instance = document.importNode(this.template, true);
    Object.entries(data).forEach(([key, value]) => {
      instance.querySelectorAll(`[data-bind="${key}"]`).forEach(el => {
        el.textContent = value;
      });
    });
    this.target.appendChild(instance);
  }
}

// HTML: <template id="tpl"><div data-bind="title"></div></template>
const tc = new TemplateComponent('tpl', 'output');
tc.render({ title: 'Bound Data' });

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

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Promise…

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现继承

js实现继承

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

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

vue radio组件实现

vue radio组件实现

Vue Radio 组件实现 在 Vue 中实现 Radio 组件可以通过原生 HTML 的 <input type="radio"> 结合 Vue 的响应式特性来完成。以下是几种常见的实…

js实现吸色

js实现吸色

使用Canvas实现吸色功能 通过Canvas的getImageData方法获取像素颜色数据。创建一个Canvas元素,将目标图像绘制到Canvas上,通过鼠标事件获取坐标对应的颜色值。 c…