一个人全干!之后台管理中的搜索区域的展开收缩组件。

news2024/11/24 1:43:59

后台管理系统中大多数都有列表的搜索,那么用户的需求又需要必要时收缩搜索区域,需要时再展开。
在这里插入图片描述
而且怪的是他还需要一些部分不可收缩,不需要的地方才收缩。使用v-if来解决吧又不咋美观,我们还需要一个简单的动画效果。我们先写一个组件,直接上代码。

<template>
    <div 
        class="collapse-el">
        <div
            ref="CollapseElRef" 
            class="collapse-el-container">
            <div class="collapse-el-container-container">
                <slot></slot>
            </div>
        </div>
        <div
            v-if="showBt" 
            class="collapse-el-show-container">
            <div
                @click="handleClick"
                class="container">
                <div
                    :class="{
                        'bt':true,
                        'show':show,
                    }">
                    <SvgIcon 
                        :style="'width:15px;height:15px;'"
                        name="sort-down"></SvgIcon>
                </div>
                {{show?'收缩':'展开'}}
            </div>
        </div>
    </div>
</template>

<script>
/**
 * 折叠组件
 */
import { 
    defineComponent,ref,toRef,
    onMounted,
    watch,onBeforeUnmount,
} from 'vue';
import SvgIcon from "@/components/svgIcon/index.vue";

export default defineComponent({
    name:'Collapse',
    components: {
        SvgIcon,
    },
    props:{
        show:{  //是否显示
            type:Boolean,
            default:true,
        },
        showBt:{  //是否显示展开按钮
            type:Boolean,
            default:false,
        },
        anchorPointSignName:{  //锚点标识(可用querySelector查询出来的标识)
            type:String,
            default:'.anchor-point-target',
        },
    },
    emits:['onClick'],
    setup(props,{emit}){
        const CollapseElRef = ref(null);
        const show = toRef(props,'show');
        const showBt = toRef(props,'showBt');
        const anchorPointSignName = toRef(props,'anchorPointSignName');
        onMounted(() => {
            const childEl = CollapseElRef.value.firstChild;
            const resizeObserver = new ResizeObserver((entries) => {
                computHeight();
            });
            resizeObserver.observe(childEl);
        });
        let timer = null;
        watch(show,(newValue)=>{
            computHeight();
        },{
            immediate:false,
        });
        /** 表示是显示的 */
        function isActive(){
            if(!CollapseElRef.value) return false;
            const elRect = CollapseElRef.value.getBoundingClientRect();
            if(elRect.top==0 && elRect.bottom==0 && elRect.left==0 && elRect.right==0) return false;
            return true;
        }
        /** 设置显示高度 */
        function computHeight(){
            clearTimeout(timer);
            timer = setTimeout(()=>{
                if (!isActive()) return;
                if(show.value){
                    const childHight = CollapseElRef.value.firstChild.getBoundingClientRect().height;
                    CollapseElRef.value.style.height = childHight + 'px';
                }else{
                    //如果是隐藏的话找出锚点元素
                    const anchorPointEl = CollapseElRef.value.querySelector(anchorPointSignName.value);
                    if(!anchorPointEl){
                        CollapseElRef.value.style.height = 0 + 'px';
                    }else{  //表示只隐藏到锚点元素
                        const parentRect = CollapseElRef.value.getBoundingClientRect();
                        const anchorPointElRect = anchorPointEl.getBoundingClientRect();
                        const height = anchorPointElRect.y - parentRect.y + anchorPointElRect.height;
                        CollapseElRef.value.style.height = height + 'px';
                    }
                }
            }, 26);
        }
        onBeforeUnmount(()=>{
            clearTimeout(timer);
        });
        /** 收缩组件点击事件,向外部抛出 */
        function handleClick(){
            emit('onClick');
        }
        return {
            CollapseElRef,
            show,
            showBt,
            handleClick,
        };
    },
});
</script>

