在学院信息和专业信息的获取这有两种可行方案,一种是分开获取,先获取学院,再根据学院获取专业;另一种是直接获取到整个学院跟专业的映射,然后根据这个来在前端进行展示,无需二次请求。这两种方法各有利弊,但是在这里,第一种方法是不可行的,因为我们是要在一个列表里面选择专业,如果在分开获取的话,会出现很多网络请求来获取专业信息;还有就是,如果一下子修改两行数据的话,两行的学院不一样,那么专业获取的内容将会出错,造成不必要的数据出错的问题。因此,我们将获取专业与学院结合,放入全局的config中。
collegeAndMajor:function(){
return {1:{name:'软件学院',
children:{
101:'软件工程',
102:'数字媒体'}
}, 3:{name:'ddd',
children:{
'301':'dddm'
}
}
};
}
然后我们要通过什么形式来展示呢?
这里,我们选择了级联选择器Cascader,样子是这样的。
我们需要在table组件中,先获取到映射表,然后将其转化成我们所需要的数据类型:
this.schoolData=config.collegeAndMajor();
this.schoolOptions=[]
for(let key in this.schoolData){
let cd = [];
for(let c in this.schoolData[key]['children']){
cd.push({
value: c,
label: this.schoolData[key]['children'][c],
})
}
this.schoolOptions.push({
value: key,
label: this.schoolData[key]['name'],
children: cd,
})
}
然后,级联选择器组件会根据这个来进行渲染:
{
title: '学院&专业',
dataIndex: 'xm',
key: 'xm',
render: (val,line) => {
return this.state.changeLine[line.key]?( <Cascader options={this.schoolOptions} defaultValue={[val[0].toString(),val[1].toString()]} onChange={(value)=>{let v = value.length==0?val:value;this.modify(line.key,'xm',v)}} />
):(this.schoolData[val[0]]['name']+'/'+this.schoolData[val[0]]['children'][val[1]])
}
}
就这样,解决了学院与专业获取的难题。