You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在react-jsonschema-form中根据下拉选项动态更新schema与uiSchema

react-jsonschema-form 动态新增字段实现方案

这个需求完全可以实现,常见有两种实现方案,可根据业务复杂度选择:

方案1:使用官方内置dependencies规则(无需手动维护状态,适合固定规则场景)

react-jsonschema-form 原生支持依赖项配置,直接在 schema 中定义字段依赖规则即可实现选中对应选项后自动新增字段,uiSchema 可提前写好所有动态字段的配置,未触发展示时不会生效。
示例代码如下:

// schema 配置示例
const schema = {
  type: "object",
  properties: {
    // 下拉选择字段
    selectType: {
      type: "string",
      title: "选择类型",
      enum: ["default", "withB"]
    },
    a: {
      type: "string",
      title: "原有字段A"
    }
  },
  // 依赖规则配置
  dependencies: {
    selectType: {
      oneOf: [
        // 选中default时,无新增字段
        {
          properties: {
            selectType: { const: "default" }
          }
        },
        // 选中withB时,新增b字段
        {
          properties: {
            selectType: { const: "withB" },
            b: {
              type: "string",
              title: "动态新增字段B"
              // 其他b字段的schema配置
            }
            // 需要多个新增字段直接在此处扩展即可
          }
        }
      ]
    }
  }
}

// uiSchema 提前配置所有字段的样式即可
const uiSchema = {
  selectType: {
    "ui:widget": "select"
  },
  a: {
    // a字段原有配置
  },
  b: {
    "ui:widget": "textarea"
    // b字段的ui配置
  }
}

该方案优势是逻辑全部收敛在schema配置中,无需自己维护状态变更,适合新增字段规则固定的场景;缺点是灵活度有限,不支持动态拉取字段配置等复杂逻辑。

方案2:监听表单值变更手动更新配置(适合复杂动态场景)

如果你的新增字段规则比较复杂,比如需要根据接口返回动态生成字段、或者多选项叠加新增字段,可直接把schema和uiSchema存在组件状态中,监听下拉框变化手动合并新增配置即可,示例代码如下:

import { useState } from 'react'
import Form from '@rjsf/core'

// 初始基础配置
const BASE_SCHEMA = {
  properties: {
    selectField: {
      type: "string",
      title: "下拉选择",
      enum: ["option1", "option2", "option3"]
    },
    a: {
      type: "string",
      title: "原有字段A"
    }
  }
}
const BASE_UI_SCHEMA = {
  selectField: { "ui:widget": "select" },
  a: { /* a字段原有配置 */ }
}

// 提前配置每个选项对应的新增字段配置,也可以动态从接口获取
const OPTION_ADD_CONFIG = {
  option2: {
    schema: {
      b: { type: "string", title: "新增字段B" },
      c: { type: "number", title: "新增字段C" }
    },
    uiSchema: {
      b: { "ui:widget": "textarea" },
      c: { "ui:widget": "updown" }
    }
  },
  option3: {
    schema: {
      d: { type: "boolean", title: "新增字段D" }
    },
    uiSchema: {
      d: { "ui:widget": "checkbox" }
    }
  }
}

function CustomForm() {
  const [formSchema, setFormSchema] = useState(BASE_SCHEMA)
  const [formUiSchema, setFormUiSchema] = useState(BASE_UI_SCHEMA)

  const handleFormChange = (changeObj) => {
    const selectVal = changeObj.formData.selectField
    // 深拷贝基础配置,避免引用污染
    const newSchema = JSON.parse(JSON.stringify(BASE_SCHEMA))
    const newUiSchema = JSON.parse(JSON.stringify(BASE_UI_SCHEMA))

    // 匹配当前选中选项的新增配置,合并到基础配置中
    if (OPTION_ADD_CONFIG[selectVal]) {
      const { schema: addSchema, uiSchema: addUiSchema } = OPTION_ADD_CONFIG[selectVal]
      newSchema.properties = { ...newSchema.properties, ...addSchema }
      Object.assign(newUiSchema, addUiSchema)
    }

    setFormSchema(newSchema)
    setFormUiSchema(newUiSchema)
  }

  return <Form schema={formSchema} uiSchema={formUiSchema} onChange={handleFormChange} />
}

该方案优势是灵活度极高,可支持任意复杂的动态字段生成逻辑,只需要注意修改配置时做好深拷贝,避免修改原基础配置的引用即可。


内容的提问来源于stack exchange,提问作者Muhammad Bilal Bangash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 14:36:04