182 lines
5.5 KiB
Vue
182 lines
5.5 KiB
Vue
<template>
|
||
<view>
|
||
<u-popup :show="show" @close="cancel">
|
||
<view class="title">{{ popupTitle }}</view>
|
||
<view style="padding: 20rpx;">
|
||
<u-search v-if="showSearch" @custom="search" @search="search" :placeholder="placeholder"
|
||
v-model="keyword"></u-search>
|
||
<u-gap v-if="showSearch" height="15"></u-gap>
|
||
<scroll-view :scroll-top="scrollTop" scroll-y="true" class="scroll-Y" @scrolltolower="$emit('lower')">
|
||
|
||
<!--单选-->
|
||
<u-radio-group v-if="type == 'radio'" :borderBottom="true" iconPlacement="right" placement="column"
|
||
@change="groupChange" v-model="radioValue">
|
||
<u-radio :customStyle="{marginBottom: '12px'}" v-for="(item, index) in dataLists" :key="index"
|
||
:label="item[name]" :name="index">
|
||
</u-radio>
|
||
</u-radio-group>
|
||
|
||
<!--多选-->
|
||
<u-checkbox-group v-if="type == 'checkbox'" :borderBottom="true" placement="column"
|
||
iconPlacement="right" @change="checkboxChange" v-model="checkboxValue">
|
||
<u-checkbox :customStyle="{marginBottom: '12px',paddingBottom:'12px'}"
|
||
v-for="(item, index) in dataLists" :key="index" :label="item[name]" :name="index">
|
||
</u-checkbox>
|
||
</u-checkbox-group>
|
||
|
||
</scroll-view>
|
||
<u-gap height="45"></u-gap>
|
||
<view class="bottons">
|
||
<u-row>
|
||
<u-col customStyle="padding:0 10rpx 20rpx 20rpx" span="6">
|
||
<u-button @click="cancel">取消</u-button>
|
||
</u-col>
|
||
<u-col customStyle="padding:0 20rpx 20rpx 10rpx" span="6">
|
||
<u-button @click="submit" type="primary" throttleTime="1000"
|
||
:disabled="(JSON.stringify(radioData) === '{}') && (checkboxData.length === 0)">确认
|
||
</u-button>
|
||
</u-col>
|
||
</u-row>
|
||
</view>
|
||
</view>
|
||
</u-popup>
|
||
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
/**
|
||
* 公共选择下拉框,基于uview。支持下拉加载、列表搜索、单选|多选
|
||
* @author qianziyu
|
||
* @description 弹出层选择器,基于uview中u-popup实现
|
||
* @property {Array} dataLists 数据列表
|
||
* @property {String} name 列表显示的字段名
|
||
* @property {Boolean} show 是否展示弹窗 (默认 false )
|
||
* @property {String} type 选择类型 单选|多选 (默认 单选 )
|
||
* @property {Boolean} showSearch 是否显示搜索框 (默认 true )
|
||
* @property {String} popupTitle 列表标题
|
||
* @property {String} placeholder 搜索框placeholder
|
||
* @event {Function} search 搜索事件,返回keyword
|
||
* @event {Function} lower 滑动到底部触发,用于下拉加载新数据
|
||
* @event {Function} cancel 组件关闭事件
|
||
* @event {Function} submit 提交按钮,返回选中的列表数据
|
||
* @example <common-select :show="show" :popupTitle="popupTitle" @cancel="show=false" @search="selectSearch" name="cworkStationName" @submit="onsubmit"
|
||
:dataLists="dataLists" placeholder="输入工站名称搜索"></common-select>
|
||
*/
|
||
export default {
|
||
name: "qianziyu-select",
|
||
props: {
|
||
dataLists: {
|
||
default: {},
|
||
type: Array
|
||
},
|
||
name: {
|
||
default: 'name',
|
||
},
|
||
show: {
|
||
default: false,
|
||
type: Boolean
|
||
},
|
||
type: {
|
||
default: 'radio',
|
||
type: String
|
||
},
|
||
showSearch: {
|
||
default: true,
|
||
type: Boolean
|
||
},
|
||
popupTitle: {
|
||
default: '列表选择',
|
||
type: String
|
||
},
|
||
placeholder: {
|
||
default: '请输入搜索内容'
|
||
},
|
||
checkboxData: { // 新增的prop
|
||
default: () => [], // 默认选中的项
|
||
type: Array
|
||
}
|
||
},
|
||
data() {
|
||
return {
|
||
keyword: '',
|
||
scrollTop: 0,
|
||
checkboxValue: [],
|
||
radioData: {},
|
||
radioValue: '',
|
||
// checkboxData: this.checkboxData, // 将父组件传递的checkboxData设置为默认值
|
||
};
|
||
},
|
||
watch: {
|
||
checkboxData(newVal) {
|
||
// 如果 checkboxData 改变,更新 checkboxValue(使其回显默认值)
|
||
this.checkboxValue = newVal.map(item => {
|
||
return this.dataLists.findIndex(listItem => listItem[this.name] === item[this.name]);
|
||
});
|
||
}
|
||
},
|
||
methods: {
|
||
checkboxChange(n) {
|
||
const newCheckboxData = [];
|
||
n.forEach(key => {
|
||
newCheckboxData.push(this.dataLists[key]);
|
||
});
|
||
this.$emit('update:checkboxData', newCheckboxData); // 更新父组件中的 checkboxData
|
||
},
|
||
//选择列表项触发
|
||
groupChange(n) {
|
||
this.radioData = this.dataLists[n]
|
||
},
|
||
//点击搜索触发
|
||
search() {
|
||
this.$emit('search', this.keyword)
|
||
},
|
||
//点击取消按钮触发
|
||
cancel() {
|
||
this.$emit('cancel')
|
||
},
|
||
//提交触发
|
||
submit() {
|
||
if (this.type == 'radio') {
|
||
if (JSON.stringify(this.radioData) == '{}') {
|
||
uni.$u.toast('请选择数据')
|
||
return;
|
||
}
|
||
this.$emit('submit', this.radioData)
|
||
} else if (this.type == 'checkbox') {
|
||
if (this.checkboxData.length == 0) {
|
||
uni.$u.toast('请选择数据')
|
||
return;
|
||
}
|
||
this.$emit('submit', this.checkboxData)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.u-popup {
|
||
.title {
|
||
border-bottom: 1px solid #f7f7f7;
|
||
padding: 20rpx;
|
||
text-align: center;
|
||
font-weight: bold;
|
||
}
|
||
}
|
||
|
||
.scroll-Y {
|
||
height: 650rpx;
|
||
}
|
||
|
||
.bottons {
|
||
background-color: white;
|
||
position: fixed;
|
||
left: 0;
|
||
bottom: 0;
|
||
right: 0;
|
||
bottom: constant(safe-area-inset-bottom);
|
||
bottom: env(safe-area-inset-bottom);
|
||
}
|
||
</style>
|