案例:流程表单页面添加按钮

发布于 2026-07-09

案例:流程表单页面添加按钮

概述

通过 `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));
}