案例:流程表单页面添加按钮
概述
通过 `regOvProps` 拦截 Title 组件的 props,向 buttons 数组中注入自定义按钮组件,实现在流程表单标题区域添加按钮。

核心原理
1. 创建按钮组件
import { Button } from '@weapp/ui';
/**
* 表单附件下载按钮组件
* 根据配置文件中的附件字段列表,从表单数据中提取文件并依次下载
* @param {{ formData: object }} props - formData 对应接口返回的 data 对象
*/
const downloadButton = ({ formData }) => {
const formSdk = window.WeFormSDK?.getWeFormInstance();
const handleClick = async () => {
}
return <Button onClick={handleClick} >下载为PDF</Button>
}
export default downloadButton;
2. 创建配置文件
`config/config.js` 集中管理需要添加按钮的流程:
const config = {
workflows: [
{
formId: '1151612316977602563', // 表单ID
nodeIds: ['1168713682791309317'], // 显示按钮的节点ID(可多个)
fileFieldNames: ['fj_fltf', 'fj_4ch3'] // 附件字段名称(可多个)
}
]
};
3. 添加按钮
通过 `regOvProps` 重写 `Title` 组件的 props 处理函数,将自定义按钮插入到 `props.buttons` 数组的**倒数第二个位置**:
import { regOvProps } from '@weapp/utils';
import { Suspense, lazy } from 'react';
// 导入组件
const DownloadButton = lazy(() => asyncImport('${appId}', 'components/DownloadButton'));
regOvProps('weappUi', 'Title', (props) => {
try {
if (props.weId.endsWith('_6xdqsn') && location.href.includes('/sp/workflow/flowpage/view') && enable()) {
const { buttons } = props;
if (buttons && buttons.length > 0 && formData) {
buttons.splice(buttons.length - 1, 0,
<Suspense fallback={<span></span>}>
<DownloadButton formData={formData} />
</Suspense>
);
}
}
} catch (e) {
console.error('注入下载按钮出现异常', e);
}
return props;
}, 1);
**关键点:**
- `props.weId.endsWith('_6xdqsn')` — 通过 Title 组件的 weId 后缀定位到目标位置
- `buttons.splice(buttons.length - 1, 0, ...)` — 插入到倒数第二个位置,保留系统原有按钮
- `Suspense` + `lazy` — 组件懒加载,进行异步导入组件(entry.js 文件导入组件做法)
- 使用 `try-catch` 包裹,确保即使出错也不影响原有渲染
4. 判断当前流程和节点是否需要添加按钮
根据配置文件(config.js),通过 enable 函数判断当前流程和节点是否需要显示按钮:
function enable() {
const formSdk = window.WeFormSDK?.getWeFormInstance();
if (!formSdk) return false;
const info = formSdk.getBaseInfo();
const formId = info?.formId;
const nodeId = info?.customParam?.nodeId;
if (!formId || !nodeId) return false;
return config.workflows.some(w => w.formId === formId && w.nodeIds.includes(nodeId));
}