<style lang='scss' scoped>
.collapse-el{
    position: relative;
    width: 100%;
    height: auto;
    >.collapse-el-container{
        position: relative;
        width: 100%;
        overflow: hidden;
        transition: all 0.2s;
        height: 0;
        >.collapse-el-container-container{
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: fit-content;
        }
    }
    >.collapse-el-show-container{
        display: flex;
        justify-content: center;
        align-items: center;
        position: absolute;
        bottom: -7.5px;
        left: 0;
        width: 100%;
        pointer-events: none;
        >.container{
            width: fit-content;
            height: fit-content;
            cursor: pointer;
            display: flex;
            align-items: center;
            font-size: 12px;
            opacity: 0.5;
            pointer-events: initial;
            line-height: 1;
            >.bt{
                width: 15px;
                height: 15px;
                display: flex;
                justify-content: center;
                align-items: center;
                transition: all 0.2s;
                transform: rotate(0deg);
                &.show{
                    transform: rotate(180deg);
                }
            }
        }
    }
}
</style>

这样我们就有了一个可伸缩的容器组件,只需要把相应元素放在这个组件中就行了

           <DifinCollapse
                :show="dataContainer.showSearch"
                :showBt="true"
                @onClick="dataContainer.showSearch=!dataContainer.showSearch">
                <el-col :span="24" :xs="24">
                    <el-form
                        :model="dataContainer.form"
                        ref="QueryFormRef"
                        :inline="true"
                        label-width="110px">
                        <el-row :gutter="0">
                            <el-col 
                                class="anchor-point-target"
                                :span="6" :xs="6">
                                <el-form-item label="用户名称" prop="userName">
                                    <el-input
                                        v-model="dataContainer.form.userName"
                                        placeholder="请输入"
                                        clearable
                                        @clear="handleQuery"
                                        @keyup.enter="handleQuery"/>
                                </el-form-item>
                            </el-col>
                            <el-col :span="6" :xs="6">
                                <el-form-item label="昵称" prop="nickName">
                                    <el-input
                                        v-model="dataContainer.form.nickName"
                                        placeholder="请输入"
                                        clearable
                                        @clear="handleQuery"
                                        @keyup.enter="handleQuery"/>
                                </el-form-item>
                            </el-col>
                            <el-col :span="6" :xs="6">
                                <el-form-item label="数据编号" prop="id">
                                    <el-input
                                        v-model="dataContainer.form.id"
                                        placeholder="请输入"
                                        clearable
                                        @clear="handleQuery"
                                        @keyup.enter="handleQuery"/>
                                </el-form-item>
                            </el-col>
                            <el-col :span="6" :xs="6">
                                <el-form-item label="手机号码" prop="phone">
                                    <el-input
                                        v-model="dataContainer.form.phone"
                                        placeholder="请输入"
                                        clearable
                                        @clear="handleQuery"
                                        @keyup.enter="handleQuery"/>
                                </el-form-item>
                            </el-col>
                            <el-col :span="6" :xs="6">
                                <el-form-item label="可选择" prop="disabled">
                                    <el-select
                                        style="width:100%;"
                                        v-model="dataContainer.form.disabled"
                                        placeholder="请选择"
                                        clearable
                                        @clear="handleQuery"
                                        @change="handleQuery"
                                    >
                                        <el-option
                                            v-for="item in dataContainer.optionList"
                                            :key="item.id"
                                            :label="item.label"
                                            :value="item.value"
                                        ></el-option>
                                    </el-select>
                                </el-form-item>
                            </el-col>
                            <el-col :span="6" :xs="6">
                                <el-form-item label="邮箱" prop="email">
                                    <el-input
                                        v-model="dataContainer.form.email"
                                        placeholder="请输入"
                                        clearable
                                        @clear="handleQuery"
                                        @keyup.enter="handleQuery"/>
                                </el-form-item>
                            </el-col>
                            <el-col :span="12" :xs="12">
                                <el-form-item label=" ">
                                    <el-button
                                        type="primary"
                                        @click="handleQuery">
                                        <SvgIcon 
                                            :style="'width:15px;height:15px;margin-right:5px;'"
                                            name="search-bt"></SvgIcon>
                                        查询
                                    </el-button>
                                    <el-button
                                        @click="resetQuery">
                                        <SvgIcon 
                                            :style="'width:15px;height:15px;margin-right:5px;'"
                                            name="redo"></SvgIcon>
                                        重置
                                    </el-button>
                                </el-form-item>
                            </el-col>
                        </el-row>
                    </el-form>
                </el-col>
            </DifinCollapse>

