diff --git a/packages/form/src/fields/Select.vue b/packages/form/src/fields/Select.vue index 9a9c447f..238853c2 100644 --- a/packages/form/src/fields/Select.vue +++ b/packages/form/src/fields/Select.vue @@ -372,7 +372,12 @@ const getInitOption = async () => { }); } - let initData = getValueByKeyPath(initRoot || root, res); + let initData: any; + try { + initData = getValueByKeyPath(initRoot || root, res); + } catch { + // 响应中不存在 initRoot/root 路径时按无数据处理 + } if (initData) { if (!Array.isArray(initData)) { initData = [initData]; @@ -417,8 +422,12 @@ if (typeof props.config.options === 'function') { const v = props.model[props.name]; if (Array.isArray(v) ? !v.length : typeof v === 'undefined') return; if (typeof v === 'undefined' || hasOption(v)) return; - const data = await getInitOption(); - setOptions(data); + try { + const data = await getInitOption(); + setOptions(data); + } catch { + setOptions([]); + } }; watch( diff --git a/packages/form/tests/unit/fields/Select.spec.ts b/packages/form/tests/unit/fields/Select.spec.ts index 4053f2f1..0d2a1ac1 100644 --- a/packages/form/tests/unit/fields/Select.spec.ts +++ b/packages/form/tests/unit/fields/Select.spec.ts @@ -691,4 +691,16 @@ describe('Select - getInitOption 初始化接口分支', () => { expect((wrapper.findComponent(MSelect).vm as any).options).toEqual([]); }); + + test('init 请求失败时 options 为空且不抛未处理异常', async () => { + request = vi.fn(async () => { + throw new Error('init-fail'); + }); + setConfig({ request }); + + const wrapper = mountFormWithRequest({ initUrl: 'https://example.com/init', initRoot: 'data.obj' }, { s: 'a' }); + await flushAsync(); + + expect((wrapper.findComponent(MSelect).vm as any).options).toEqual([]); + }); });