You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.7 KiB
60 lines
1.7 KiB
<template>
|
|
<a-cascader :load-data="loadData" :options="options">
|
|
<template #[item]="data" v-for="item in Object.keys($slots)" :key="item">
|
|
<slot :name="item" v-bind="data || {}"> </slot>
|
|
</template>
|
|
</a-cascader>
|
|
</template>
|
|
<script lang="ts">
|
|
import { defineComponent, ref, toRefs } from 'vue';
|
|
import type { CascaderProps } from 'ant-design-vue';
|
|
import { http } from '/nerv-lib/util';
|
|
import { AxiosRequestConfig } from 'axios';
|
|
import { useApi } from '/nerv-lib/use';
|
|
import { get } from 'lodash-es';
|
|
const { httpRequest } = useApi();
|
|
export default defineComponent({
|
|
name: 'NsCascader',
|
|
props: {
|
|
api: [Function, String, Object],
|
|
options: Array,
|
|
listField: {
|
|
type: String,
|
|
default: 'data',
|
|
},
|
|
defaultParams: Object,
|
|
},
|
|
setup(props, { attrs }) {
|
|
console.log(props, attrs);
|
|
const requestConfig: AxiosRequestConfig = { method: 'get' };
|
|
let options = ref<any[]>(props['options'] || []);
|
|
|
|
if (props.api) {
|
|
// eslint-disable-next-line vue/no-setup-props-destructure
|
|
const { api, defaultParams, listField } = props;
|
|
httpRequest({
|
|
api,
|
|
params: defaultParams,
|
|
pathParams: {},
|
|
requestConfig,
|
|
}).then((res) => {
|
|
options.value = get(res, listField);
|
|
});
|
|
}
|
|
let loadData: CascaderProps['loadData'] | null = (selectOptions) => {
|
|
attrs['loadData'](selectOptions, options, attrs);
|
|
};
|
|
if (attrs['loadData']) {
|
|
loadData(options);
|
|
} else {
|
|
loadData = null;
|
|
}
|
|
|
|
return {
|
|
loadData,
|
|
options,
|
|
};
|
|
},
|
|
});
|
|
</script>
|
|
<style lang="less" scoped></style>
|
|
|