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>
 |