209 lines
5.7 KiB
Vue
209 lines
5.7 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: "请输入搜索内容",
|
||
},
|
||
},
|
||
data() {
|
||
return {
|
||
keyword: "",
|
||
scrollTop: 0,
|
||
checkboxData: [],
|
||
checkboxValue: [],
|
||
radioData: {},
|
||
radioValue: "",
|
||
};
|
||
},
|
||
methods: {
|
||
checkboxChange(n) {
|
||
this.checkboxData = [];
|
||
n.forEach((key) => {
|
||
this.checkboxData.push(this.dataLists[key]);
|
||
});
|
||
},
|
||
//选择列表项触发
|
||
groupChange(n) {
|
||
this.radioData = this.dataLists[n];
|
||
},
|
||
//点击搜索触发
|
||
search() {
|
||
this.$emit("search", this.keyword);
|
||
},
|
||
// 触底刷新事件
|
||
onReachBottom() {
|
||
this.$emit("onReachBottom")
|
||
},
|
||
//点击取消按钮触发
|
||
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>
|