是不是非常简单呢,我们可以指定一个元素使收缩的时候只能收缩到相应位置就行了,完美解决需求。DEMO。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1306944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

橘子学K8S02之容器中所谓的限制

前面我们知道了关于隔离在Linux中的实现是通过一组NameSpace做到的&#xff0c;而且实际上他只是修改了应用进程看到计算机的视图&#xff0c;对他的视野做了限制&#xff0c;只能看到某些特定的内容&#xff0c;但是当你把视角切换到宿主机的操作系统来看的时候&#xff0c;这…

JIT即时编译器深度解析——Java性能提升利器

文章目录 一、JIT概述1、为什么要用JIT即时编译器2、C1、C2与Graal编译器3、分层编译4、热点代码5、热点探测&#xff08;1&#xff09;方法调用计数器&#xff08;2&#xff09;回边计数器 二、编译优化技术1、方法内联&#xff08;1&#xff09;什么是方法内联&#xff08;2&…

银行数据分析指标篇:最全银行数据指标体系打包送给你!

前两天分享了银行业数据分析的案例&#xff0c;今天呢&#xff0c;老李把金融行业的指标体系和典型分析场景完整分享给大家&#xff01;做地通俗易懂&#xff0c;条理清晰&#xff0c;很快就能上手。 银行指标体系 “指标”作为业务和数据的结合&#xff0c;它使得业务目标可…

Vue 2.0源码分析-update

Vue 的 _update 是实例的一个私有方法&#xff0c;它被调用的时机有 2 个&#xff0c;一个是首次渲染&#xff0c;一个是数据更新的时候&#xff1b;由于我们这一章节只分析首次渲染部分&#xff0c;数据更新部分会在之后分析响应式原理的时候涉及。_update 方法的作用是把 VNo…

聚焦本田XR-V和福特领睿:两大SUV综合实力对比,谁更胜一筹?

在当今的SUV市场中&#xff0c;家庭用户的选择变得越来越多样化。特别是对于那些追求时尚、功能性以及技术先进性的用户来说&#xff0c;选择正确的SUV显得尤为重要。本文将重点对比福特领睿和本田XR-V这两款SUV&#xff0c;探讨它们在各方面的表现&#xff0c;做一个综合实力的…

艾江山:你好好养生,我带你去看海

有多少人&#xff0c;还没好好看过这个世界&#xff1b; 有多少人&#xff0c;因为不够健康缺少走出来的勇气。 艾江山第二届平凡人的养生故事大赛暨北海游学&#xff0c;在一片依依不舍中圆满闭幕。 游学博闻&#xff0c;盖谓其因游学所以能博闻也 传统上&#xff0c;游学是…

Power BI - 5分钟学习增加条件列

每天5分钟&#xff0c;今天介绍Power BI增加条件列。 什么是增加条件列&#xff1f; 简单理解&#xff0c;可以根据表中某列设置一个或者多个条件&#xff0c;判定的结果会生成一个新列。 举例&#xff1a; 首先&#xff0c;导入一张【Sales】样例表(Excel数据源导入请参考每…

将自己的django项目部署到云服务器(腾讯云centos)

最近自己买了个云服务玩&#xff0c;突然就想把自己写的小项目部署到云服务器上&#xff0c;这样就可以实现公网访问了。以下是整个部署过程和遇到的各种问题的解决方案&#xff0c;有想自己部署自己功能的&#xff0c;可以参考着进行哦。 1、设置好腾讯云的远程登录代码 先给…

智能座舱架构与芯片- (9) 音频篇 上

