【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-option
              v-for="(a, i) in ZTs"
              :key="i"
              :value="a.value"
              :label="a.label"
            ></el-option>
          </el-select>
        </li>
        <li>
          <label>创建时间</label>
          <el-date-picker
            v-model="GXSJ"
            ref="GXSJ"
            type="daterange"
            align="right"
            unlink-panels
            range-separator="至"
            start-placeholder="开始日期"
            end-placeholder="结束日期"
            :picker-options="$global.pickerOptions"
            clearable
          />
        </li>
        <li>
          <label>更新时间</label>
          <el-date-picker
            v-model="GXSJ"
            ref="GXSJ"
            type="daterange"
            align="right"
            unlink-panels
            range-separator="至"
            start-placeholder="开始日期"
            end-placeholder="结束日期"
            :picker-options="$global.pickerOptions"
            clearable
          />
        </li>
      </template>
      <template slot="searchBtns">
        <el-button
          size="medium"
          type="primary"
          icon="el-icon-search"
          @click="(collapseSearch = true), (currentPage = 1), initList()"
          >搜索</el-button
        >
        <el-button
          size="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>

    <div
      class="sg-table"
      v-loading="loading"
      :full="fullscreenTable"
      @click="collapseSearch = true"
    >
      <el-table
        :data="tableData"
        ref="table"
        stripe
        border
        :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-button
              size="mini"
              type="primary"
              @click.stop="edit(scope.row)"
              @dblclick.native.stop
              >修改</el-button
            >
            <el-button
              size="mini"
              type="danger"
              @click.stop="del(scope.row)"
              @dblclick.native.stop
              >删除</el-button
            >
          </template>
        </el-table-column>
      </el-table>
      <el-pagination
        style="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>

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python】通过conda安装Python的IDE

背景 系统&#xff1a;win11 软件&#xff1a;anaconda Navigator 问题现象&#xff1a;①使用Navigator安装jupyter notebook以及Spyder IDE 一直转圈。②然后进入anaconda prompt执行conda install jupyter notebook一直卡在Solving environment/-\。 类似问题&#xff1a; …

《UE5_C++多人TPS完整教程》学习笔记16 ——《P17 菜单类(The Menu Class)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P17 菜单类&#xff08;The Menu Class&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&#x…

单片机基础入门:简单介绍51单片机的工作原理

在电子技术领域&#xff0c;单片机是实现智能化控制不可或缺的关键元件。它们集成了许多功能于一身&#xff0c;成为了各种电子系统的心脏。为了更好地理解单片机如何工作&#xff0c;本文将重点介绍51单片机的基本组成和工作原理。 51单片机是一种广泛使用的微控制器&#xf…

【JavaScript】面试手写题精讲之数组(上)

专题缘由 该专题主要是讲解我们在面试的时候碰到一些JS的手写题, 确实这种手写题还是比较恶心的。有些时候好不容易把题目写出来了&#xff0c;突然面试官冷不丁来一句有没有更优的解法&#xff0c;直接让我们僵在原地。为了解决兄弟们的这些困扰&#xff0c;这个专题于是就诞…

计算机网络——12DNS

DNS DNS的必要性 IP地址标识主机、路由器但IP地址不好记忆&#xff0c;不便于人类用使用&#xff08;没有意义&#xff09;人类一般倾向于使用一些有意义的字符串来标识Internet上的设备存在着“字符串”——IP地址的转换的必要性人类用户提供要访问机器的“字符串”名称由DN…

Linux学习(三)shell编程

1.echo指令 用于将后面的字体内容回显到控制台&#xff0c;将后面的字体用单引号或双引号引起来都会忽略引号 2.expr数学运算 3.第一个shell脚本 一般shell脚本以.sh为后缀&#xff0c;通过sh命令来执行shell脚本。 4.shell脚本的命令行参数 $1 $2 $3 $4 $5 $6 $7 $8 $9 $0 &…

C语言学习day14:数组定义和使用

定义变量&#xff1a; 数据类型 变量 值 数组定义&#xff1a; 数据类型 数组名[元素个数]{值1,值2,值3} 代码&#xff1a; int main() {//定义变量//数据类型 变量 值//数组定义//数据类型 数组名[元素个数]{值1,值2,值3}//数组下标 数组名[小标]//数组下标是…

相机图像质量研究(16)常见问题总结:光学结构对成像的影响--IRCUT

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

Unity基础 -- 更新中(2.15)

Unity基础 文章目录 Unity基础3D数学 -- 基础一些方法插值运算三角函数坐标系 3D数学 -- 向量理解常用函数线性插值 3D数学 -- 四元数看向四元数计算 延迟函数协同程序 3D数学 – 基础 一些方法 float value01 Mathf.PI; // Π int value03 Mathf.Abs(-2); // 绝对值 int v…

