elementUI官方文档对级联选择器的动态加载数据介绍的比较简单,我在使用的时候遇到了点坑。
从文档中可以看出,动态加载的方法比较简单,代码如下:
<el-cascader :props="props"></el-cascader>
<script>
let id = 0;
export default {
data() {
return {
props: {
lazy: true,
lazyLoad (node, resolve) {
const { level } = node;
setTimeout(() => {
const nodes = Array.from({ length: level + 1 })
.map(item => ({
value: ++id,
label: `选项${id}`,
leaf: level >= 2
}));
// 通过调用resolve将子节点数据返回,通知组件数据加载完成
resolve(nodes);
}, 1000);
}
}
};
}
};
</script>
我们可以看到,只要给el-cascader
组件传入props
属性,并在props
属性中设置lazy:true
,lazyLoad
函数即可以开启动态加载,需要注意的是,lazyLoad
是一个函数。
遇到的问题
但是在实际的使用中,在data
里面定义一个函数显得太过臃肿,我更喜欢在methods里面去定义动态加载数据的方法。但是当将lazyLoad
的值设置为一个函数的时候,会提示函数不存在,我们来分析下这个问题的原因及解决方案。
el-cascader组件中的this
我们可以在lozyLoad
函数中输出this
,来查看为什么加载数据的方法initData
不存在。
props:{
checkStrictly : true,
lazy:true,
lazyLoad(node,resolve){
console.log(this,'lazyLoad')
// this.initData(node,resolve)
}
}
由上图可以看到,
el-cascader
组件中的this
指向的是组件本身,并不是我们调用组件时候的vue
实例,所以,必然无法找到methods
里面的函数。
由此引发的问题:由于this
指向的不是调用组件时的vue
实例,所以我们无法取到当前项目的Vue
实例,故所有的全局数据,方法,VUEX里面的数据等等,均无法在动态加载数据时候使用。从这一点出发,这个问题必须要解决。
解决方案
由于vue
在实例初始化的时候,data
和methods
等作为选项对象传入,而data
是一个函数,所以我们可以在函数return
之前将当前vue
实例this
保存到that
中,然后在lazyLoad
函数中,通过that
调用initData
方法。
data() {
let that=this;
return {
props:{
checkStrictly : true,
lazy:true,
lazyLoad(node,resolve){
console.log(this,'lazyLoad')
console.log(that,'that')
that.initData(node,resolve)
}
}
}
},
通过这种方式,我们可以在lazyLoad
中使用我们自定义的函数了。