跳到主要内容

customFunc

unitedSchema 中为我们提供了 vcontrolonChange 两个字段,分别用于控制表单内的显隐联动,以及修改表单需要的额外操作。我们可以通过直接书写函数体,并以 string 类型配置在 UISchema 中,来实现我们想要的变化。

但当我们的配置项复杂到一定程度时,这些控制的函数体也会变得复杂,在里面书写函数体显然不是明智的选择,甚至会造成 JSON 解析能力的下降。

因此我们可以使用函数占位符来解决这一问题,用 $$ 对该项进行特殊标识:

  • JSON 配置

    unitedSchema.json
    {
    "showError": "change",
    "type": "object",
    "theme": "drip-theme",
    "schema": [
    {
    "title": "开关",
    "type": "string",
    "ui": {
    "type": "switch",
    "onChange": "$$switchChange"
    },
    "fieldKey": "switchItem"
    },
    {
    "type": "string",
    "title": "自定义组件",
    "ui": {
    "type": "text",
    "vcontrol": "$$textVcontrol"
    },
    "fieldKey": "text1"
    }
    ]
    }

    可以看到针对 switchItemtextItem 表单项,我们分别为其配置了 $$switchChange$$textVcontrol 两个占位符。

    接下来,我们可以通过生成器将书写在外部的函数进行导入。

  • 使用 drip-form 的组件

    Form.jsx
    // 定义函数占位符中需要的函数
    const customFuncMap = useMemo(() => {
    return {
    '$$switchChange': (val, dispatch, fieldKey) => {
    dispatch({
    type: 'setData',
    action:{
    set:{
    [fieldKey]: val
    }
    }
    })
    },
    '$$textVcontrol': (formData, uiSchema, dataSchema) => {
    return !formData.switchItem
    }
    }
    })

    return <DripForm
    ...
    // 传入自定义函数
    customFunc={customFuncMap}
    >

    这样,我们就可以在外部更轻松地对表单的变更进行动态控制。