You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

691 lines
15 KiB

4 months ago
<template>
<view>
<view class="paibanCard">
<view class="title">
<view class="line"></view>
选择{{title}}
</view>
<view style="background: #FFFFFF;border-radius: 20rpx;padding: 26rpx 41rpx;">
<view class="pickPerson">
<view class="picktitle">
<image src="../../static/images/fireman/fire.png"
style="width: 26rpx;height: 32rpx;margin-right: 10rpx;"></image>
{{title}}
</view>
<image src="../../static/images/fireman/add.png" style="width: 135rpx;height: 46rpx;"
@click="itemclick(true)"></image>
</view>
</view>
</view>
<!-- 异步加载demo -->
<!-- <next-tree :selectParent="false" :checkStrictly="true" :multiple="true" ref="nextTreeAsyncRef"
:treeData="asyncTreeData" :loadData="loadData" /> -->
<next-tree :expandedKeys="['3','3-1']" :changeVerify="changeVerify" :title="getTitle" ref="nextTreeRef"
:checkStrictly="checkStrictly" :selectParent="selectParent" :multiple="multiple" :treeData="list"
@cancel="oncancel" @confirm="onconfirm">
</next-tree>
</view>
</template>
<script>
let self = null;
export default {
name: "choosePerson",
props: {
// 下拉树的数组
list: {
type: Array
},
// 标题字符
title: {
type: String,
default: ""
},
// 最多选择几个节点
count: {
type: String,
default: "1"
}
},
mounted() {
// console.log(this._props, "this._props");
},
data() {
return {
multiple: false,
selectParent: false,
checkStrictly: false,
activeId: '',
localData: {
'a1': [{
id: 'a1-1',
label: 'a1-1'
}, {
id: 'a1-2',
label: 'a1-2',
children: []
}, {
id: 'a1-3',
label: 'a1-3'
}],
'b1': [{
id: 'b1-1',
label: 'b1-1',
children: []
}, {
id: 'b1-2',
label: 'b1-2'
}, {
id: 'b1-3',
label: 'b1-3'
}],
'c1': [{
id: 'c1-1',
label: 'c1-1'
}, {
id: 'c1-2',
label: 'c1-2'
}, {
id: 'c1-3',
label: 'c1-3',
children: []
}],
'a1-2': [{
id: 'a1-2-1',
label: 'a1-2-1'
}, {
id: 'a1-2-2',
label: 'a1-2-2'
}],
'b1-1': [{
id: 'b1-1-1',
label: 'b1-1-1'
}, {
id: 'b1-1-2',
label: 'b1-1-2'
}],
'c1-3': [{
id: 'c1-3-1',
label: 'c1-3-1'
}, {
id: 'c1-3-2',
label: 'c1-3-2'
}]
},
asyncTreeData: [{
id: 'a1',
label: 'a1',
children: []
}, {
id: 'b1',
label: 'b1',
children: []
}, {
id: 'c1',
label: 'c1',
children: []
}],
treeData: [{
id: '1',
label: '北京',
checked: false
},
{
id: '2',
label: '上海',
checked: false,
children: [{
id: '2-1',
label: '上海-1',
checked: false
},
{
id: '2-2',
label: '上海-2',
checked: false
},
{
id: '2-3',
label: '上海-3',
checked: false
},
]
},
{
id: '3',
label: '广州',
children: [{
id: '3-1',
label: '海珠区',
checked: false,
children: [{
id: '3-1-1',
label: '海珠区-1',
checked: false,
disabled: true
},
{
id: '3-1-2',
label: '海珠区-2',
checked: false
},
{
id: '3-1-4',
label: '海珠区-3',
checked: false
},
{
id: '3-1-5',
label: '海珠区-4',
checked: false
},
{
id: '3-1-6',
label: '海珠区-5',
checked: false
},
{
id: '3-1-7',
label: '海珠区-6',
checked: false
},
{
id: '3-1-8',
label: '海珠区-7',
checked: false
},
{
id: '3-1-9',
label: '海珠区-8',
checked: false
},
{
id: '3-1-10',
label: '海珠区-9',
checked: false
},
{
id: '3-1-11',
label: '海珠区-10',
checked: false
},
]
},
{
id: '3-2',
label: '番禺区',
checked: false,
children: [{
id: '3-2-1',
label: '番禺区-1',
checked: false
},
{
id: '3-2-2',
label: '番禺区-2',
checked: false
},
{
id: '3-2-4',
label: '番禺区-3',
checked: false
},
{
id: '3-2-5',
label: '番禺区-4',
checked: false
},
{
id: '3-2-6',
label: '番禺区-5',
checked: false
},
{
id: '3-2-7',
label: '番禺区-6',
checked: false
},
{
id: '3-2-8',
label: '番禺区-7',
checked: false
},
{
id: '3-2-9',
label: '番禺区-8',
checked: false
},
{
id: '3-2-10',
label: '番禺区-9',
checked: false
},
{
id: '3-2-11',
label: '番禺区-10',
checked: false
},
]
},
{
id: '3-3',
label: '黄埔区',
checked: false,
children: [{
id: '3-3-1',
label: '黄埔区-1',
checked: false
},
{
id: '3-3-2',
label: '黄埔区-2',
checked: false
},
{
id: '3-3-3',
label: '黄埔区-3',
checked: false
},
{
id: '3-3-4',
label: '黄埔区-4',
checked: false
},
{
id: '3-3-5',
label: '黄埔区-5',
checked: false
},
{
id: '3-3-6',
label: '黄埔区-6',
checked: false
},
{
id: '3-3-7',
label: '黄埔区-7',
checked: false
},
{
id: '3-3-8',
label: '黄埔区-8',
checked: false
},
{
id: '3-3-9',
label: '黄埔区-9',
checked: false
},
{
id: '3-3-10',
label: '黄埔区-10',
checked: false
},
{
id: '3-3-12',
label: '黄埔区-11',
checked: false
},
{
id: '3-3-13',
label: '黄埔区-12',
checked: false
},
{
id: '3-3-13',
label: '黄埔区-13',
checked: false
},
{
id: '3-3-14',
label: '黄埔区-14',
checked: false
},
{
id: '3-3-15',
label: '黄埔区-15',
checked: false
},
{
id: '3-3-16',
label: '黄埔区-16',
checked: false
},
{
id: '3-3-17',
label: '黄埔区-17',
checked: false
},
{
id: '3-3-18',
label: '黄埔区-18',
checked: false
},
{
id: '3-3-19',
label: '黄埔区-19',
checked: false
},
{
id: '3-3-20',
label: '黄埔区-20',
checked: false
},
{
id: '3-3-21',
label: '黄埔区-21',
checked: false
},
{
id: '3-3-22',
label: '黄埔区-22',
checked: false
},
{
id: '3-3-23',
label: '黄埔区-23',
checked: false
},
{
id: '3-3-24',
label: '黄埔区-24',
checked: false
},
{
id: '3-3-25',
label: '黄埔区-25',
checked: false
},
{
id: '3-3-26',
label: '黄埔区-26',
checked: false
},
{
id: '3-3-27',
label: '黄埔区-27',
checked: false
},
{
id: '3-3-28',
label: '黄埔区-28',
checked: false
},
{
id: '3-3-29',
label: '黄埔区-29',
checked: false
},
{
id: '3-3-30',
label: '黄埔区-30',
checked: false
},
{
id: '3-3-31',
label: '黄埔区-31',
checked: false
},
{
id: '3-3-32',
label: '黄埔区-32',
checked: false
},
{
id: '3-3-33',
label: '黄埔区-33',
checked: false
},
{
id: '3-3-34',
label: '黄埔区-34',
checked: false
},
{
id: '3-3-35',
label: '黄埔区-35',
checked: false
},
{
id: '3-3-36',
label: '黄埔区-36',
checked: false
},
]
},
],
}
]
}
},
methods: {
openTree: function() {
this.$refs.nextTreeAsyncRef.showTree = true
},
changeVerify: function(current, chooseList) {
// 注意:返回非空字符串会阻止原有行为,并提示返回的字符串
// 如果函数体不做return返回值即验证通过控件正常处理业务
// console.log('当前变化的数据', current)
// console.log('已选择的数据', chooseList)
if (chooseList && chooseList.length > this._props.count) {
return `最多可以选择${this._props.count}个人员`
}
},
checkedFunc: function(id) {
if (this.activeId === id) {
this.activeId = '';
this.$refs.nextTreeRef.checkedFunc(id, false)
} else {
this.activeId = id;
this.$refs.nextTreeRef.checkedFunc(id)
}
},
loadData(nodeItem) {
// 同步实现的代码处理方式 可以返回单个子节点的集合也可以返回子孙节点的集合
// 如果期望子集节点中还存在孙子节点可以打开,请在初始化数据的时候,初始化个空数组的子节点配置值{[this.childrenKey]: []}
// if(nodeItem && this.localData[nodeItem.id]) {
// return this.localData[nodeItem.id]
// } else {
// return []
// }
// 异步的代码实现方式 可以返回单个子节点的集合也可以返回子孙节点的集合
// 如果期望子集节点中还存在孙子节点可以打开,请在初始化数据的时候,初始化个空数组的子节点配置值{[this.childrenKey]: []}
return new Promise((resolve, reject) => {
setTimeout(() => {
if (nodeItem && self.localData[nodeItem.id]) {
return resolve(self.localData[nodeItem.id])
} else {
return resolve([])
}
}, 1000)
})
},
getTitle: function(checked) {
return `已选:${checked.length}`
},
echoDefault: function() {
const selectIds = ['2-1', '3-3-35']
this.checkedTreeData(this.treeData, selectIds)
// console.log('treeData的数据', this.treeData)
this.multiple = true
this.$refs.nextTreeRef.showTree = true
},
itemclick: function(_multiple, _selectParent, _checkStrictly = false) {
this.multiple = _multiple
this.selectParent = _selectParent
this.checkStrictly = _checkStrictly
this.$refs.nextTreeRef.showTree = true
},
checkedTreeData: function(treeData, selectIds) {
// 注意 vue2当数据深嵌套时如果没有在treeData里面初始化checked属性那在改变数据的时候直接将checked属性赋值为true这时候ui界面有可能不会更新
// 这时候建议使用this.$set去更新checked属性值或者在初始化this.treeData的时候初始化checked属性
(treeData || []).map(item => {
if (selectIds.indexOf(item.id) !== -1) {
item.checked = true
} else {
item.checked = false
}
if (item.children && item.children.length) {
this.checkedTreeData(item.children, selectIds)
}
})
},
onconfirm: function(list) {
this.$emit("choosePerson", list)
// console.log('选中项的数量列表list', list)
},
oncancel: function() {
// 清除treeData的选中状态
this.checkedTreeData(this.treeData, [])
}
},
created() {
self = this
}
}
</script>
<style lang="scss">
page {
box-sizing: border-box !important;
padding: 24rpx;
background-color: #eff0f4;
/deep/.uni-swipe {
background-color: #fff;
padding: 15rpx 0 15rpx 10rpx;
}
/deep/.uni-card {
border-radius: 10rpx;
}
/deep/.u-list {
height: 0 !important;
}
/deep/.u-row {
margin-bottom: 10rpx;
padding: 10rpx 30rpx;
border-radius: 10rpx;
display: flex;
justify-content: space-between !important;
background-color: #f9fbfc;
:first-child {
color: black;
}
}
/deep/.uni-date-x--border {
border: none;
padding: 15rpx;
border-radius: 0;
}
/deep/.uniui-calendar {
color: #454545;
font-weight: 500;
font-size: 28rpx;
}
/deep/.uniui-calendar:before {
content: none;
}
/deep/.input1 .uniui-calendar :before {
content: '开始日期';
font-weight: 500;
font-size: 30rpx;
color: #333333;
}
/deep/.input2 .uniui-calendar :before {
content: '结束日期';
}
/deep/.uni-icons {
color: #171819 !important;
font-size: 30rpx !important;
}
/deep/.uni-date__x-input {
padding-left: 50rpx;
}
/deep/.uni-date-x {
background: #F5F6FA;
border-radius: 20rpx;
padding: 10rpx 15rpx;
}
/deep/.uni-swipe_box {
background: #F5F6FA;
border-radius: 20rpx;
padding: 26rpx 22rpx;
}
.paibanCard {
margin-bottom: 15rpx;
.title {
margin-bottom: 15rpx;
font-family: Noto Sans S Chinese;
font-weight: bold;
font-size: 30rpx;
color: #333333;
display: flex;
align-items: center;
.line {
width: 4rpx;
height: 30rpx;
background: #358FFE;
border-radius: 2rpx;
margin-right: 20rpx;
}
}
.pickTime {
background-color: #fff;
border-radius: 10rpx;
padding: 43rpx 20rpx;
}
.pickPerson {
background-color: #fff;
border-radius: 20rpx;
display: flex;
align-items: center;
// padding: 15rpx;
justify-content: space-between;
// margin-bottom: 15rpx;
}
.picktitle {
font-family: Noto Sans S Chinese;
font-weight: 400;
font-size: 30rpx;
color: #333333;
display: flex;
align-items: center;
}
}
.addPaiBan {
width: 85%;
background: linear-gradient(0deg, #2A86FF, #8FBCFF);
font-weight: 400;
font-size: 36rpx;
color: #FFFFFF;
line-height: 38rpx;
text-align: center;
padding: 20rpx;
border-radius: 40rpx;
margin: 50rpx auto;
}
}
</style>