188 lines
3.9 KiB
Vue
188 lines
3.9 KiB
Vue
![]() |
<template>
|
|||
|
<e-select-built-in
|
|||
|
v-model="selectData"
|
|||
|
:options="options"
|
|||
|
:props="props"
|
|||
|
:placeholder="placeholder"
|
|||
|
:width="width"
|
|||
|
:minWidth="minWidth"
|
|||
|
:maxHeight="maxHeight"
|
|||
|
:emptyTips="emptyTips"
|
|||
|
:clearable="clearable"
|
|||
|
:disabled="disabled"
|
|||
|
:search="search"
|
|||
|
:animation="animation"
|
|||
|
:position="position"
|
|||
|
:pageSize="pageSize"
|
|||
|
:pageIndex="pageIndex"
|
|||
|
@update:pageIndex="updatePageIndex"
|
|||
|
@update:total="updateTotal"
|
|||
|
@change="changeSelect">
|
|||
|
<uni-pagination-built-in
|
|||
|
v-if="pageSize"
|
|||
|
show-icon="true"
|
|||
|
:total="total"
|
|||
|
:pageSize="pageSize"
|
|||
|
:current="pageIndex"
|
|||
|
@change="changePage"></uni-pagination-built-in>
|
|||
|
</e-select-built-in>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
import eSelectBuiltIn from './e-select-built-in.vue';
|
|||
|
import uniPaginationBuiltIn from './uni-pagination-built-in/uni-pagination-built-in.vue';
|
|||
|
export default {
|
|||
|
components: {
|
|||
|
eSelectBuiltIn,
|
|||
|
uniPaginationBuiltIn,
|
|||
|
},
|
|||
|
props: {
|
|||
|
// vue2 v-model传值方式
|
|||
|
value: {
|
|||
|
type: [String, Number],
|
|||
|
default: '',
|
|||
|
},
|
|||
|
// vue3 v-model传值方式
|
|||
|
modelValue: {
|
|||
|
type: [String, Number],
|
|||
|
default: '',
|
|||
|
},
|
|||
|
// 选项列表
|
|||
|
options: {
|
|||
|
type: Array,
|
|||
|
default() {
|
|||
|
return [];
|
|||
|
},
|
|||
|
},
|
|||
|
// 选项列表自定义数据格式
|
|||
|
props: {
|
|||
|
type: Object,
|
|||
|
default: () => {
|
|||
|
return {
|
|||
|
text: 'text',
|
|||
|
value: 'value',
|
|||
|
disabled: 'disabled',
|
|||
|
};
|
|||
|
},
|
|||
|
},
|
|||
|
// 占位文本
|
|||
|
placeholder: {
|
|||
|
type: String,
|
|||
|
default: '请选择',
|
|||
|
},
|
|||
|
// 输入框宽度
|
|||
|
width: {
|
|||
|
type: String,
|
|||
|
default: '100%',
|
|||
|
},
|
|||
|
// 输入框最小宽度
|
|||
|
minWidth: {
|
|||
|
type: String,
|
|||
|
default: '120rpx',
|
|||
|
},
|
|||
|
// 选项列表悬浮框最大高度
|
|||
|
maxHeight: {
|
|||
|
type: String,
|
|||
|
default: '160px',
|
|||
|
},
|
|||
|
// 选项列表空值占位空值占位
|
|||
|
emptyTips: {
|
|||
|
type: String,
|
|||
|
default: '暂无选项',
|
|||
|
},
|
|||
|
// 是否可清空
|
|||
|
clearable: {
|
|||
|
type: Boolean,
|
|||
|
default: false,
|
|||
|
},
|
|||
|
// 是否禁用
|
|||
|
disabled: {
|
|||
|
type: Boolean,
|
|||
|
default: false,
|
|||
|
},
|
|||
|
// 是否开启搜索
|
|||
|
search: {
|
|||
|
type: Boolean,
|
|||
|
default: true,
|
|||
|
},
|
|||
|
// 是否开启搜索的滚动动画
|
|||
|
animation: {
|
|||
|
type: Boolean,
|
|||
|
default: true,
|
|||
|
},
|
|||
|
// 悬浮框位置top/bottom
|
|||
|
position: {
|
|||
|
type: String,
|
|||
|
default: 'bottom',
|
|||
|
},
|
|||
|
// 分页每页条数
|
|||
|
pageSize: {
|
|||
|
type: Number,
|
|||
|
default: 0,
|
|||
|
},
|
|||
|
},
|
|||
|
data() {
|
|||
|
return {
|
|||
|
// 前端分页,总数就是下拉列表总数,不应由用户来控制,放在组件内部
|
|||
|
total: 0,
|
|||
|
// 前端分页,当前分页不应由用户来控制,放在组件内部
|
|||
|
pageIndex: 1,
|
|||
|
selectData: '',
|
|||
|
};
|
|||
|
},
|
|||
|
watch: {
|
|||
|
options: {
|
|||
|
handler(val) {
|
|||
|
this.total = val.length;
|
|||
|
},
|
|||
|
immediate: true,
|
|||
|
deep: true,
|
|||
|
},
|
|||
|
modelValue: {
|
|||
|
handler() {
|
|||
|
this.initData();
|
|||
|
},
|
|||
|
immediate: true,
|
|||
|
},
|
|||
|
value: {
|
|||
|
handler() {
|
|||
|
this.initData();
|
|||
|
},
|
|||
|
immediate: true,
|
|||
|
},
|
|||
|
selectData: {
|
|||
|
handler(val) {
|
|||
|
this.$emit('input', val);
|
|||
|
this.$emit('update:modelValue', val);
|
|||
|
},
|
|||
|
},
|
|||
|
},
|
|||
|
methods: {
|
|||
|
/** 处理数据,此函数用于兼容vue2 vue3 */
|
|||
|
initData() {
|
|||
|
// vue2
|
|||
|
if (this.value || this.value === 0) {
|
|||
|
this.selectData = this.value;
|
|||
|
}
|
|||
|
// vue3
|
|||
|
else if (this.modelValue || this.modelValue === 0) {
|
|||
|
this.selectData = this.modelValue;
|
|||
|
}
|
|||
|
},
|
|||
|
updatePageIndex(pageIndex) {
|
|||
|
this.pageIndex = pageIndex;
|
|||
|
},
|
|||
|
updateTotal(total) {
|
|||
|
this.total = total;
|
|||
|
},
|
|||
|
changePage(data) {
|
|||
|
this.pageIndex = data.current;
|
|||
|
this.$emit('changePage', data);
|
|||
|
},
|
|||
|
changeSelect(data) {
|
|||
|
this.$emit('change', data);
|
|||
|
},
|
|||
|
},
|
|||
|
};
|
|||
|
</script>
|