el-cascader组件实现动态加载省市县数据的简单记录
需求简述:
项目中编辑页面有个籍贯的表单,点击时需要通过接口依次获取省、市、县的数据。elementUI中有现成的级联组件:el-cascader。
问题:
如何实现动态获取数据?
代码如下:
组件代码:
<el-form-item label="籍贯" prop="a22">
<el-cascader style="width: 100%" clearable
v-model="cinaPLForm.a22"
placeholder="请选择籍贯"
:key="'a22'+flgNum"
v-if="dataModel.a22Key == cinaPLForm.id+'a22'"
:options="a22Options"
:props="props"
:show-all-levels="false"
@expand-change="expandChangeA22">
</el-cascader>
</el-form-item>
其中v-model="cinaPLForm.a22"是绑定变量; :options="a22Options"是存储省市县数据的; :props="props"是对数据的对应处理;:show-all-levels="false" 我这里不需要显示全路径,只需要显示最后一级的名字即可;@expand-change="expandChangeA22" 实现点击后获取下一级别的数据。
js代码摘要如下:
<script>
export default {
data() {
return {
flgNum:0,
areaDicTypes:["DD_ZONE_PROVINCE","DD_ZONE_CITY","DD_ZONE_COUNTRY","DD_ZONE_TOWN"],
a22Options: [], // 籍贯
props: {
value: 'id',
label:'text'
},
//接口获取的编辑页面信息
cinaPLForm:{
a22: []
}
}
},
methods: {
init (item) {
this.cinaPLForm.a22 = []; //先初始化为[],否则在a22有值并且再次打开同记录的该界面会报level为null的js错误
this.flgNum ++;
this.$nextTick(() => {
//重置数据
this.resetData();
// //初始化省份数据
let typeJson = {"uniqIde":this.areaDicTypes[0],"par":""};
findDictsAndBack(typeJson,this,'proDataCallBack');
})
},
resetData(){
this.resetForm('cinaPLForm');
this.a22Options = [];
},
//重置查询条件
resetForm (formName) {
this.$refs[formName].resetFields();
},
//省级数据回调函数
proDataCallBack(resProData,callData){
resProData.map(item=>{
this.$set(item,'children',[])
})
this.a22Options = resProData;
this.hkdzOptions = resProData;
this.xzzOptions = resProData;
//获取信息
this.getCinaPLForm();
},
//市级数据回调函数
cityDataCallBack(resCityData,callData){
let _this = this;
let callCityData = callData.callData;
let optionName = callData.opName;
resCityData.map(item=>{
this.$set(item,'children',[])
})
let tempProData = JSON.parse(JSON.stringify(_this[optionName]));
let inxPro = tempProData.map((item) => item.id).indexOf(callCityData[0]);
tempProData[inxPro].children = resCityData;
_this[optionName] = tempProData;
if(callCityData.length > 2){
let typeJson = {"uniqIde":this.areaDicTypes[2],"par":callCityData[1]};
let optionName = callData.opName;
if(optionName == "a22Options"){
findDictsAndBack(typeJson,this,'countyA22DataCallBack',callData);
}else{
findDictsAndBack(typeJson,this,'countyDataCallBack',callData);
}
}
},
//县级a22数据回调函数
countyA22DataCallBack(resCountyData,callData){
let _this = this;
let callCountyData = callData.callData;
let optionName = callData.opName;
let tempData = JSON.parse(JSON.stringify(_this[optionName]));
let inxPro = tempData.map((item) => item.id).indexOf(callCountyData[0]);
let inxCity = tempData[inxPro].children.map((item) => item.id).indexOf(callCountyData[1]);
tempData[inxPro].children[inxCity].children = resCountyData;
_this[optionName] = tempData;
},
//籍贯地区级联组件点击展示时触发事件
expandChangeA22(v1){
if(v1.length < 3){
this.getAreasData(v1,"a22Options");
}
},
getAreasData(vArr,opName){
let _this = this;
let areaCode = "";
let levelStr = 0;
let par = "";
if(vArr.length > 0){
areaCode = vArr[vArr.length-1];
par = areaCode;
levelStr = vArr.length;
}
let uniqIde = _this.areaDicTypes[levelStr]; // DD_ZONE_PROVINCE DD_ZONE_CITY DD_ZONE_COUNTRY DD_ZONE_TOWN
let typeJson = {"uniqIde":uniqIde,"par":par};
if(vArr.length == 1){
findDictsAndBack(typeJson,this,'cityDataCallBack',{callData:vArr,opName:opName});
}else if(vArr.length == 2){
findDictsAndBack(typeJson,this,'countyDataCallBack',{callData:vArr,opName:opName});
}else if(vArr.length = 3){
findDictsAndBack(typeJson,this,'townDataCallBack',{callData:vArr,opName:opName});
}
},
getCinaPLForm(){
//其中接口返回后,对a22数据的处理:
if(!(caseInfo.a22 == null || !caseInfo.a22)){
let intA22ProCode = (caseInfo.a22.substr(0,2)+"0000000000");
let intA22CityCode = (caseInfo.a22.substr(0,4)+"00000000");
let tempA22Arr = [intA22ProCode,intA22CityCode,caseInfo.a22]
_this.cinaPLForm.a22 = tempA22Arr;
let typeJson = {"uniqIde":this.areaDicTypes[1],"par":intA22ProCode};
findDictsAndBack(typeJson,this,'cityDataCallBack',{callData:tempA22Arr,opName:"a22Options"});
}else{
_this.cinaPLForm.a22 = [];
}
}
}
:key+v-if+js代码中的初始化赋值a22为[],可解决不同操作打开页面的level为null的bug。
}
</script>
附父页面打开本页面时的js代码摘要:
viewHandle (item,sourceType) {
item.a22Key = item.id+"a22";
this.$nextTick(() => {
this.$refs.cinaPatientAndFlowView.init(item)
})
},
相关推荐
2. **配置Cascader组件**:在模板中,添加`<el-cascader>`元素,并设置其`options`属性为`areas`,以加载我们的地区数据。还可以根据需求设置其他属性,如`props`(指定各个字段名)、`clearable`(是否可清除选择)...
本篇文章将深入探讨如何在Element的Cascader组件中实现省市区数据的动态加载。 首先,Cascader组件的动态加载功能依赖于`options`属性,它接受一个数组,每个数组元素代表一级菜单,包含`value`和`children`两个...
在IT行业中,尤其是在前端开发领域,我们经常遇到需要实现数据联动的效果,比如省市区三级联动。这个场景在网站用户注册、地址填写等地方非常常见。`regionData.rar` 文件提供的内容,显然就是为了实现这种功能而...
在element-ui组件库中的el-cascader组件可以帮助实现级联选择器功能,通过编写相应的业务逻辑代码,用户可以在选择一个区域时,动态地加载和显示其下属区域供用户进一步选择。 例如,当用户选择一个省时,el-...
本文将详细介绍如何使用ElementUI库中的`el-cascader`组件来实现一个动态级联选择器,并通过具体的代码示例进行解释。 #### 二、ElementUI简介 ElementUI是一款基于Vue.js的桌面端组件库,它提供了丰富的UI组件来...
省市区3级联动数据,包含港澳台下的市区,可用于 ant design 下的各个组件库
总结,通过Vue.js、Element UI和Axios的组合,可以轻松实现省市区三级联动的前端组件。关键在于理解数据结构,利用Vue的数据绑定和事件机制,以及Element UI提供的UI组件。正确配置和处理数据变化,就能实现流畅的...
全国地区 细分至省市区县街道 element级联选择器适用
ElementUI的`el-cascader`组件非常适合用于级联选择,它提供了丰富的属性配置和事件监听,可以方便地实现省市区的联动选择。 ```html <el-row> <el-cascader size="small" :options="city.options" :props=...
在Element-UI中实现城市三级联动菜单,关键在于合理地组织数据结构,利用`<el-cascader>`组件的属性和事件,以及有效地处理异步数据加载。回显问题的处理则涉及到在数据加载和表单初始化之间的同步操作。通过以上...