<el-form-item label="类型" prop="typeMap">
<el-cascader
v-model="selectedValues"
:options="typeMapOptions"
:props="typeMapProps"
@expand-change="handleCascaderChange"
@change="handleChange"
filterable
></el-cascader>
</el-form-item>
/** 类型选项 1开展宣传情况、2开展活动情况、3政务接待保障情况、4提供场地情况、5综合窗口服务情况、6公共法律服务情况*/
const types = ref([
{label: '开展宣传情况', value: '1', multiple: false /*第二级为单选*/},
{label: '开展活动情况', value: '2', multiple: false /*第二级为单选*/},
{label: '政务接待保障情况', value: '3', multiple: true /*第二级为多选*/},
{label: '提供场地情况', value: '4', multiple: false /*第二级为单选*/},
{label: '综合窗口服务情况', value: '5', multiple: false /*第二级为单选*/},
{label: '公共法律服务情况', value: '6', multiple: false /*第二级为单选*/},
]);
const subTypes = ref([
{ label: '微信推文', value: '1_01' },
{ label: '视频', value: '1_02' },
{ label: '开展活动', value: '2_01' },
{ label: '政务接待', value: '3_01' },
{ label: '提供会务保障', value: '3_02' },
{ label: '免费场地', value: '4_01' },
{ label: '住院补助', value: '5_01' },
{ label: '参续保', value: '5_02' },
{ label: '电话及现场接访', value: '6_01' },
]);
// 转换为指定结构的函数
function transformToNewStructure(types, subTypes) {
return types.map((type, index) => {
return {
id: index + 1,
label: type.label,
value: type.value,
disabled: false,
children: subTypes.filter(subType => subType.value.startsWith(type.value))
.map(subType => ({
id: subType.value.split('_')[1],
label: subType.label,
value: subType.value
})),
multiple: type.multiple
};
});
}
// 使用转换函数并打印结果
const typeMapOptions = ref(transformToNewStructure(types.value, subTypes.value));
const selectedValues = ref([]);
const typeMapProps = ref({
multiple: false,
checkStrictly: false,
expandTrigger: 'hover'
/* emitPath: false*/
});
const handleChange = (value, selectedData) => {
// selectedValues.value = undefined;
console.log('value', value);
console.log('selectedData', selectedData);
};
// 展开二级进行触发
const handleCascaderChange = (value) => {
const isMultiple = types.value.find(item => item.value === value[0])?.multiple;
selectedValues.value = []; // 重置选中值
if (isMultiple) {
typeMapProps.value.multiple = isMultiple;
}else {
typeMapProps.value.multiple = false;
}
};
function convertComponentToBackendFormat(options, isMultiple) {
if (isMultiple) {
const typeMap = new Map();
options.forEach(([type, subType]) => {
if (!typeMap.has(type)) {
typeMap.set(type, []);
}
typeMap.get(type).push(subType);
});
const result = {};
typeMap.forEach((subTypes, type) => {
result.type = type;
result.subType = subTypes.join(',');
});
return result;
} else {
return { type: options[0], subType: options[1] };
}
}
let singleSelectBackend = convertComponentToBackendFormat([m, n], false);
console.log(singleSelectBackend);
let multipleSelectBackend = convertComponentToBackendFormat([[m, n], [m, p]], true);
console.log(multipleSelectBackend);
function convertBackendToComponentFormat(data, isMultiple) {
if (isMultiple) {
const subTypes = data.subType.split(',').map(subType => [data.type, subType]);
return subTypes;
} else {
return [data.type, data.subType];
}
}
let backendDataForSingle = { type: m, subType: n };
let frontendDataForSingle = convertBackendToComponentFormat(backendDataForSingle, false);
console.log(frontendDataForSingle);
let backendDataForMultiple = { type: m, subType: "n,p" };
let frontendDataForMultiple = convertBackendToComponentFormat(backendDataForMultiple, true);
console.log(frontendDataForMultiple);