MySQL安装及环境配置

目录 下载安装检验安装是否成功配置环境变量 下载 MySQL下载链接 安装 点击安装包进行安装 选择Server only&#xff0c;点击Next 点击Execute 点击Next 提示我们需要进行一些配置&#xff0c;点击Next 输入管理员密码&#xff0c;点击Next 点击Execute&#xff0c;安装配…

【类与对象(1)】类的引入、访问及封装、定义、作用域、实例化、类大小的计算、this指针

1.类的引入 C兼容了C语言结构体的用法&#xff0c;但是同时又升级成了类。结构体中只能定义变量&#xff0c;类中不仅可以定义变量&#xff0c;还可以定义函数。 例如&#xff0c;数据结构中实现栈&#xff0c;结构体stack中只定义了变量&#xff0c;要实现的函数在结构体外定…

FastAI 之书(面向程序员的 FastAI)(一)

原文&#xff1a;www.bookstack.cn/read/th-fastai-book 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 序言 原文&#xff1a;www.bookstack.cn/read/th-fastai-book/README.md 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 在很短的时间内&#xff0c;深度…

建筑工程如何找答案? #职场发展#笔记#职场发展

这些软件以其强大的搜索引擎和智能化的算法&#xff0c;为广大大学生提供了便捷、高效的解题方式。下面&#xff0c;让我们一起来了解几款备受大学生欢迎的搜题软件吧&#xff01; 1.易解题 这是一个网站 是我在百度搜题&#xff0c;经常会出现的一个网站&#xff0c;它里面…

K8S集群实践之十:虚拟机部署阶段性总结

目录 1. 说明&#xff1a; 2. 安装准备 2.1 每个节点设置双网卡&#xff0c;一卡做网桥&#xff08;外部访问&#xff09;&#xff0c;一卡做NAT&#xff08;集群内网访问&#xff09; 2.2 准备一个可用的代理服务器 3. 由于虚拟机崩溃&#xff08;停电&#xff0c;宿主机…

Gemini 1.5 Pro揭秘:Google DeepMind新一代AI模型如何突破千万级别词汇限制?

Gemini 1.5 Pro 发布&#xff01; 这款模型凭借其超长的上下文处理能力脱颖而出&#xff0c;支持10M tokens。 它的多模态特性意味着&#xff0c;无论面对多么庞大复杂的内容&#xff0c;Gemini 1.5 Pro都能游刃有余地应对。 在AI的世界里&#xff0c;上下文的理解如同记忆的…

如何创建和填写 PDF 表单,简化您的文档工作流

阅读本文&#xff0c;了解如何在开源办公套件 ONLYOFFICE 中创建和填写 PDF 表单。 ONLYOFFICE表单发展小史 ONLYOFFICE 表单首个版本发布于2022年1月18日&#xff0c;是 ONLYOFFICE 版本 7.0 更新的一部分。 您可以使用 ONLYOFFICE 表单&#xff0c;创建各种类型的模板文档&a…

DS Wannabe之5-AM Project: DS 30day int prep day18

Q1. What is Levenshtein Algorithm? Levenshtein算法&#xff0c;也称为编辑距离算法&#xff0c;是一种量化两个字符串之间差异的方法。它通过计算将一个字符串转换成另一个字符串所需的最少单字符编辑操作次数来实现。这些编辑操作包括插入、删除和替换字符。Levenshtein距…

备战蓝桥杯---图论之最短路Bellman-Ford算法及优化

目录 上次我们讲到复杂度为&#xff08;nm)logm(m为边&#xff0c;n为点&#xff09;的迪杰斯特拉算法&#xff0c;其中有一个明显的不足就是它无法解决包含负权边的图。 于是我们引进Bellman-Ford算法。 核心&#xff1a;枚举所有的点&#xff0c;能松弛就松弛&#xff0c;直…

使用radial-gradient完成弧形凹陷的绘制

1、效果如下图 我在微信小程序中制作的 2、代码如下 <style>.header {position: relative;width: 200px;height: 200px;overflow: hidden;}.header .circle {--circleValue: 500px;position: absolute;bottom: 0;left: 50%;width: 100%;height: var(--circleValue);trans…

2024牛客寒假算法基础集训营2-c Tokitsukaze and Min-Max XOR

来源 题目 Tokitsukaze 有一个长度为 n 的序列 a1,a2,…,an和一个整数 k。 她想知道有多少种序列 b1,b2,…,bm满足&#xff1a; 其中 ⊕\oplus⊕ 为按位异或&#xff0c;具体参见 百度百科&#xff1a;异或 答案可能很大&#xff0c;请输出  mod1e97 后的结果。 输入描述…