如何在formio.js中无需外部源,根据其他选择框过滤下拉选项?
在Formio.js中无需外部源实现选择框选项过滤
完全可行,你可以通过两种方式实现基于表单内其他选择框值的本地选项过滤:
方法一:利用组件自定义数据函数
这种方式直接在选择框的配置中嵌入逻辑,无需额外代码:
- 假设你有两个选择框:
- 第一个选择框
key设为category,选项为["电子产品", "服装", "食品"] - 第二个选择框
key设为product,需要根据category的选中值过滤预定义选项
- 第一个选择框
- 编辑
product选择框的配置,切换到Data选项卡:- 将
Data Source改为Custom - 在
Custom Data中输入以下函数(替换成你的实际选项数据):function() { const selectedCategory = this.data.category; // 预定义的完整选项列表,每个选项带分类标识 const allItems = [ { label: "手机", value: "phone", category: "电子产品" }, { label: "T恤", value: "t-shirt", category: "服装" }, { label: "苹果", value: "apple", category: "食品" }, { label: "电脑", value: "computer", category: "电子产品" }, { label: "裤子", value: "pants", category: "服装" } ]; // 过滤返回匹配分类的选项,无选中值时返回全部 return selectedCategory ? allItems.filter(item => item.category === selectedCategory) : allItems; }
- 将
- 保存配置后,当
category的选中值变化时,product的选项会自动更新。
方法二:监听表单change事件动态更新选项
这种方式适合更复杂的过滤逻辑,需要在表单渲染后添加代码:
- 获取表单实例后,添加事件监听:
// 假设formioForm是你的表单实例 formioForm.on('change', (changedComp) => { // 仅在category选择框变化时执行 if (changedComp.key === 'category') { const selectedCat = formioForm.data.category; const productComp = formioForm.getComponent('product'); // 预定义完整选项 const allItems = [ { label: "手机", value: "phone", category: "电子产品" }, { label: "T恤", value: "t-shirt", category: "服装" }, { label: "苹果", value: "apple", category: "食品" }, { label: "电脑", value: "computer", category: "电子产品" }, { label: "裤子", value: "pants", category: "服装" } ]; // 过滤选项 const filteredItems = selectedCat ? allItems.filter(item => item.category === selectedCat) : allItems; // 更新选择框选项,可选清空当前选中值 productComp.updateValue(null); productComp.setOptions(filteredItems); } });
注意事项
- 确保两个选择框的
key配置正确,否则无法正确获取数据或组件实例 - 自定义数据函数中,
this指向当前表单实例,可通过this.data访问所有表单字段值 - 若需要多条件过滤,只需扩展过滤逻辑即可
内容的提问来源于stack exchange,提问作者Philiz
相关产品推荐
相关产品推荐

