202 lines
4.8 KiB
Vue
202 lines
4.8 KiB
Vue
<template>
|
||
<view>
|
||
<view class="uni-select" @click="dropdownTreeClick">
|
||
<view style="position: absolute;width: 100%;height: 100%;left: 0;z-index: 1;"></view>
|
||
<input v-model="inputLabel" placeholder="请选择" class="uni-select__input-text" :disabled="true" />
|
||
<uni-icons :type="dropdownTreeShow? 'top' : 'bottom'" size="14" color="#999" />
|
||
</view>
|
||
<view class="uni-select__selector" v-show="dropdownTreeShow">
|
||
<view class="uni-popper__arrow"></view>
|
||
<!-- <dropdownTree ref="DropdownTreeRef" :data="companys" :labelField="labelField" :valueField="valueField"
|
||
:defaultCheckedKeys="defaultCheckedKeys" expandChecked @change="handleTreeChange"></dropdownTree> -->
|
||
|
||
<dropdownTree ref="DropdownTreeRef" :data="companys" @getLand="getLand" @select="selectLand"></dropdownTree>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
import dropdownTree from './dropdownTree.vue'
|
||
import {
|
||
companyTreeSelect
|
||
} from "@/api/system/company.js"
|
||
import {
|
||
getLandAndDevice
|
||
} from "@/api/system/land.js"
|
||
|
||
export default {
|
||
name: 'custom-land-tree',
|
||
components: {
|
||
dropdownTree
|
||
},
|
||
props: {
|
||
value: { //父组件v-model绑定的变量
|
||
type: [String, Number],
|
||
default: ""
|
||
},
|
||
defaultLand: {
|
||
type: Object,
|
||
default: null
|
||
},
|
||
selectType: {
|
||
type: [String, Number],
|
||
default: 1 // 1公司,2地块
|
||
}
|
||
},
|
||
model: {
|
||
// 需要双向绑定的 props 变量名称,也就是父组件通过 v-model 与子组件双向绑定的变量
|
||
prop: 'value',
|
||
// 定义由 $emit 传递变量的名称
|
||
event: 'modelValueEmit'
|
||
},
|
||
data() {
|
||
return {
|
||
dropdownTreeShow: false,
|
||
inputLabel: "",
|
||
modelValue: this.value, //接收父组件中传递的v-model绑定的变量
|
||
companys: [],
|
||
}
|
||
},
|
||
watch: {
|
||
// 监听 modelValue 临时变量,如果临时变量发生变化,那么通过 $emit 将新的值传递给父组件
|
||
modelValue(value) {
|
||
// 【注意】modelValueEmit 需要和 model.event 定义的值一致
|
||
this.$emit('modelValueEmit', this.modelValue)
|
||
}
|
||
},
|
||
mounted() {
|
||
this.getCompany();
|
||
if (this.defaultLand) {
|
||
this.setSelectData(this.defaultLand);
|
||
}
|
||
},
|
||
methods: {
|
||
async getCompany() {
|
||
const obj = {
|
||
status: 0,
|
||
delFlag: "0",
|
||
companyTypes: [1, 2, 3],
|
||
}
|
||
const that = this;
|
||
companyTreeSelect(obj).then(response => {
|
||
this.companys = response.data;
|
||
});
|
||
},
|
||
async getLand(e) {
|
||
const query = {
|
||
companyId: e.node.rootCompanyId,
|
||
companyGroupId: e.node.id,
|
||
status: 0,
|
||
delFlag: 0,
|
||
pageNum: 1,
|
||
pageSize: 999,
|
||
}
|
||
getLandAndDevice(query).then(res => {
|
||
this.$refs.DropdownTreeRef.addLand(e, res.rows);
|
||
}).catch(error => {})
|
||
},
|
||
setSelectData(currentItem) {
|
||
if (this.modelValue == currentItem.id) {
|
||
this.dropdownTreeShow = false;
|
||
return;
|
||
}
|
||
this.inputLabel = currentItem.landName;
|
||
this.modelValue = currentItem.id; //子组件变量发生变化,会触发监听,将子组件变化的值传递给父组件的v-model绑定的变量
|
||
this.dropdownTreeShow = false;
|
||
},
|
||
//点击选中节点复选框事件
|
||
selectLand(e) {
|
||
this.setSelectData(e);
|
||
this.$emit('change', e);
|
||
},
|
||
//点击选择
|
||
dropdownTreeClick() {
|
||
this.dropdownTreeShow = !this.dropdownTreeShow;
|
||
},
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss">
|
||
/* 下拉树样式开始 */
|
||
.uni-select__selector {
|
||
/* #ifndef APP-NVUE */
|
||
box-sizing: border-box;
|
||
/* #endif */
|
||
position: absolute;
|
||
top: calc(100% + 12px);
|
||
left: 0;
|
||
width: 100%;
|
||
background-color: #FFFFFF;
|
||
border: 1px solid #EBEEF5;
|
||
border-radius: 6px;
|
||
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
|
||
z-index: 9999;
|
||
padding: 4px 0;
|
||
}
|
||
|
||
.uni-popper__arrow,
|
||
.uni-popper__arrow::after {
|
||
position: absolute;
|
||
display: block;
|
||
width: 0;
|
||
height: 0;
|
||
border-color: transparent;
|
||
border-style: solid;
|
||
border-width: 6px;
|
||
}
|
||
|
||
.uni-popper__arrow {
|
||
filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03));
|
||
top: -6px;
|
||
left: 10%;
|
||
margin-right: 3px;
|
||
border-top-width: 0;
|
||
border-bottom-color: #EBEEF5;
|
||
}
|
||
|
||
.uni-popper__arrow::after {
|
||
content: " ";
|
||
top: 1px;
|
||
margin-left: -6px;
|
||
border-top-width: 0;
|
||
border-bottom-color: #fff;
|
||
}
|
||
|
||
.uni-select {
|
||
font-size: 14px;
|
||
border: 1px solid #e5e5e5;
|
||
box-sizing: border-box;
|
||
border-radius: 4px;
|
||
padding: 0 5px;
|
||
padding-left: 10px;
|
||
position: relative;
|
||
/* #ifndef APP-NVUE */
|
||
display: flex;
|
||
user-select: none;
|
||
/* #endif */
|
||
flex-direction: row;
|
||
align-items: center;
|
||
border-bottom: solid 1px #e5e5e5;
|
||
width: 100%;
|
||
flex: 1;
|
||
height: 35px;
|
||
|
||
&--disabled {
|
||
background-color: #f5f7fa;
|
||
cursor: not-allowed;
|
||
}
|
||
}
|
||
|
||
.uni-select__input-text {
|
||
width: 100%;
|
||
color: #333;
|
||
white-space: nowrap;
|
||
text-overflow: ellipsis;
|
||
-o-text-overflow: ellipsis;
|
||
overflow: hidden;
|
||
font-size: 14px;
|
||
}
|
||
|
||
/* 下拉树样式结束 */
|
||
</style> |