<template> <!-- 异步数据字典联动控件封装 --> <div class="data-dict" v-loading="!isFinishedGetOptions" element-loading-spinner="el-icon-loading" element-loading-background="rgba(255, 255, 255, 0)" element-loading-custom-class="loading-cascader"> <el-cascader ref="dictCascaderRef" v-model="_current" :options="filterOptions || null" :key="isFinishedGetOptions" :props="dictTreeProps" :disabled="disabled" :filterable="filterable" :clearable="clearable" :multiple="multiple" :size="size" :before-filter="beforeFilter" @blur="blurFn" @change="changeFn" ></el-cascader> </div></template><style lang="scss" scoped>>>> .loading-cascader { line-height: 32px; .el-loading-spinner { height: 32px; line-height: 32px; top: 0; margin-top: 0; text-align: right; padding-right: 10px; }}.data-dict { position: relative; .el-cascader, .el-select { display: block; width: 100%; }}</style>
import { arrayValueEquals } from '@/utils/util.js' export default { components: { }, model: { prop: 'value', event: 'input' }, props: { value: { // 对应父组件v-model中的值 type: [Array], default: () => null }, dictKey: { // type: String, required: true, default: () => '' }, checkStrictly: { type: Boolean }, needReturnCheckedNodes: { type: Boolean, }, disabled: { type: Boolean }, multiple: { type: Boolean }, filterable: { type: Boolean }, clearable: { type: Boolean }, size: { type: String }, }, data () { return { filterKey: '', filterOptions: [], orginList: [], currentVal: [], isFinishedGetOptions: false, dictTreeProps: null } }, computed: { _current: { get () { return this.currentVal }, set (val) { this.currentVal = val this.$emit('input', val) } } }, watch: { value: { handler (newVal, oldVal) { if (newVal && Array.isArray(newVal) && newVal.length) { this.currentVal = newVal } else { this.currentVal = [] } if (this.isFinishedGetOptions || arrayValueEquals(newVal, oldVal)) { return } if (this.currentVal && this.currentVal.length) { // 如果以后有值,则获取数据用于回显 this.getAllTreeByCurrent() } else { this.getTreeInfo() } }, immediate: true } }, created () { const ths = this console.log('created') ths.dictTreeProps = { lazy: true, children: 'children', label: 'name', value: 'key', multiple: ths.multiple, checkStrictly: ths.checkStrictly, lazyLoad (node, resolve) { if (node.level === 0) { ths.getInitTree(resolve) } else { ths.getChildrenInfo(node, resolve) } } } if (!ths.dictKey) { ths.isFinishedGetOptions = true return false } }, methods: { beforeFilter (val) { const ths = this ths.filterKey = val const promise = new Promise((resolve,reject)=>{ const params = { key: val, source_uri: ths.dictKey } ths.$store.dispatch('xxxxxxx/getAllTreeByKeyword', params).then(res => { const tempList = Array.isArray(res.data) ? res.data : (res.data ? [res.data] : []) if (tempList && tempList.length) { ths.filterOptions = tempList resolve(tempList) } else { reject(new Error()) } }).catch(res => { reject(new Error()) }) }) return promise }, blurFn () { this.filterKey = '' }, // 值变动后回调 changeFn (value) { let nodes = [] if (this.needReturnCheckedNodes) { nodes = this.$refs.dictCascaderRef.getCheckedNodes() || [] } this.$emit('change', value, nodes) }, // 获取子项列表 getChildrenInfo (current, resolve) { if (!current || !current.data || !current.data.id) { return false } // 如果曾经有返回子节点数据 if (current.data.leaf || (resolve && current.data.children && current.data.children.length)) { resolve([]) } else { const params = { node_id: current.data.id } const ths = this ths.$store.dispatch('dictdata/getTreeChildByKey', params).then(res => { let tempList = [] if (res.data && res.data.length && res.data[0].children && res.data[0].children.length) { tempList = this.removeEmptyFn(res.data[0].children || []) } if (resolve) { resolve(tempList) } }).catch(res => { resolve([]) }) } }, // 移除子列表为空 removeEmptyFn (list = []) { const ths = this const tempList = list tempList.forEach(item => { if (!item.children || !item.children.length) { delete item.children } else { item.children = ths.removeEmptyFn(item.children) } }) return tempList }, /** * 依据以后值获取树(用于回显 *例如 [[11,111,1111], [13,131]] 则从后盾返回第一级别所有数据【11;12;13...】,【11】children的所有数据,【111】children的所有数据,【13】children的所有数据,) */ getAllTreeByCurrent () { const ths = this const params = { path: ths.currentVal || [], source_uri: ths.dictKey } ths.isFinishedGetOptions = false ths.$store.dispatch('xxxx/getAllTreeByCurrent', params).then(res => { const tempList = Array.isArray(res.data) ? res.data : (res.data ? [res.data] : []) if (tempList && tempList.length) { ths.isFinishedGetOptions = true ths.orginList = tempList } else { ths.getTreeInfo() } }).catch(res => { ths.isFinishedGetOptions = true }) }, // 初始化信息 getTreeInfo () { const ths = this const params = { key: ths.dictKey, view_type: 'tree' } ths.isFinishedGetOptions = false ths.$store.dispatch('xxx/getTreeInfo', params).then(res => { const tempList = res.data || [] ths.orginList = tempList }).catch(res => { }).finally(() => { ths.isFinishedGetOptions = true }) }, // 初始化第一级信息 getInitTree (resolve) { const ths = this if (ths.isFinishedGetOptions) { if (resolve) { resolve(ths.orginList) } } else { setTimeout(() => { ths.getInitTree(resolve) }, 300) } } } }