在Backstage中创建自定义表单组件

在Backstage中创建自定义表单组件

Zave Genshin Impact

注意
本文档基于 Backstage 1.32.0 版本编写,并采用自 1.24.0 版本以来官方推荐使用的新后端系统(New BackEnd System)。Backstage 仍处于不断更新发展中,本文下述步骤可能将不适用于后续更新版本。

一、开发前准备

无。

二、编写自定义表单组件

接下来我们将以新建一个 Pod Namespace 环境选择器 为例,说明如何编写自定义表单组件。

(1)创建自定义表单组件的基本框架

  1. 在 packages/app/src 文件夹下新建文件夹 scaffolder
  2. 在 scaffolder 文件夹下继续创建新的文件夹 podSelector,这个文件夹中包含的就是本次示例的核心文件了
  3. 在 podSelector 文件夹下新建三个文件 extension.ts、index.ts、podEnvSelectExtension.tsx

其中 extension.ts 和 index.ts 文件负责将组件向外暴露,podEnvSelectExtension.tsx 文件中包含组件样式与处理逻辑。

(2)编写各个文件内容

packages/app/src/scaffolder/podSelector/extension.ts:

1
2
3
4
5
6
7
8
9
10
import { scaffolderPlugin } from '@backstage/plugin-scaffolder';
import { createScaffolderFieldExtension } from '@backstage/plugin-scaffolder-react';
import { PodSelector } from './podEnvSelectExtension';

export const PodEnvSelectorExtension = scaffolderPlugin.provide(
createScaffolderFieldExtension({
name: 'PodSelector',
component: PodSelector,
}),
);

packages/app/src/scaffolder/podSelector/index.ts:

1
export { PodEnvSelectorExtension } from './extensions';

packages/app/src/scaffolder/podSelector/podEnvSelectExtension.tsx:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import React from 'react';
import { FieldExtensionComponentProps } from '@backstage/plugin-scaffolder-react';
import { makeStyles } from '@material-ui/core/styles';
import InputLabel from '@material-ui/core/InputLabel';
import MenuItem from '@material-ui/core/MenuItem';
import FormHelperText from '@material-ui/core/FormHelperText';
import FormControl from '@material-ui/core/FormControl';
import Select from '@material-ui/core/Select';

const useStyles = makeStyles((theme) => ({
formControl: {
margin: theme.spacing(1),
minWidth: 120,
},
selectEmpty: {
marginTop: theme.spacing(2),
},
}));

export const PodSelector = ({
onChange,
rawErrors,
required,
formData,
}: FieldExtensionComponentProps<string>) => {
const classes = useStyles();
const [Kubernetes_Env, setEnv] = React.useState('');

const handleChange = (event) => {
setEnv(event.target.value);
};

return (
<FormControl
margin="normal"
required={required}
error={rawErrors?.length > 0 && !formData}
>
<InputLabel id="demo-simple-select-helper-label">Kubernetes Env</InputLabel>
<Select
labelId="demo-simple-select-helper-label"
id="demo-simple-select-helper"
value={Kubernetes_Env}
onChange={handleChange}
>
<MenuItem value="">
<em>None</em>
</MenuItem>
<MenuItem value={'dev'}>DEV</MenuItem>
<MenuItem value={'uat'}>UAT</MenuItem>
<MenuItem value={'prod'}>PROD</MenuItem>
</Select>
<FormHelperText>Choose the environment</FormHelperText>
</FormControl>
);
};

三、要点说明

  • 自定义表单组件本质是 Scaffolder 的 Field Extension,通过 createScaffolderFieldExtension 注册,并给它一个 name
  • 这个 name 就是软件模板 YAML 里 ui:field 要填的值,模板通过它把字段交给你的组件渲染
  • FieldExtensionComponentProps 提供了 onChange、formData、rawErrors、required 等属性,用于与表单状态同步并展示校验错误
  • 标题: 在Backstage中创建自定义表单组件
  • 作者: Zave
  • 创建于 : 2026-10-08 12:00:00
  • 更新于 : 2026-10-08 12:00:00
  • 链接: https://zavex.cn/post/53612.html
  • 版权声明: 版权所有 © Zave,禁止转载。
评论