需求
项目需要做一个城市选择器,数据来源公司的后端,要求用级联选择,使用的el-cascader
思路
二次封装要尽可能保留原有的组件prop,用法尽量保持和el-cascader一致,所以采用透传的方式传递prop
javascript
<template>
<div class="container" >
<el-cascader
:options="areaOptions"
style="width: 100%"
clearable
ref="cascader"
:value="value"
@input="handleChange"
v-on="$listeners"
v-bind="$attrs"
/>
</div>
</template>
<script>
import { findListByParentId } from '@/api/area/area'
export default {
name: 'regionCascader',
props: {
value: {
type: Array,
default: () => []
},
disabledFunc: {
// 这里是判断选项是否禁用的方法
type: Function,
default: (opts, level) => {
return false
}
}
},
data() {
return {
options: []
}
},
computed: {
areaOptions() {
const setOptions = (opts, level) => {
return opts.map(opt => {
if (opt?.children?.length) {
opt.children = setOptions(opt.children, level + 1)
}
const param = {
...opt,
value: opt.id,
label: opt.areaName,
disabled: this.disabledFunc(opt, level)
}
return param
})
}
return setOptions(this.options, 0)
}
},
mounted() {
this.getList()
},
methods: {
handleChange(e) {
this.$emit('input', e)
},
getList() {
// 这里放获取数据的逻辑
},
getCheckedNodes() {
return this.$refs.cascader.getCheckedNodes()
}
}
}
</script>
<style scoped>
.container{
width: 100%;
}
</style>
后话
在VUE2中 2.6版本以后可以改为如下,去掉划线代码
在2.6版本以前,$attrs是不会获取到value字段,所以导致透传不进去,必须显示声明props.value