项目中原先是展示的一级数据,后面根据需求改成精确到县的。
使用Cascader级联选择,后台返回的是获取省份的字典接口,根据codeValue一级级查询进行动态加载。
<a-form-model-item prop="projectArea" ref="projectArea" :labelCol="{ span: 10 }" :wrapperCol="{ span: 12 }" label="项目部所在地:" > <a-tooltip> <template slot="title"> 项目部所在地 </template> <a-cascader :allowClear="false" :options="projectAreaOptions" v-model="form1.projectArea" placeholder="请选择区域" :loadData="loadAreaData" @change="onAreaChange" :getPopupContainer="(trigger) => {return trigger.parentElement}"> </a-cascader> </a-tooltip> </a-form-model-item>
async mounted() { this.getAppendTemplate(); const data = await this.getAreaList() || []; this.projectAreaOptions = data.map(item => { item.leaf = false; return item; }) }
//获取省份数据 getAreaList(code) { return new Promise((resolve, reject) => { code = -1; publicapi.findAllProvinceLazy(code).then(res => { if (res.options) { let arr = res.options.map(item => { return { value: item.id, label: item.label, isLeaf: item.leaf } }) return resolve(arr) } else { return resolve([]) } }).catch((err) => { return reject(err) }) }) }, //获取下一级数据 async loadAreaData(selectedOptions) { if (!this.projectAreaOptions.length) { this.projectAreaOptions = await this.getAreaList() || []; } else { const targetOption = selectedOptions[selectedOptions.length - 1]; targetOption.loading = true; const data = await publicapi.findAllProvinceLazy(targetOption.value); console.log(data, 'targetOption.value', targetOption.value); if (data.options.length) { for (let index = 0; index < data.options.length; index ++) { const element = data.options[index]; if (element.children) { delete element.children } element.value = element.id; element.isLeaf = false; } targetOption.loading = false; targetOption.children = [...data.options]; this.projectAreaOptions = JSON.parse( JSON.stringify(this.projectAreaOptions) ); } else { targetOption.loading = false; targetOption.isLeaf = true; } } }, //选择区域后的操作 onAreaChange(val, selectedOptions) { console.log(val, selectedOptions, 'val, selectedOptions') },
非懒加载的级联,后台一次性返回所有数据机构
<a-cascader :options="projectAreaOptions" v-model="form1.projectArea" placeholder="请选择区域" @change="onAreaChange" :field-names="{label: 'label', value: 'id', children: 'children'}" :getPopupContainer="(trigger) => {return trigger.parentElement}" />
使用fieldNames自定义options 中 label name children 的字段
后台返回的数据