GrapesJS 自定义组件指南(2026)

用 DomComponents.addType 定义自定义 GrapesJS 组件:用 isComponent 检测,一个带有特征和默认值的模型,以及一个画布行为视图。

DevFuture Development
DevFuture Development
2026年6月18日10 天前
阅读约 4 分钟11 次浏览

组件定义行为,而不仅仅是标记

GrapesJS 组件是一个带有默认值、特征(可编辑设置)的类型模型, 以及可选视图。你注册一个 DomComponents.addType。本指南构建一个自定义组件,包含 并展示了导入的HTML如何映射到它上。

1. 寄存组件类型

editor.DomComponents.addType('rating', {
  // Map matching HTML onto this type when content is loaded.
  isComponent: (el) => el.classList?.contains('rating') && { type: 'rating' },

  model: {
    defaults: {
      tagName: 'div',
      classes: ['rating'],
      // Editable settings shown in the trait panel:
      traits: [
        { type: 'number', name: 'stars', label: 'Stars', min: 1, max: 5 },
      ],
      stars: 5,
    },
  },
});

2. 对视图中的性状变化做出反应

editor.DomComponents.addType('rating', {
  model: {
    defaults: { tagName: 'div', classes: ['rating'], stars: 5,
      traits: [{ type: 'number', name: 'stars', min: 1, max: 5 }] },
  },
  view: {
    init() {
      this.listenTo(this.model, 'change:stars', this.render);
    },
    onRender() {
      const n = this.model.get('stars');
      this.el.textContent = '★'.repeat(n) + '☆'.repeat(5 - n);
    },
  },
});

3. 将其暴露为一个区块

editor.BlockManager.add('rating', {
  label: 'Rating',
  category: 'Widgets',
  content: { type: 'rating', stars: 4 },
});

因为 isComponent 识别 .rating 元素,加载 保存的HTML会重建组件——特征和行为保持完整。

常见错误

Abstract code on a screen
isComponent 检测和性状变化事件是常见的陷阱。

自定义组件的故障方式是可预测的。如果匹配isComponentDOM时没有返回真实值(通常是{ type }),加载后的HTML不会映射到你的类型,重载时特征也会消失。如果视图没有listenTo处理模型的change:<trait>事件,特征面板中的编辑就不会重新渲染。在处理程序中重新渲染,而处理程序本身会触发变更,可能导致无限循环——直接更新DOM,而不是尽可能调用完整渲染。并且draggabledroppable故意设置/让你的组件只能放在合理位置。

前提条件

你需要一个运行中的GrapesJS编辑器和基础JavaScript。组件已注册 其中 DomComponents.addType;这三部分是检测 (isComponent),模型(默认值+特征),以及可选视图 (画布行为)。

模型:默认值、特征与约束

模型定义了组件的定义。除了性状,你可以限制它能限制的地方 Go 及其接受条件,droppabledraggable, , editable

editor.DomComponents.addType('rating', {
  isComponent: (el) => el.classList?.contains('rating') && { type: 'rating' },
  model: {
    defaults: {
      tagName: 'div',
      classes: ['rating'],
      droppable: false,
      traits: [{ type: 'number', name: 'stars', min: 1, max: 5 }],
      stars: 5,
    },
  },
});

观点:对性状变化的反应

view: {
  init() { this.listenTo(this.model, 'change:stars', this.render); },
  onRender() {
    const n = this.model.get('stars');
    this.el.textContent = '★'.repeat(n) + '☆'.repeat(5 - n);
  },
}

isComponent 为什么重要

isComponent 当 HTML 加载到编辑器时运行。归还该类型 用于匹配元素的对象是让保存的标记重新注入组件的关键 只要它的特性和行为保持完整——没有它,换弹时你的组件会变回原形 转成纯HTML格式。

最佳实践

保持模型声明式,并将行为置于视图中。避免触发全套 在一个本身导致变更的变更处理程序中渲染——直接将DOM更新为 防止循环。设定 draggable/droppable 故意如此 组件只能放置在合理位置。揭示有意义的特质,以便编辑 可以无需代码即可配置组件。

下一步

作为可拖拽单元的表面组件 自定义方块指南,捆绑包 它们在 自定义插件中,或者 浏览 GrapesJS插件 GJS。市场

常见问题

我如何在 GrapesJS 中创建自定义组件?

叫声 editor.DomComponents.addType(type, { isComponent, model, view }) ——定义检测、默认值/特征和画布行为。

什么是特质?

特质是特质面板中显示的可编辑设置,针对某个特质 组成部分;在 中声明它们。model.defaults.traits

isComponent是如何工作的?

它接收一个DOM元素并返回一个真实值(通常) { type }而该元素本应成为你的组件,因此导入 HTML映射到你的类型上。

发布于 2026年6月18日
更新于 2026年6月27日
🔌 GJS.Market

在寻找 GrapesJS 插件吗?

超过 100 款精选插件、预设与模板 —— 由社区精挑细选并持续维护。

分享本文TwitterFacebookLinkedIn
发布平台
DevFuture Development
DevFuture Development
访问店铺 →

更多来自 DevFuture Development

发现更多精彩文章,及时获取最新内容。

查看全部文章

来自 DevFuture Development 的付费插件

由该作者精心打造的精选付费插件。

访问店铺 →