260 lines
6.6 KiB
Vue
260 lines
6.6 KiB
Vue
<template>
|
||
<a-tree-select
|
||
allowClear
|
||
labelInValue
|
||
:getPopupContainer="(node) => node.parentNode"
|
||
style="width: 100%"
|
||
:disabled="disabled"
|
||
:dropdownStyle="{ maxHeight: '400px', overflow: 'auto' }"
|
||
:placeholder="placeholder"
|
||
:loadData="asyncLoadTreeData"
|
||
:value="treeValue"
|
||
:treeData="treeData"
|
||
:multiple="multiple"
|
||
@change="onChange"
|
||
@search="onSearch">
|
||
</a-tree-select>
|
||
</template>
|
||
<script>
|
||
|
||
/*
|
||
* 异步树加载组件 通过传入表名 显示字段 存储字段 加载一个树控件
|
||
* <j-tree-select dict="aa_tree_test,aad,id" pid-field="pid" ></j-tree-select>
|
||
* */
|
||
import { getAction } from '@/api/manage'
|
||
|
||
export default {
|
||
name: 'JTreeSelect',
|
||
props: {
|
||
value:{
|
||
type: String,
|
||
required: false
|
||
},
|
||
placeholder:{
|
||
type: String,
|
||
default: '请选择',
|
||
required: false
|
||
},
|
||
dict:{
|
||
type: String,
|
||
default: '',
|
||
required: false
|
||
},
|
||
pidField:{
|
||
type: String,
|
||
default: 'pid',
|
||
required: false
|
||
},
|
||
pidValue:{
|
||
type: String,
|
||
default: '',
|
||
required: false
|
||
},
|
||
disabled:{
|
||
type:Boolean,
|
||
default:false,
|
||
required:false
|
||
},
|
||
hasChildField:{
|
||
type: String,
|
||
default: '',
|
||
required: false
|
||
},
|
||
condition:{
|
||
type:String,
|
||
default:'',
|
||
required:false
|
||
},
|
||
// 是否支持多选
|
||
multiple: {
|
||
type: Boolean,
|
||
default: false,
|
||
},
|
||
loadTriggleChange:{
|
||
type: Boolean,
|
||
default: false,
|
||
required:false
|
||
}
|
||
},
|
||
data () {
|
||
return {
|
||
treeValue: null,
|
||
treeData:[],
|
||
url:"/sys/dict/loadTreeData",
|
||
view:'/sys/dict/loadDictItem/',
|
||
tableName:"",
|
||
text:"",
|
||
code:"",
|
||
|
||
}
|
||
},
|
||
watch: {
|
||
value () {
|
||
this.loadItemByCode()
|
||
},
|
||
dict(){
|
||
this.initDictInfo()
|
||
this.loadRoot();
|
||
}
|
||
},
|
||
created(){
|
||
this.validateProp().then(()=>{
|
||
this.initDictInfo()
|
||
this.loadRoot()
|
||
this.loadItemByCode()
|
||
})
|
||
},
|
||
methods: {
|
||
loadItemByCode(){
|
||
if(!this.value || this.value=="0"){
|
||
this.treeValue = null
|
||
}else{
|
||
getAction(`${this.view}${this.dict}`,{key:this.value}).then(res=>{
|
||
if(res.success){
|
||
let values = this.value.split(',')
|
||
this.treeValue = res.result.map((item, index) => ({
|
||
key: values[index],
|
||
value: values[index],
|
||
label: item
|
||
}))
|
||
this.onLoadTriggleChange(res.result[0]);
|
||
}
|
||
})
|
||
}
|
||
},
|
||
onLoadTriggleChange(text){
|
||
//只有单选才会触发
|
||
if(!this.multiple && this.loadTriggleChange){
|
||
this.$emit('change', this.value,text)
|
||
}
|
||
},
|
||
initDictInfo(){
|
||
let arr = this.dict.split(",")
|
||
this.tableName = arr[0]
|
||
this.text = arr[1]
|
||
this.code = arr[2]
|
||
},
|
||
asyncLoadTreeData (treeNode) {
|
||
return new Promise((resolve) => {
|
||
if (treeNode.$vnode.children) {
|
||
resolve()
|
||
return
|
||
}
|
||
let pid = treeNode.$vnode.key
|
||
let param = {
|
||
pid:pid,
|
||
tableName:this.tableName,
|
||
text:this.text,
|
||
code:this.code,
|
||
pidField:this.pidField,
|
||
hasChildField:this.hasChildField,
|
||
condition:this.condition
|
||
}
|
||
getAction(this.url,param).then(res=>{
|
||
if(res.success){
|
||
for(let i of res.result){
|
||
i.value = i.key
|
||
if(i.leaf==false){
|
||
i.isLeaf=false
|
||
}else if(i.leaf==true){
|
||
i.isLeaf=true
|
||
}
|
||
}
|
||
this.addChildren(pid,res.result,this.treeData)
|
||
this.treeData = [...this.treeData]
|
||
}
|
||
resolve()
|
||
})
|
||
})
|
||
},
|
||
addChildren(pid,children,treeArray){
|
||
if(treeArray && treeArray.length>0){
|
||
for(let item of treeArray){
|
||
if(item.key == pid){
|
||
if(!children || children.length==0){
|
||
item.isLeaf=true
|
||
}else{
|
||
item.children = children
|
||
}
|
||
break
|
||
}else{
|
||
this.addChildren(pid,children,item.children)
|
||
}
|
||
}
|
||
}
|
||
},
|
||
loadRoot(){
|
||
let param = {
|
||
pid:this.pidValue,
|
||
tableName:this.tableName,
|
||
text:this.text,
|
||
code:this.code,
|
||
pidField:this.pidField,
|
||
hasChildField:this.hasChildField,
|
||
condition:this.condition
|
||
}
|
||
getAction(this.url,param).then(res=>{
|
||
if(res.success && res.result){
|
||
for(let i of res.result){
|
||
i.value = i.key
|
||
if(i.leaf==false){
|
||
i.isLeaf=false
|
||
}else if(i.leaf==true){
|
||
i.isLeaf=true
|
||
}
|
||
}
|
||
this.treeData = [...res.result]
|
||
}else{
|
||
console.log("数根节点查询结果-else",res)
|
||
}
|
||
})
|
||
},
|
||
onChange(value){
|
||
if(!value){
|
||
this.$emit('change', '');
|
||
this.treeValue = null
|
||
} else if (value instanceof Array) {
|
||
this.$emit('change', value.map(item => item.value).join(','))
|
||
this.treeValue = value
|
||
} else {
|
||
this.$emit('change', value.value,value.label)
|
||
this.treeValue = value
|
||
}
|
||
|
||
},
|
||
onSearch(value){
|
||
console.log(value)
|
||
},
|
||
getCurrTreeData(){
|
||
return this.treeData
|
||
},
|
||
validateProp(){
|
||
let mycondition = this.condition
|
||
return new Promise((resolve,reject)=>{
|
||
if(!mycondition){
|
||
resolve();
|
||
}else{
|
||
try {
|
||
let test=JSON.parse(mycondition);
|
||
if(typeof test == 'object' && test){
|
||
resolve()
|
||
}else{
|
||
this.$message.error("组件JTreeSelect-condition传值有误,需要一个json字符串!")
|
||
reject()
|
||
}
|
||
} catch(e) {
|
||
this.$message.error("组件JTreeSelect-condition传值有误,需要一个json字符串!")
|
||
reject()
|
||
}
|
||
}
|
||
})
|
||
}
|
||
},
|
||
//2.2新增 在组件内定义 指定父组件调用时候的传值属性和事件类型 这个牛逼
|
||
model: {
|
||
prop: 'value',
|
||
event: 'change'
|
||
}
|
||
}
|
||
</script>
|