From 7ae2ec03a773c2223feabbd1e341e90f012f8b7e Mon Sep 17 00:00:00 2001 From: Electrolux <59329360+electroluxcode@users.noreply.github.com> Date: Wed, 24 Apr 2024 18:00:13 +0800 Subject: [PATCH] feat(BasicForm->Components): add beforeFetch & afterFetch to apicomp && perf the code (#3786) * fix(apitree): fix the error way to use resultfield * feat: add before & after Fetch fn in apiComp --- .../Form/src/components/ApiCascader.vue | 48 +++++++++++++------ .../Form/src/components/ApiRadioGroup.vue | 22 +++++++-- .../Form/src/components/ApiSelect.vue | 22 +++++++-- .../Form/src/components/ApiTransfer.vue | 27 ++++++++--- .../Form/src/components/ApiTree.vue | 36 +++++++++----- .../Form/src/components/ApiTreeSelect.vue | 28 ++++++++--- 6 files changed, 134 insertions(+), 49 deletions(-) diff --git a/src/components/Form/src/components/ApiCascader.vue b/src/components/Form/src/components/ApiCascader.vue index 6ac121ec..6f148db8 100644 --- a/src/components/Form/src/components/ApiCascader.vue +++ b/src/components/Form/src/components/ApiCascader.vue @@ -69,6 +69,14 @@ displayRenderArray: { type: Array, }, + beforeFetch: { + type: Function as PropType, + default: null, + }, + afterFetch: { + type: Function as PropType, + default: null, + }, }); const emit = defineEmits(['change', 'defaultChange']); @@ -112,19 +120,25 @@ }, [] as Option[]); } - async function initialFetch() { - const api = props.api; + async function fetch() { + let { api, beforeFetch, initFetchParams, afterFetch, resultField } = props; if (!api || !isFunction(api)) return; apiData.value = []; loading.value = true; try { - const res = await api(props.initFetchParams); + if (beforeFetch && isFunction(beforeFetch)) { + initFetchParams = (await beforeFetch(initFetchParams)) || initFetchParams; + } + let res = await api(initFetchParams); + if (afterFetch && isFunction(afterFetch)) { + res = (await afterFetch(res)) || res; + } if (Array.isArray(res)) { apiData.value = res; return; } - if (props.resultField) { - apiData.value = get(res, props.resultField) || []; + if (resultField) { + apiData.value = get(res, resultField) || []; } } catch (error) { console.warn(error); @@ -136,20 +150,26 @@ const loadData: CascaderProps['loadData'] = async (selectedOptions) => { const targetOption = selectedOptions[selectedOptions.length - 1]; targetOption.loading = true; - - const api = props.api; + let { api, beforeFetch, afterFetch, resultField, apiParamKey } = props; if (!api || !isFunction(api)) return; try { - const res = await api({ - [props.apiParamKey]: Reflect.get(targetOption, 'value'), - }); + let param = { + [apiParamKey]: Reflect.get(targetOption, 'value'), + }; + if (beforeFetch && isFunction(beforeFetch)) { + param = (await beforeFetch(param)) || param; + } + let res = await api(param); + if (afterFetch && isFunction(afterFetch)) { + res = (await afterFetch(res)) || res; + } if (Array.isArray(res)) { const children = generatorOptions(res); targetOption.children = children; return; } - if (props.resultField) { - const children = generatorOptions(get(res, props.resultField) || []); + if (resultField) { + const children = generatorOptions(get(res, resultField) || []); targetOption.children = children; } } catch (e) { @@ -162,7 +182,7 @@ watch( () => props.immediate, () => { - props.immediate && initialFetch(); + props.immediate && fetch(); }, { immediate: true, @@ -172,7 +192,7 @@ watch( () => props.initFetchParams, () => { - !unref(isFirstLoad) && initialFetch(); + !unref(isFirstLoad) && fetch(); }, { deep: true }, ); diff --git a/src/components/Form/src/components/ApiRadioGroup.vue b/src/components/Form/src/components/ApiRadioGroup.vue index dc6b9a60..f90daa26 100644 --- a/src/components/Form/src/components/ApiRadioGroup.vue +++ b/src/components/Form/src/components/ApiRadioGroup.vue @@ -57,6 +57,14 @@ labelField: propTypes.string.def('label'), valueField: propTypes.string.def('value'), immediate: propTypes.bool.def(true), + beforeFetch: { + type: Function as PropType, + default: null, + }, + afterFetch: { + type: Function as PropType, + default: null, + }, }); const emit = defineEmits(['options-change', 'change', 'update:value']); @@ -95,19 +103,25 @@ ); async function fetch() { - const api = props.api; + let { api, beforeFetch, afterFetch, params, resultField } = props; if (!api || !isFunction(api)) return; options.value = []; try { loading.value = true; - const res = await api(props.params); + if (beforeFetch && isFunction(beforeFetch)) { + params = (await beforeFetch(params)) || params; + } + let res = await api(params); + if (afterFetch && isFunction(afterFetch)) { + res = (await afterFetch(res)) || res; + } if (Array.isArray(res)) { options.value = res; emitChange(); return; } - if (props.resultField) { - options.value = get(res, props.resultField) || []; + if (resultField) { + options.value = get(res, resultField) || []; } emitChange(); } catch (error) { diff --git a/src/components/Form/src/components/ApiSelect.vue b/src/components/Form/src/components/ApiSelect.vue index d1479c8a..df59336d 100644 --- a/src/components/Form/src/components/ApiSelect.vue +++ b/src/components/Form/src/components/ApiSelect.vue @@ -54,6 +54,14 @@ type: Array, default: [], }, + beforeFetch: { + type: Function as PropType, + default: null, + }, + afterFetch: { + type: Function as PropType, + default: null, + }, }); const emit = defineEmits(['options-change', 'change', 'update:value']); @@ -103,20 +111,26 @@ ); async function fetch() { - const api = props.api; + let { api, beforeFetch, afterFetch, params, resultField } = props; if (!api || !isFunction(api) || loading.value) return; optionsRef.value = []; try { loading.value = true; - const res = await api(props.params); + if (beforeFetch && isFunction(beforeFetch)) { + params = (await beforeFetch(params)) || params; + } + let res = await api(params); + if (afterFetch && isFunction(afterFetch)) { + res = (await afterFetch(res)) || res; + } isFirstLoaded.value = true; if (Array.isArray(res)) { optionsRef.value = res; emitChange(); return; } - if (props.resultField) { - optionsRef.value = get(res, props.resultField) || []; + if (resultField) { + optionsRef.value = get(res, resultField) || []; } emitChange(); } catch (error) { diff --git a/src/components/Form/src/components/ApiTransfer.vue b/src/components/Form/src/components/ApiTransfer.vue index df539564..11edd865 100644 --- a/src/components/Form/src/components/ApiTransfer.vue +++ b/src/components/Form/src/components/ApiTransfer.vue @@ -32,7 +32,14 @@ dataSource: { type: Array as PropType> }, immediate: propTypes.bool.def(true), alwaysLoad: propTypes.bool.def(false), - afterFetch: { type: Function }, + beforeFetch: { + type: Function as PropType, + default: null, + }, + afterFetch: { + type: Function as PropType, + default: null, + }, resultField: propTypes.string.def(''), labelField: propTypes.string.def('title'), valueField: propTypes.string.def('key'), @@ -98,23 +105,29 @@ ); async function fetch() { - const api = props.api; + let { api, beforeFetch, afterFetch, params, resultField, dataSource } = props; if (!api || !isFunction(api)) { - if (Array.isArray(props.dataSource)) { - _dataSource.value = props.dataSource; + if (Array.isArray(dataSource)) { + _dataSource.value = dataSource; } return; } _dataSource.value = []; try { - const res = await api(props.params); + if (beforeFetch && isFunction(beforeFetch)) { + params = (await beforeFetch(params)) || params; + } + let res = await api(params); + if (afterFetch && isFunction(afterFetch)) { + res = (await afterFetch(res)) || res; + } if (Array.isArray(res)) { _dataSource.value = res; emitChange(); return; } - if (props.resultField) { - _dataSource.value = get(res, props.resultField) || []; + if (resultField) { + _dataSource.value = get(res, resultField) || []; } emitChange(); } catch (error) { diff --git a/src/components/Form/src/components/ApiTree.vue b/src/components/Form/src/components/ApiTree.vue index d2b9597c..56f93580 100644 --- a/src/components/Form/src/components/ApiTree.vue +++ b/src/components/Form/src/components/ApiTree.vue @@ -7,10 +7,10 @@