可以帮我使用element ui写个级联选择器传入不同的数据都可以实现动态加载的方法吗
时间: 2023-12-24 22:02:43 浏览: 75
当使用element ui时,可以使用`<el-cascader>`组件实现级联选择器。该组件支持通过异步加载数据来实现级联选择器的动态加载,可以根据传入的数据动态加载下一级别的选项。可以通过以下代码实现:
```vue
<template>
<el-cascader
:options="options"
:props="props"
@change="handleChange"
v-model="selectedValues"
clearable
></el-cascader>
</template>
<script>
export default {
props: {
data: {
type: Array,
required: true
},
props: {
type: Object,
default: function() {
return { value: 'id', label: 'name', children: 'children' };
}
}
},
data() {
return {
options: [],
selectedValues: []
};
},
mounted() {
// 初始化数据
this.loadData(0);
},
methods: {
loadData(index) {
this.options[index].loading = true;
// 模拟异步加载数据
setTimeout(() => {
this.options[index].children = this.getChildrenData(this.options[index][this.props.value]);
this.options[index].loading = false;
}, 1000);
},
getChildrenData(parentId) {
// 根据父级ID获取对应的下级选项数据
// 这里可以根据具体的需求进行修改
let childrenData = [];
for (let i = 0; i < this.data.length; i++) {
if (this.data[i][this.props.parentId] === parentId) {
childrenData.push(this.data[i]);
}
}
return childrenData;
},
handleChange(value) {
console.log(value);
}
},
watch: {
data: {
immediate: true,
handler(newValue) {
// 将传入的数据转换成符合el-cascader格式的options数据
this.options = newValue.filter(item => !item[this.props.parentId]).map(item => {
return {
...item,
children: [],
loading: false
}
});
}
},
options: {
handler(newValue) {
// 监听options数据变化,如果有新的选项被添加,则自动加载其子选项
for (let i = 0; i < newValue.length; i++) {
if (newValue[i].children.length === 0 && !newValue[i].loading) {
this.loadData(i);
break;
}
}
},
deep: true
}
}
};
</script>
```
在这段代码中,我们定义了一个带有`data`和`props`两个属性的组件,用于传入级联选择器的数据和属性名。在`data`属性中,我们可以传入任意层级的数据,组件会根据传入的数据动态加载下一级别的选项。在`props`属性中,我们可以传入不同层级的选项的`value`、`label`和`children`属性名,以适应不同的数据格式。在`mounted`生命周期函数中,我们调用`loadData`方法来初始化数据。在`loadData`方法中,我们使用了`setTimeout`来模拟异步加载数据,并在加载完成后将子选项设置到对应的选项中。在`handleChange`方法中,我们可以获取到用户选择的值。在`watch`选项中,我们监听了`data`和`options`的变化,以自动加载子选项。
阅读全文