jsy-app/components/custom-land-tree/custom-land-tree.vue

202 lines
4.8 KiB
Vue
Raw Normal View History

2025-02-14 10:34:15 +08:00
<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>