【sgSearch】自定义组件:常用搜索栏筛选框组件(包括表格高度变化兼容)。

 

sgSearch源码

<template><div :class="$options.name" :expand="expandSearch" :showCollapseBtn="showCollapseBtn"><!-- v-clickoutside="(d) => (expandSearch = false)" --><ul class="search-list"><slot name="searchFilter"></slot><ul class="sg-search-btns"><slot name="searchBtns"></slot></ul><ul class="sg-operate-btns"><slot name="operateBtns"></slot></ul></ul><!-- 折叠按钮 --><sgCollapseBtn v-model="expandSearch" /></div>
</template>
<script>
import clickoutside from "element-ui/src/utils/clickoutside";import sgCollapseBtn from "@/vue/components/admin/sgCollapseBtn";
export default {name: "sgSearch",directives: { clickoutside },components: {sgCollapseBtn,},data() {return {expandSearch: false,showCollapseBtn: false,defaultHeight: 50, //组件默认高度};},props: ["value", //是否显示"disabled", //是否禁用"collapse","data","showCollapseButton", //显示折叠按钮],computed: {},watch: {collapse: {handler(newValue, oldValue) {this.expandSearch = !newValue;},deep: true, //深度监听immediate: true, //立即执行},expandSearch: {handler(newValue, oldValue) {this.$emit(`update:collapse`, !newValue);this.$nextTick(() => {this.getHeight();// this.getTop();});},deep: true, //深度监听// immediate: true, //立即执行},showCollapseButton: {handler(newValue, oldValue) {this.$nextTick(() => {this.getShowCollapseBtn();});},deep: true, //深度监听// immediate: true, //立即执行},},created() {},mounted() {this.$el.style.setProperty("--defaultHeight", `${this.defaultHeight}px`); //js往css传递局部参数this.getShowCollapseBtn();this.$nextTick(() => {this.getHeight();// this.getTop();});},methods: {getHeight() {let height = this.$el ? this.$el.getBoundingClientRect().height : 0;this.$emit(`getHeight`, height);},/* getTop() {let rect = this.$el ? this.$el.getBoundingClientRect() : null;if (rect) {let top = this.$el ? rect.top + rect.height : 0;this.$emit(`getTop`, top);}}, */getShowCollapseBtn(d) {if (this.showCollapseButton === "" || this.showCollapseButton) {this.showCollapseBtn = true;} else if (this.showCollapseButton === false) {this.showCollapseBtn = false;} else {let len_search_list = this.$el.querySelectorAll(`.search-list>li`).length;/*let len_search_btns = this.$el.querySelectorAll(`.sg-search-btns>*`).length;let len_operate_btns = this.$el.querySelectorAll(`.sg-operate-btns>*`).length;let len = len_search_list + len_search_btns + len_operate_btns;this.showCollapseBtn = len > 5; */let searchList = this.$el.querySelector(`.search-list`);this.showCollapseBtn =len_search_list > 3 || searchList.offsetHeight > this.defaultHeight;}},},destroyed() {},
};
</script>
<style lang="scss" scoped>
.sgSearch {position: relative;$defaultHeight: var(--defaultHeight); //默认高度$collapseHeight: 75px; //折叠高度$expandHeight: max-content; //展开高度$colCount: 4; //每行数量$itemGap: 10px; //每一项间距$itemLabelGap: 5px; //每一项标签间距width: 100%;flex-grow: 1;height: $defaultHeight;box-sizing: border-box;.sgCollapseBtn {display: none;}&[showCollapseBtn] {padding-bottom: 30px;height: $collapseHeight;.sgCollapseBtn {display: block;}}& > .search-list {width: 100%;flex-grow: 1;display: flex;flex-wrap: wrap;& > * {flex-shrink: 0;}& > li {width: calc((100% - #{$itemGap} * (#{$colCount} - 1)) / #{$colCount});flex-wrap: nowrap;align-items: baseline;box-sizing: border-box;margin-right: $itemGap;margin-bottom: $itemGap;display: none;&:nth-of-type(1),&:nth-of-type(2),&:nth-of-type(3) {display: flex;}label {flex-shrink: 0;margin-right: $itemLabelGap;text-align: right;}&:nth-of-type(#{$colCount}n),&:last-of-type {margin-right: 0;}}.sg-search-btns {display: flex;flex-wrap: nowrap;align-items: baseline;& > * {margin-right: $itemGap;}}.sg-operate-btns {display: flex;justify-content: flex-end;align-items: baseline;flex-wrap: nowrap;margin-left: auto;& > * {margin-left: $itemGap;}}}&[expand] {height: $expandHeight;& > .search-list {& > li {display: flex;}}}
}
</style>

应用

<template><div :class="$options.name"><sgSearch:collapse.sync="collapseSearch"@keyup.enter="(collapseSearch = true), (currentPage = 1), initList()"@getHeight="(d) => (sgSearchHeight = d)"><template slot="searchFilter"><li><label>搜索</label><el-input clearable placeholder="请输入关键词" v-model.trim="keyword" /></li><li style="width: 150px"><label>状态</label><el-select style="width: 100%" v-model="ZT" placeholder="请选择" clearable><el-optionv-for="(a, i) in ZTs":key="i":value="a.value":label="a.label"></el-option></el-select></li><li><label>创建时间</label><el-date-pickerv-model="GXSJ"ref="GXSJ"type="daterange"align="right"unlink-panelsrange-separator="至"start-placeholder="开始日期"end-placeholder="结束日期":picker-options="$global.pickerOptions"clearable/></li><li><label>更新时间</label><el-date-pickerv-model="GXSJ"ref="GXSJ"type="daterange"align="right"unlink-panelsrange-separator="至"start-placeholder="开始日期"end-placeholder="结束日期":picker-options="$global.pickerOptions"clearable/></li></template><template slot="searchBtns"><el-buttonsize="medium"type="primary"icon="el-icon-search"@click="(collapseSearch = true), (currentPage = 1), initList()">搜索</el-button><el-buttonsize="medium"type="primary"@click="resetFilterData(), initList()"plain>重置</el-button></template><template slot="operateBtns"><el-button size="medium" type="primary" @click="add">添加</el-button><el-button:disabled="selection.length === 0"size="medium"type="danger"@click="delAny">批量删除</el-button></template></sgSearch><divclass="sg-table"v-loading="loading":full="fullscreenTable"@click="collapseSearch = true"><el-table:data="tableData"ref="table"stripeborder:header-cell-style="{ background: '#f5f7fa' }":height="`calc(100vh - ${fullscreenTable ? 10 : 160 + sgSearchHeight}px -  ${total > 10 ? 40 : 0}px)`":show-header="true"style="width: 100%"@row-click="row_click"@selection-change="selection_change":row-class-name="row_class_name"><template slot="empty"><el-empty v-show="!loading" :image="require('@/assets/404.png')"><span slot="description">暂无数据</span><el-button type="primary" icon="el-icon-s-promotion" plain @click="add">去哪里添加数据</el-button></el-empty></template><el-table-column type="selection" width="50" /><el-table-column type="index" label="序号" width="60" /><!-- <el-table-column prop="字段" label="列名" minWidth="200" /> --><el-table-column :resizable="false" prop="ID" label="身份证号" minWidth="200"><template v-slot:header="scope"><span>身份证号<fullscreenTable v-model="fullscreenTable" /></span></template><template slot-scope="scope"><span>【索引{{ scope.$index }}】{{ scope.row.ID }}</span></template></el-table-column><el-table-column label="用户名" show-overflow-tooltip minWidth="100"><template slot-scope="scope"><span>{{ scope.row.username }}</span></template></el-table-column><el-table-column label="姓名" show-overflow-tooltip minWidth="80"><template slot-scope="scope"><span>{{ scope.row.name }}</span></template></el-table-column><el-table-column label="权限角色" show-overflow-tooltip minWidth="100"><template slot-scope="scope"><span>{{ scope.row.role || `未分配` }}</span></template></el-table-column><el-table-column label="操作" width="175"><template slot-scope="scope"><el-buttonsize="mini"type="primary"@click.stop="edit(scope.row)"@dblclick.native.stop>修改</el-button><el-buttonsize="mini"type="danger"@click.stop="del(scope.row)"@dblclick.native.stop>删除</el-button></template></el-table-column></el-table><el-paginationstyle="width: 100%; text-align: center; margin-top: 10px"background:hidden="total <= 10":layout="`total, sizes, prev, pager, next, jumper`":page-sizes="[10, 20, 50, 100]":pager-count="7":current-page.sync="currentPage":page-size.sync="pageSize":total="total"@size-change="initList"@current-change="initList"/></div></div>
</template>
<script>
import sgSearch from "@/vue/components/admin/sgSearch";
export default {name: "sgBody",components: { sgSearch },data() {return {ZT: 1, //当前状态ZTs: [{ value: 1, label: "显示文本1" },{ value: 2, label: "显示文本2" },{ value: 3, label: "显示文本3" },{ value: 4, label: "显示文本4" },{ value: 5, label: "显示文本5" },],fullscreenTable: false, //全屏表格collapseSearch: false, //折叠搜索栏sgSearchHeight: 0, //搜索栏的高度tableData: [{ ID: "330110198704103091", username: "username1", name: "姓名1", role: "role1" },{ ID: "330110198704103092", username: "username2", name: "姓名2", role: "role2" },{ ID: "330110198704103093", username: "username3", name: "姓名3", role: "role3" },{ ID: "330110198704103094", username: "username4", name: "姓名4", role: "role4" },{ ID: "330110198704103095", username: "username5", name: "姓名5", role: "role5" },], //表格数据selection: [], //表格选中项数组currentPage: 1,pageSize: 10,// total: 0,total: 999,};},methods: {row_click(row, column, event) {this.$refs.table.toggleRowSelection(row);},selection_change(selection) {this.selection = selection;},row_class_name({ row, rowIndex }) {return this.selection.some((v) => v.ID === row.ID) ? "selected" : "";},},
};
</script>

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【初学者向导】轻松加入OnlyFans世界:一站式订阅与支付指南!掌握使用虚拟卡的订阅技巧

目录 1. 引言2. 注册OnlyFans账户3. 浏览OnlyFans内容4. 选择订阅时长5. 开通虚拟卡 5.1. 什么是虚拟信用卡5.2. 如何开通虚拟卡 6. 使用虚拟卡订阅7. 总结8. 常见问题 1. 引言 什么是OnlyFans&#xff1a;OnlyFans是一种内容订阅服务&#xff0c;成立于2016年&#xff0c;允…

Codeforces Round 924 (Div. 2) B - D

B. Equalize 题目&#xff1a; 思路&#xff1a;首先排序然后去重&#xff08;可以用set来去重&#xff09;&#xff0c;我们可以肯定的是&#xff0c;如果连续k个数最大值最小值的差小于等于n的话&#xff0c;那么这个长度为k的区间就符合答案要求&#xff0c;那么k就和答案…

NULL和nullptr到底是什么?它们的区别又是什么?

目录 1.前言 2.剖析NULL 3. 剖析nullptr 4.nullptr与NULL的区别 1.前言 为了保持良好的编程习惯&#xff0c;我们在声明某个变量时都应该给这个变量合适的初始值&#xff0c;不然容易出现不可预知的错误。对于指针来说更是如此&#xff0c;在c语言中我们就通常将暂时没有指向…

挑战杯 python区块链实现 - proof of work工作量证明共识算法

文章目录 0 前言1 区块链基础1.1 比特币内部结构1.2 实现的区块链数据结构1.3 注意点1.4 区块链的核心-工作量证明算法1.4.1 拜占庭将军问题1.4.2 解决办法1.4.3 代码实现 2 快速实现一个区块链2.1 什么是区块链2.2 一个完整的快包含什么2.3 什么是挖矿2.4 工作量证明算法&…

9 个管理 Windows 硬盘的最佳免费磁盘分区软件 [2024 排名]

管理分区可能是一项具有挑战性的任务。当您想到删除、缩小、移动、磁盘分区或合并分区等方面时&#xff0c;您会认为它们是很难做到的事情。然而&#xff0c;虽然 Windows 自己的磁盘管理可以处理大部分问题&#xff0c;但它无法处理管理分区的所有方面。 这时候优质的磁盘管理…

【Cocos入门】物理检测

目录 一、物理检测的概念二、点测试三、矩形测试四、射线测试 一、物理检测的概念 CoCos中&#xff0c;物理检测也是物理系统的一部分&#xff0c;它不是用于检测物体的物理特性的&#xff0c;而是用来查询物体的(比如某个地方是否存在物理碰撞体)。其又分成&#xff1a;点检测…

关于VIT(Vision Transformer)的架构记录

在VIT模型设计中&#xff0c;尽可能地紧密遵循原始的Transformer模型&#xff08;Vaswani等人&#xff0c;2017年&#xff09;。这种刻意简化的设置的一个优势是&#xff0c;可扩展的NLP Transformer架构及其高效的实现几乎可以即插即用。 图&#xff1a;模型概述。我们将图像分…

「优选算法刷题」:和可被K整除的子数组

一、题目 给定一个整数数组 nums 和一个整数 k &#xff0c;返回其中元素之和可被 k 整除的&#xff08;连续、非空&#xff09; 子数组 的数目。 子数组 是数组的 连续 部分。 示例 1&#xff1a; 输入&#xff1a;nums [4,5,0,-2,-3,1], k 5 输出&#xff1a;7 解释&…

《合成孔径雷达成像算法与实现》Figure6.13

clc clear close all参数设置 距离向参数设置 R_eta_c = 20e3; % 景中心斜距 Tr = 2.5e-6; % 发射脉冲时宽 Kr = 20e12; % 距离向调频率 alpha_os_r = 1.2; % 距离过采样率 Nrg = 320; % 距离线采样数 …

多模态基础---BERT

1. BERT简介 BERT用于将一个输入的句子转换为word_embedding&#xff0c;本质上是一个transformer的Encoder。 1.1 BERT的两种训练方法 预测被遮挡的单词预测两个句子是否是相邻的句子 1和2是同时训练的 1.1 BERT的四种用法 预测句子的类别&#xff1a;输入一个句子&…

鸿蒙开发系列教程(二十一)--轮播处理

轮播处理 Swiper本身是一个容器组件&#xff0c;当设置了多个子组件后&#xff0c;可以对这些子组件进行轮播显示 在自身尺寸属性未被设置时&#xff0c;会自动根据子组件的大小设置自身的尺寸 参数&#xff1a; 通过loop属性控制是否循环播放&#xff0c;该属性默认值为tr…

【深入理解DETR】DETR的原理与算法实现

1 DETR算法概述 ①端到端 ②Transformer-model 之前的方法都需要进行NMS操作去掉冗余的bounding box或者手工设计anchor&#xff0c; 这就需要了解先验知识&#xff0c;增加从超参数anchor的数量&#xff0c; 1.1 训练测试框架 一次从图像中预测n个object的类别 训练阶段我们…