一、音频总线 音频是智能座舱的核心功能&#xff0c;涵盖车载音响、语音识别、e-Call、消噪及回声消除等应用&#xff0c;随着汽车智能网联化的发展&#xff0c;对音频的开发要求也越来越高。传统的车载音频系统采用模拟并行音频信号传输方式&#xff0c;难以在功能增加与整车…

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-1开环系统与闭环系统Open/Closed Loop System

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-1开环系统与闭环系统Open/Closed Loop System EG1: 烧水与控温水壶EG2: 蓄水与最终水位闭环控制系统 EG1: 烧水与控温水壶 EG2: 蓄水与最终水位 h ˙ q i n A − g h A R \dot{…

总结了人工智能领域,能源领域,电气领域比较好中的一些sci期刊!!仅供参考

文章目录 前言一、总结了人工智能领域&#xff0c;能源领域&#xff0c;电气领域比较好中的一些sci期刊 总结 前言 期刊查询网站&#xff1a; https://www.letpub.com.cn/index.php?pagejournalapp&viewsearch 链接: 点我跳转期刊查询网站 一、总结了人工智能领域&#…

许战海战略文库|美国品牌实践:从品类品牌向产业品牌转变

引言&#xff1a;《品类战略》是上世纪70年代特劳特和里斯所推崇的定位理论,强调“品类聚焦是唯一正确的战略“新品类要使用新品牌”等战略思想,并对品牌延伸等多元化品牌进行批判,并由中国代理人传入中国&#xff0c;从2002年至今滋生了众多品类品牌,阻碍中国经济发展。 在今天…

图生视频AI技术,1张图零提示词,让静态照片动起来

AI时代的发展速度比我们想象中的快多了&#xff0c;当大部分人刚学会AI生成图片时&#xff0c;现在又开始流行AI生成视频了&#xff0c;正式从图片、文字升级到短视频时代。 最近一段时间&#xff0c;AI生成视频的技术正在突飞猛进。Pika、Runway等大家熟知的海外工具都在不断…

android studio flutter启动一直卡在“ Running gradle task ‘assembledebug‘ “的解决问题

解决问题&#xff1a; 1、修改项目中android/build.gradle文件 将buildscript.repositories下面的 //google() //mavenCentral()注释掉&#xff0c;改成maven {allowInsecureProtocol trueurl https://maven.aliyun.com/repository/google } maven {allowInsecureProtocol t…

Chrome安装插件出现CRX-HEADER-INVALID解决方法

1 Chrome浏览器安装离线插件时出现了“CRX-HEADER-INVALID”错误。 2将插件包的后缀名改成.zip格式。 3点击右侧三点按钮后点击【更多工具】--》【扩展程序】界面。 4在【扩展程序】将ZIP包拉入并安装。 5这样就安装成功了&#xff0c;虽然图标上有红色图标…

HarmonyOS4.0从零开始的开发教程14Web组件的使用

HarmonyOS&#xff08;十二&#xff09;Web组件的使用 1 概述 相信大家都遇到过这样的场景&#xff0c;有时候我们点击应用的页面&#xff0c;会跳转到一个类似浏览器加载的页面&#xff0c;加载完成后&#xff0c;才显示这个页面的具体内容&#xff0c;这个加载和显示网页的…

数据库——安全性

智能2112杨阳 一、目的与要求&#xff1a; 1、设计用户子模式 2、根据实际需要创建用户角色及用户&#xff0c;并授权 3、针对不同级别的用户定义不同的视图&#xff0c;以保证系统的安全性 二、内容&#xff1a; 先创建四类用户角色&#xff1a; 管理员角色Cusm、客户角…

YashanDB亮相2023年深圳市高校教育信息化学会学术年会,加码高校数字基座建设

12月3日&#xff0c;“2023年深圳市高校教育信息化学会学术年会”在深圳顺利召开。深圳计算科学研究院&#xff08;简称&#xff1a;深算院&#xff09;YashanDB团队受邀出席&#xff0c;同来自深圳高校、政府教育部门、教育信息化专家学者等共同探讨教育信息化前沿技术与应用的…

06线性回归衍生算法

目录&#xff1a; ridge算法 lasso算法 elastic-Net算法 from sklearn.linear_model import Ridge from sklearn.linear_model import SGDRegressor, LinearRegression from sklearn.linear_model import Lasso import numpy as np# 1. Ridge 岭回归# 生成随机数据 X np.…

linux 调试工具 GDB 使用

gdb是linux下常用的代码调试工具&#xff0c;本文记录常用命令。 被调试的应用需要使用 -g 参数进行编译&#xff0c;如不确定可使用如下命令查看是否支持debug readelf -S filename | grep "debug" 启动调试 gdb binFile 例如要调试sshd&#xff1a; 调试带参数…