<template> <div class="from-content" style="width: 100%"> <!-- <div ref="mask" style="position: fixed; z-index: 9999999; left: 0; top:0; bottom: 0; right: 0; background: rgba(0, 0, 0, 0.5);" @click.prevent="onClickMask" v-if="visible"></div> --> <ElPopover ref="PopoverRef" placement="bottom" popper-class="global-input-search-popover" :popperOptions="popperOptions" :width="this.width" trigger="manual" v-model="visible" @show="handleShow" style="width: 100%" > <div class="InputSearch input" v-if="params && types == 'input'" slot="reference" ref="ReferenceInputRef" > <ElInput style="width: 100%" v-model="value" :placeholder="placeholder" clearable @keyup.enter.native="handleSearch" ></ElInput> <img src="./search.svg" v-show="!disable" @click="onOpenPop" /> </div> <div class="InputSearch" v-else slot="reference" ref="ReferenceInputRef" @click="onOpenPop" > <span>{{ placeholder }}</span> <img src="./search.svg" /> </div> <div style="width: 100%; max-height: 360px" v-show="visible"> <slot> <Form v-if="formList && formList.length" class="form" ref="FormConfigRef" :formList="formList" v-bind="getFormConfigOptions" /> <!-- <ElEmpty v-else description="暂无搜索内容"></ElEmpty> --> <div v-else class="no-data">暂无数据</div> </slot> <div class="footer"> <Button style="background-color: rgba(0, 179, 204, 0.3)" @click.native="handleResetForm" > 重置 </Button> <Button @click.native="handleSearch"> 搜索 </Button> </div> </div> </ElPopover> </div> </template> <script> import Button from "@screen/components/Buttons/Button.vue"; import Form from "@screen/components/FormConfig"; import { cloneDeep } from "lodash"; export default { name: "InputSearch", components: { Button, Form, }, props: { // 表单类型 type: { type: String, default: "form", }, placeholder: { type: String, default: "请点击右侧图标筛选", }, // 是否禁用图标仅type为 input时有效 disable: { type: Boolean, default: false, }, // 搜索参数,仅type为 input时有效 params: { type: String, }, formConfigOptions: { type: Object, default: null, }, formList: { type: Array, default: () => [], }, }, data() { return { isClickedBtn: false, visible: false, types: this.type, value: "", width: null, popperOptions: { popHideCallBack: () => { // console.log("---") }, }, }; }, emit: ["handleSearch", "handleResetForm"], computed: { getFormConfigOptions() { return { column: "1", labelWidth: "120px", ...this.formConfigOptions, }; }, }, mounted() { // document.getElementById("app") document.addEventListener( "click", () => { if (!this.isClickedBtn) { setTimeout(() => { this.visible = false; }, 100); } this.isClickedBtn = false; }, false ); }, methods: { onOpenPop() { this.isClickedBtn = true; this.visible = !this.visible; }, onClickMask() { this.visible = false; }, handleShow() { if (this.width) return; this.width = this.$refs.ReferenceInputRef.getBoundingClientRect().width; }, handleResetForm() { // this.visible = true; this.$refs.FormConfigRef?.reset(); this.$refs.FormConfigRef.$refs.ElFormRef.resetFields(); // this.$refs.PopoverRef.doClose(); this.$emit( "handleSearch", cloneDeep(this.$refs.FormConfigRef?.formData), "reset" ); }, async handleSearch(value) { if (this.types === "input") { let params = {}; params[this.params] = this.value; let result = {}; if (!this.disable) { await this.$refs.FormConfigRef.validate() .then((res) => { result = res; this.$refs.PopoverRef.doClose(); }) .catch((err) => { console.log("catch"); }); } let resultParams = { ...result, ...params }; this.$emit("handleSearch", resultParams, "search"); } else { this.$refs.FormConfigRef.validate() .then((result) => { this.$refs.PopoverRef.doClose(); this.$emit("handleSearch", result, "search"); }) .catch((err) => { console.log("catch"); }); } }, }, }; </script> <style lang="scss" scoped> .InputSearch { width: 100%; height: 26px; background: linear-gradient(180deg, #005c79 0%, #009bcc 100%) !important; color: #fff; border-radius: 2px; display: flex; align-items: center; justify-content: space-between; padding: 3px 15px; padding-right: 9px; cursor: pointer; font-size: 12px; font-family: PingFang SC, PingFang SC; font-weight: 400; color: #ffffff; line-height: 14px; } .input ::v-deep .el-input__inner { background: none; height: auto !important; font-size: 12px; padding: 0px 0; line-height: 14px; } ::v-deep .el-input__inner::placeholder { font-size: 12px; } </style>