middleground_code_v2/src/views/integrationOptionV2/compoments/contrast/baseContrastSelect.vue

290 lines
6.2 KiB
Vue
Raw Normal View History

2024-03-26 11:18:19 +08:00
<template>
<div>
<template v-if="!lookflag">
<el-select
v-loading="selLoading"
class="w-100"
v-model="selectValue"
:placeholder="placeholder"
:clearable="false"
style="width: 240px"
size="mini"
ref="mySelect"
:reserve-keyword="true"
:disabled="disabled"
filterable
popper-class="sele"
:filter-method="filter"
@change="fun"
@focus="funx"
@blur="funb"
@visible-change="hidden"
clearable
>
<el-option
v-for="(item, index) in options"
:key="index"
:label="item.label"
remote
:value="item.value"
placeholder="请输入"
>
</el-option>
<div style="bottom: -10px">
<el-pagination
v-if="pageModel.total > pageModel.limit"
small
@current-change="handleCurrentChange"
:current-page="pageModel.pageIndex"
:page-size="pageModel.limit"
layout="prev, pager,next,total"
:total="pageModel.total"
>
</el-pagination>
</div>
</el-select>
</template>
<template v-else
><div v-loading="selLoading">{{ showValue }}</div></template
>
</div>
</template>
<style scoped lang="scss">
::v-deep .el-input--mini .el-input__inner {
height: 38px;
}
.w-100 {
width: 100% !important;
}
.drop >>> .el-input__inner {
background: #5183ff !important;
color: white;
border: none;
height: 26px;
padding: 10px 22px 10px 10px;
text-align: center;
}
.drop {
width: 250px;
}
.drop >>> .el-select .el-input .el-select__caret {
display: none;
}
</style>
<script>
import debounce from "lodash/debounce";
import { getUserModuleApi } from "@/api/integrationOption/integrationOption.js";
export default {
props: {
ruleForm: {
type: Object,
default: () => {
return {};
},
},
selectInfo: {
type: Object,
default: () => {
return {};
},
},
// 是否禁用
disabled: {
type: Boolean,
default: false,
},
placeholder: String,
value: {
type: [String, Number],
},
itemObj: {
type: Object,
default: () => {
return {};
},
},
lookflag: {
type: Boolean,
default: false,
},
idKey: {
type: [Number, String],
default: 0,
},
journalingType: {
type: [String, Number],
default: "subject",
},
apiInfo: {
type: Object,
},
searchApiInfo: {
type: Object,
},
prop: {
type: Object,
default: () => {
return {
label: "names",
id: "codes",
};
},
},
foucus: {
type: Boolean,
default: true,
},
},
data() {
return {
pageModel: {
total: 0,
pageIndex: 1,
limit: 10,
},
selLoading: false,
showValue: "",
lookLoading: false,
options: [],
tempObj: {},
};
},
computed: {
selectValue: {
get() {
return this.value;
},
set(val) {
this.$emit("input", val);
},
},
},
created() {
if (this.value) {
// console.log(this.value, "查询");
// this.searchCodes(this.value);
}
},
mounted() {},
methods: {
// 页码改变事件
handleCurrentChange(val) {
this.pageModel.pageIndex = val;
this.getUserModuleHandle();
},
// select选中更改事件
fun(val) {
this.$emit(`onSelect`, this.idKey, val);
this.searchShowValue(val);
this.$nextTick(() => {
this.$emit("blur");
});
},
searchShowValue(val) {
this.options.forEach((item) => {
if (item.codes == val) {
this.showValue = item.names;
this.$nextTick(() => {
this.$emit("showValue", this.showValue, this.itemObj, this.idKey);
});
}
});
},
// 获得焦点
funx() {
if (this.foucus) {
this.getUserModuleHandle();
}
},
clearOptions() {
if (this.options.length) {
this.options = [];
this.tempObj = null;
this.pageModel.pageIndex = 1;
}
},
// 失去焦点
funb() {
// this.$nextTick(() => {
// this.$emit("blur");
// });
},
hidden(val) {
if (!val) {
this.$nextTick(() => {
this.$emit("blur");
});
}
},
//搜索方法,将符合的数据存入options中并分页展示
filter: debounce(function (val) {
this.pageModel.pageIndex = 1;
this.getUserModuleHandle(val);
}, 300),
// filter(val) {
// },
focus() {
this.$refs.mySelect.focus();
},
async getUserModuleHandle(val = null, obj = null) {
if (obj) {
this.tempObj = obj;
}
this.selLoading = true;
const res = await getUserModuleApi(this.apiInfo, {
journalingType: this.journalingType,
names: val,
pageNum: this.pageModel.pageIndex,
pageSize: 10,
...obj,
...this.tempObj,
});
this.selLoading = false;
if (res.status == 200) {
this.options = [];
this.pageModel.total = res.attribute.total;
res.attribute.list.forEach((item) => {
this.options.push({
value: item[this.prop.id],
label: item[this.prop.label],
});
});
}
},
async searchCodes(codes) {
const res = await getUserModuleApi(this.searchApiInfo, {
journalingType: this.journalingType,
codes: codes,
});
if (res.status == 200 && res.attribute) {
if (!this.options.length) {
this.options.push({ ...res.attribute });
}
if (res.attribute) {
this.showValue = res.attribute.names;
}
this.$nextTick(() => {
this.$emit("showValue", this.showValue, this.itemObj, this.idKey);
});
}
},
},
beforeDestroy() {},
//监听来自父组件的数据,当数据更新时,重置展示
watch: {
value(newv, oldv) {
if (this.lookflag) {
this.searchCodes(this.value);
}
},
},
};
</script>