226 lines
4.5 KiB
Vue
226 lines
4.5 KiB
Vue
<template>
|
|
<view class="auto-complete">
|
|
<u-popup
|
|
:show="show"
|
|
:round="10"
|
|
mode="bottom"
|
|
:closeable="true"
|
|
:closeIconPos="multiple ? 'top-left' : 'top-right'"
|
|
@open="onOpen"
|
|
@close="handleClosePopup">
|
|
<u--text
|
|
v-if="multiple"
|
|
text="确定"
|
|
type="primary"
|
|
bold
|
|
class="ok-button"
|
|
size="16"
|
|
@click="handleOk"
|
|
></u--text>
|
|
<u-list
|
|
@scrolltolower="scrolltolower"
|
|
:pagingEnabled="true"
|
|
>
|
|
<view class="head">
|
|
<view class="title">{{title}}</view>
|
|
</view>
|
|
<view class="search" style="padding-top: 6px">
|
|
<u-search
|
|
v-model="searchValue"
|
|
@search="handleSearch"
|
|
@custom="handleSearch"
|
|
:clearabled="true">
|
|
</u-search>
|
|
</view>
|
|
<view v-if="multiple" class="multi-checkbox" @click.stop="">
|
|
<u-checkbox-group
|
|
placement="column"
|
|
@onchange="onCheckboxChange"
|
|
>
|
|
<u-checkbox
|
|
:customStyle="checkboxStyle"
|
|
v-for="(item, index) in indexList"
|
|
:key="index"
|
|
:label="item.NAME"
|
|
:name="item.ID"
|
|
:checked="multipleSelect.map(i => i.ID).includes(item.ID)"
|
|
>
|
|
</u-checkbox>
|
|
</u-checkbox-group>
|
|
</view>
|
|
<u-list-item
|
|
v-else
|
|
v-for="(item, index) in indexList"
|
|
:key="index"
|
|
class="single-select"
|
|
>
|
|
<view @click="handleSelected(item)">
|
|
<u-cell
|
|
:title="`${item.name}`"
|
|
>
|
|
<text v-if="item.code" slot="right-icon">{{item.code}}</text>
|
|
</u-cell>
|
|
</view>
|
|
</u-list-item>
|
|
</u-list>
|
|
</u-popup>
|
|
</view>
|
|
</template>
|
|
<script>
|
|
import UText from '../../uni_modules/uview-ui/components/u-text/u-text.vue'
|
|
|
|
export default {
|
|
components: { UText },
|
|
props: {
|
|
show: {
|
|
type: Boolean,
|
|
default: false,
|
|
required: true
|
|
},
|
|
multiple: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
lists: {
|
|
type: Array,
|
|
default() {
|
|
return undefined
|
|
}
|
|
},
|
|
defaultValue: {
|
|
type: String,
|
|
default: null
|
|
},
|
|
defaultChecked: {
|
|
type: Array,
|
|
default() {
|
|
return []
|
|
}
|
|
},
|
|
title:{
|
|
type: String,
|
|
default: ''
|
|
},
|
|
total:{
|
|
type: Number,
|
|
default: 0
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
searchValue: '',
|
|
indexList: [],
|
|
pageIndex: 1,
|
|
multipleSelect: [],
|
|
checkboxStyle: {
|
|
marginBottom: '8px',
|
|
padding: '10px 0',
|
|
borderBottom: '1px solid #e5e5e5'
|
|
}
|
|
}
|
|
},
|
|
methods: {
|
|
onCheckboxChange(e) {
|
|
if (e.checked) {
|
|
const obj = this.indexList.filter(i => i.ID === e.id)[0]
|
|
this.multipleSelect.push(obj)
|
|
} else {
|
|
this.multipleSelect.forEach(item => {
|
|
if (e.id === item.ID) {
|
|
this.multipleSelect = this.multipleSelect.filter(i => i.ID !== e.id)
|
|
}
|
|
})
|
|
}
|
|
},
|
|
onOpen() {
|
|
this.pageIndex = 1
|
|
if (this.defaultValue) {
|
|
this.searchValue = this.defaultValue
|
|
this.handleSearch(this.defaultValue)
|
|
} else {
|
|
this.searchValue = ''
|
|
// this.indexList = this.lists
|
|
}
|
|
this.multipleSelect = this.defaultChecked
|
|
},
|
|
handleClosePopup() {
|
|
this.searchValue = ''
|
|
this.indexList = []
|
|
this.multipleSelect = []
|
|
this.$emit('close')
|
|
},
|
|
handleSearch(val) {
|
|
this.searchValue = val
|
|
this.indexList = []
|
|
this.$emit('search', val, 1)
|
|
},
|
|
handleSelected(val) {
|
|
this.searchValue = ''
|
|
this.indexList = []
|
|
this.multipleSelect = []
|
|
this.$emit('select', val)
|
|
},
|
|
handleOk() {
|
|
this.searchValue = ''
|
|
this.indexList = []
|
|
this.$emit('select', this.multipleSelect)
|
|
},
|
|
scrolltolower() {
|
|
if (this.total > this.pageIndex * 20) {
|
|
this.pageIndex++
|
|
this.$emit('search', this.searchValue, this.pageIndex)
|
|
}
|
|
}
|
|
},
|
|
watch: {
|
|
lists(newLists) {
|
|
this.indexList = this.indexList.concat(newLists)
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
<style scoped>
|
|
.head {
|
|
height: 46px;
|
|
display: flex;
|
|
flex-direction: row;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
}
|
|
.head .cancel,
|
|
.head .ok {
|
|
font-size: 15px;
|
|
padding: 0 15px;
|
|
}
|
|
.head .cancel {
|
|
color: rgb(144, 145, 147);
|
|
}
|
|
.head .ok {
|
|
color: rgb(60, 156, 255)
|
|
}
|
|
.head .title {
|
|
color: #303133;
|
|
padding: 0 22px;
|
|
font-size: 16px;
|
|
flex: 1;
|
|
text-align: center;
|
|
}
|
|
.search {
|
|
padding: 0 10px;
|
|
}
|
|
.multi-checkbox {
|
|
padding: 16px;
|
|
}
|
|
.single-select {
|
|
margin-right: 16px;
|
|
margin-left: 16px
|
|
}
|
|
.ok-button {
|
|
position: absolute;
|
|
top: 15px;
|
|
right: 15px;
|
|
width: max-content;
|
|
z-index: 10;
|
|
}
|
|
</style>
|