在上一篇文章中,我们学习了如何创建一个自定义字段组件并将其注册到侧边栏。有了这个基础,让我们全面了解TinaCMS中的自定义字段。在这篇简短但甜美的文章中🧁,我们将介绍如何将字段组件转变为字段插件。
插件扩展了CMS的功能;字段插件允许我们创建和注册自定义字段。*创建字段插件有几个原因。*通过自定义字段,您可以完全控制编辑体验和功能。如果Tina提供的主要字段不适合您的用例,您可以填补这些空白。
字段组件只是字段插件的一部分(稍后会详细介绍)。自定义字段组件可以实现与插件相同的功能。但如果您计划在不同的表单中重用自定义字段,建议采取额外的步骤来制作插件🔌。
创建字段插件有助于将复杂的逻辑限制在一个模块中。这使得以后更新或替换自定义字段功能更容易。使用插件API使我们的“高级”代码更具可重用性和封装性,使字段独立于核心CMS。
对于那些想深入了解的人,这种方法旨在体现依赖倒置原则。
要跟随学习,您应该已经设置了一个带有Tina表单的自定义字段组件。如果没有,您可以从上一篇文章中获取更多背景信息:如何创建自定义字段组件。在接下来的示例中,我使用了我们上一篇文章中的相同llama-filters 🦙 演示。
向CMS添加字段插件有两个步骤。首先,我们将定义字段组件对象并将其注册到CMS。接下来,我们将在表单定义中使用字段插件,以便我们可以在侧边栏中使用我们精美的自定义字段插件编辑内容。
想要看到一个工作示例?查看Tina Grande Starter中的Authors Field Plugin。
要将自定义字段注册为CMS的插件,我们需要前往可以访问CMS实例的文件。在Next.js 演示中,我们将查看_app.js
。
// _app.jsimport React from 'react'import App from 'next/app'import { Tina, TinaCMS } from 'tinacms'import { GitClient } from '@tinacms/git-client'/*** 1. 导入自定义字段组件*/import RangeInput from '../components/RangeInput'/*** 2. 定义字段插件*/const customFieldPlugin = {name: 'range-input',Component: RangeInput,}export default class Site extends App {constructor() {super()this.cms = new TinaCMS({enabled: process.env.NODE_ENV !== 'production',apis: {git: new GitClient('/___tina'),},sidebar: {position: 'overlay',},})/*** 3. 将插件注册到cms*/this.cms.fields.add(customFieldPlugin)}render() {//...}}
您需要导入自定义字段组件,然后直接将插件注册到CMS。注意我们如何导入在上一篇文章中创建的RangeInput
组件。这是我们现在附加到字段插件的自定义字段组件。
如果您正在使用Gatsby,这看起来略有不同。提示:您需要前往gatsby-browser.js文件以访问CMS实例。
让我们进一步解析字段插件。下面的接口应提供一些关于创建字段插件所需内容的见解。当您将字段插件注册到Tina时,它期望一个具有类似结构的对象。
interface FieldPlugin {name: stringComponent: React.FC<any>type?: stringvalidate?(value: any,allValues: any,meta: any,field: Field): string | object | undefinedparse?: (value: any, name: string, field: Field) => anyformat?: (value: any, name: string, field: Field) => any}
至少,字段插件需要一个名称和一个组件。 name
用于在表单定义中引用自定义字段(稍后会详细介绍)。Component
是实际在侧边栏中渲染的内容。
您可以看到还有其他配置函数和选项。*注意带有问号的属性是可选的。*这些选项对于创建需要验证、解析或格式化的字段非常有用。
要查看更复杂的示例,请查看关于创建电子邮件字段的文档。
现在插件已注册到CMS,我们可以在任何表单定义中使用它。回到llama-filters演示,让我们前往配置Tina表单的index.js
。我们需要更新表单选项,使我们的图像饱和度字段引用字段插件name
,而不是直接调用组件。
/*** 1. 移除自定义字段组件的导入*/- import RangeInput from '../components/RangeInput'import React from 'react'import { useLocalJsonForm } from 'next-tinacms-json'export default function Index(props) {//...}const formOptions = {fields: [/*** 2. 引用字段插件`name`而不是直接传递自定义组件*/{label: '图像饱和度',name: 'saturation',- component: RangeInput+ component: 'range-input'}]}Index.getInitialProps = async function() {//...}
就是这样! 定义并注册到CMS的插件,您可以无限次重用此字段。在我看来,创建字段插件有助于保持定义表单的一致接口。这样,自定义字段就像本地Tina字段一样在幕后工作,这非常酷。
这篇文章结合前一篇,应该为您提供所有构建块,以开始制作自己的字段插件。随时深入文档了解字段或插件。确保与我们@tinacms分享您的炫酷自定义字段🖖。或者,如果您觉得Tina缺少一个基本字段,打开一个PR来贡献您的自定义字段!