perf: 优化树形过滤器

This commit is contained in:
fit2cloud-chenyw 2022-05-26 17:35:53 +08:00
parent a0fb3a62ad
commit 5113e93bb2
4 changed files with 53 additions and 32 deletions

View File

@ -14,6 +14,7 @@
v-model="labels"
v-popover:popover
:style="styles"
:collapse-tags="showNumber"
class="el-tree-select-input"
:disabled="disabled"
popper-class="select-option"
@ -119,8 +120,10 @@ export default {
}
},
// el-tree Function(h, { node, data, store }) {}
// eslint-disable-next-line vue/require-default-prop
treeRenderFun: Function,
// el-tree Function(h, { value, data, node }) {}
// eslint-disable-next-line vue/require-default-prop
filterNodeMethod: Function,
/*
文本框参数几乎支持el-select所有的API<br>
@ -215,7 +218,8 @@ export default {
ids: [], // id
visible: false, // popover v-model
width: 150,
showParent: false
showParent: false,
showNumber: false
}
},
computed: {
@ -241,6 +245,9 @@ export default {
this.ids = val === '' ? [] : [val]
}
}
},
labels: function() {
this.setShowNumber()
}
},
created() {
@ -549,6 +556,22 @@ export default {
*/
filterFun(val) {
this.$refs.tree.filter(val)
},
setShowNumber() {
this.showNumber = false
this.$nextTick(() => {
if (!this.selectParams.multiple || !this.$refs.select || !this.$refs.select.$refs.tags) {
return
}
const kids = this.$refs.select.$refs.tags.children[0].children
let contentWidth = 0
kids.forEach(kid => {
contentWidth += kid.offsetWidth
})
this.showNumber = contentWidth > ((this.$refs.select.$refs.tags.clientWidth - 35) * 0.9)
})
}
}
}

View File

@ -5,7 +5,6 @@
ref="deSelectTree"
v-model="value"
popover-class="test-class-wrap"
:is-single="isSingle"
:data="datas"
:select-params="selectParams"
:tree-params="treeParams"
@ -45,9 +44,8 @@ export default {
},
data() {
return {
showNumber: false,
selectOptionWidth: 0,
show: true,
selectOptionWidth: 0,
datas: [],
value: this.isSingle ? '' : [],
selectParams: {
@ -135,14 +133,17 @@ export default {
},
'element.options.attrs.multiple': function(value, old) {
if (typeof old === 'undefined' || value === old) return
if (!this.inDraw) {
this.value = value ? [] : null
this.element.options.value = ''
}
this.show = false
this.$nextTick(() => {
this.show = true
this.$nextTick(() => {
this.$refs.deSelectTree && this.$refs.deSelectTree.treeDataUpdateFun(this.datas)
})
})
}
@ -212,25 +213,14 @@ export default {
this.element.options.manualModify = true
}
this.setCondition()
this.showNumber = false
this.$nextTick(() => {
if (!this.element.options.attrs.multiple || !this.$refs.deSelect || !this.$refs.deSelect.$refs.tags) {
return
}
const kids = this.$refs.deSelect.$refs.tags.children[0].children
let contentWidth = 0
kids.forEach(kid => {
contentWidth += kid.offsetWidth
})
this.showNumber = contentWidth > ((this.$refs.deSelectTree.$refs.tags.clientWidth - 30) * 0.9)
})
},
setCondition() {
const val = this.formatFilterValue()
const param = {
component: this.element,
value: this.formatFilterValue(),
value: val,
operator: this.operator,
isTree: true
}
@ -267,7 +257,8 @@ export default {
return results
// return this.value
}
return this.value.split(',')
const result = this.value.split(',').map(v => v.replaceAll(SEPARATOR, ','))
return result
},
fillValueDerfault() {
@ -286,14 +277,6 @@ export default {
return datas.filter(item => !!item)
},
setOptionWidth(event) {
//
this.$nextTick(() => {
// this.selectOptionWidth = event.srcElement.offsetWidth + 'px'
this.selectOptionWidth = event.srcElement.parentElement.parentElement.offsetWidth + 'px'
})
},
/* 下面是树的渲染方法 */
_filterFun(value, data, node) {
@ -308,9 +291,9 @@ export default {
_searchFun(value) {
console.log(value, '<--_searchFun')
//
this.$refs.treeSelect.filterFun(value)
this.$refs.deSelectTree.filterFun(value)
//
// this.$refs.treeSelect.treeDataUpdateFun(treeData);
// this.$refs.deSelectTree.treeDataUpdateFun(treeData);
},
// render
_renderFun(h, { node, data, store }) {

View File

@ -88,7 +88,11 @@ class TextSelectTreeServiceImpl extends WidgetService {
const param = {
component: element,
value: !value ? [] : Array.isArray(value) ? value : value.toString().split(','),
operator: element.options.attrs.multiple ? 'in' : 'eq'
operator: element.options.attrs.multiple ? 'in' : 'eq',
isTree: true
}
if (param.value && param.value.length) {
param.value = param.value.map(val => val.replaceAll('-de-', ','))
}
return param
}

View File

@ -27,8 +27,19 @@ export const valueValid = condition => {
export const formatCondition = obj => {
const { component, value, operator, isTree } = obj
const fieldId = component.options.attrs.fieldId
let fieldId = component.options.attrs.fieldId
const viewIds = component.options.attrs.viewIds
if (isTree && !component.options.attrs.multiple && value && value.length) {
// 单选树
const val = value[0]
if (val) {
const len = val.split(',').length
if (len) {
fieldId = fieldId.split(',').slice(0, len).join(',')
}
}
}
const condition = new Condition(component.id, fieldId, operator, value, viewIds, isTree)
return condition
}