自定义字段
如何创建自定义字段
在 LumeCMS 中,字段是标准的 Web components, 这使得扩展新字段变得非常容易。
要定义一个新字段,请使用 cms.field()
函数以及字段定义, 字段定义是一个包含以下值的对象:
- tag: HTML 代码中使用的自定义元素的标签名。
- jsImport: 包含自定义元素的 JavaScript 文件的 URL。此 文件将被加载到 HTML 中。
- applyChanges: 一个函数,用于在存储之前,将 Web 组件接收的新值存储在 document 对象中。
- init: (可选) 一个函数,用于初始化每个字段实例。
例如,让我们创建一个新的百分比字段,它只接受 0-100 之间的数字:
cms.field("percentage", {
tag: "percentage-field",
jsImport: "https://example.com/custom-fields/percentage-field.js",
applyChanges(data, changes, field) {
const { name } = field;
const value = changes[name];
data[name] = value ? Number(value) : undefined;
},
});
创建自定义元素
当创建一个自定义元素时,建议扩展 LumeCMS 的 Component
类,它提供了一些你将需要的基本功能。
import { Component } from "lume_cms/components/component.js";
customElements.define(
"percentage-field",
class extends Component {
init() {
// 在这里写你的代码
}
},
);
init()
函数将在组件首次插入到 DOM 中时执行。以下属性也可用:
- schema: 字段的选项(name,label,description,attributes 等)。
- value: 字段值。
- namePrefix: name 属性的前缀。组件生成的任何表单元素必须具有此前缀后跟一个点。
要创建百分比字段:
customElements.define(
"percentage-field",
class extends Component {
init() {
// 获取字段信息
const { schema, value, namePrefix } = this;
// 生成 input 的 name 和 id
const name = `${namePrefix}.${schema.name}`;
const id = `field_${name}`;
// 打印 HTML 代码
this.innerHTML = `
<label for="${id}">${schema.label}</label>
<input id="${id}" type="number" value="${value}" min=0 max=100 name="${name}>
`;
}
},
);
Utils
LumeCMS 提供了一个包含一些实用工具的 utils.js
文件。push
函数创建一个新的 DOM 元素,并将其附加到作为第一个参数传递的元素。 上面的例子可以通过这种方式改进:
import { Component } from "lume_cms/components/component.js";
import { push } from "lume_cms/components/utils.js";
customElements.define(
"percentage-field",
class extends Component {
init() {
// 获取字段信息
const { schema, value, namePrefix } = this;
// 生成 input 的 name 和 id
const name = `${namePrefix}.${schema.name}`;
const id = `field_${name}`;
// 添加 <label>
push(this, "label", { for: id }, schema.label);
// 添加 <input type="number">
push(this, "input", {
name,
value,
id,
type: "number",
min: 0,
max: 100,
});
}
},
);
查看 默认 Lume CMS 字段 以获取更多示例。