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

news2024/11/30 6:32:13

 

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>

 

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

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

相关文章

代码随想录算法训练营Day57|647. 回文子串、516.最长回文子序列、动态规划总结

目录 647. 回文子串 前言 思路 算法实现 516.最长回文子序列 前言 思路 算法实现 动态规划总结 动规五部曲回顾 动规各小专题问题 647. 回文子串 题目链接 文章链接 前言 本题利用动态规划求解时&#xff0c;dp数组的定义与前面的就有些不同了&#xff0c;是难点之…

Python算法题集_翻转二叉树

Python算法题集_翻转二叉树 题226&#xff1a;翻转二叉树1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【DFS递归】2) 改进版一【BFS迭代&#xff0c;节点循环】3) 改进版二【BFS迭代&#xff0c;列表循环】 4. 最优算法 本文为Python算法题集…

黄金交易策略(Nerve Nnife.mql4):利用锁定单消除保留单

完整EA&#xff1a; Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客 趋势突然转变有大约30%的概率会产生一张锁定单&#xff0c;反复转变之后难免就会形成几个保留单了&#xff0c;可以选择一张与保留单同向同大小&#xff08;接近也行&#xff09;的单&#xff0c;去消除这…

详解Python中的str.format方法

字符串的内置方法大致有40来个&#xff0c;但是一些常用的其实就那么20几个&#xff0c;而且里面还有类似的用法&#xff0c;区分度高比如&#xff1a;isalpha,isalnum,isdigit&#xff0c;还有一些无时不刻都会用到的split切分&#xff0c;join拼接&#xff0c;strip首尾去指定…

深度学习:Pytorch安装的torch与torchvision的cuda版本冲突问题与解决历程记录

今天不小心将conda环境中的一个pytorch环境中的torch包给搞混了&#xff0c;将其更新了一下&#xff0c;发生了一些问题&#xff1a; 当时运行了一下这个代码&#xff1a; pip install torchvision --upgrade 导致了环境中包的混乱&#xff1a; 只能说欲哭无泪&#xff0c;当…

代码随想录day21--回溯基础

理论基础 回溯法也可以叫回溯搜索法&#xff0c;它是一种搜索的方式。我们在二叉树中也多次提到了回溯。回溯是递归的副产品&#xff0c;只要使用了递归就会有回溯&#xff0c;我们我们就可以笼统的将回溯函数称为递归函数 回溯法解决的问题 1.组合问题&#xff1a;N个数里面…

IMX6ULL移植U-Boot 2022.04

目录 目录 1.编译环境以及uboot版本 2.默认编译测试 3.uboot中新增自己的开发板 3.编译测试 4.烧录测试 5.patch文件 1.编译环境以及uboot版本 宿主机Debian12u-boot版本lf_v2022.04 ; git 连接GitHub - nxp-imx/uboot-imx: i.MX U-Boot交叉编译工具gcc-arm-10.3-2021.0…

《剑指Offer》笔记题解思路技巧优化 Java版本——新版leetcode_Part_2

《剑指Offer》笔记&题解&思路&技巧&优化_Part_2 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f353;&#x1f353;&#x1f353;广度优先搜索BFS&#x1f353;&#x1f353;&#x1f353;深度优先搜索DF…

esp8266-01s WIFI模块使用(一)- AT指令

时间记录&#xff1a;2024/2/15 一、注意事项 &#xff08;1&#xff09;使用英文双引号表示字符串数据 &#xff08;2&#xff09;默认波特率115200 &#xff08;3&#xff09;AT指令以“\r\n”结尾 &#xff08;4&#xff09;3.3V电源接口先连接单片机的3.3V&#xff0c;如…

Spring 用法学习总结(二)之基于注解注入属性

Spring学习 5 基于注解方式创建对象6 基于注解注入属性 5 基于注解方式创建对象 注解是代码的特殊标记&#xff0c;可以简化xml配置&#xff0c;格式&#xff1a;注解名称(属性名称属性值&#xff09;&#xff0c;可以作用在类、方法、属性上 以下注解都可以创建bean实例 Com…

VS Code中的JDK设置

在VS Code使用中&#xff0c;如果机器只安装了一个版本的JDK版本&#xff0c;一般不需要特别关注JDK 的配置&#xff0c;但是在以下状况下&#xff0c;需要对JDK进行特别的配置&#xff1a; 机器有多个JDK版本&#xff0c;不同的项目使用不同的JDK版本项目使用的JDK版本较低&a…

【web | CTF】BUUCTF [护网杯 2018] easy_tornado

天命&#xff1a;这题是框架性的漏洞&#xff0c;Python的web服务器框架&#xff0c;应该已经比较古老了 开局先看一下三个文件 简单阅读后会发现&#xff0c;这里存在文件包含漏洞&#xff0c;可以直接读取文件&#xff0c;但是有一个哈希值校验 一开始我以为是扫描文件后得到…

vue3 之 商城项目—支付

支付模版 pay/index.vue <script setup> const payInfo {} </script> <template><div class"xtx-pay-page"><div class"container"><!-- 付款信息 --><div class"pay-info"><span class"ic…

腾讯云4核8G服务器够用吗?能支持多少人?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

Linux实用指令

Linux实用指令 1.指定运行级别 运行级别说明&#xff1a; 0 &#xff1a;关机 1 &#xff1a;单用户【找回丢失密码】 2&#xff1a;多用户状态没有网络服务 3&#xff1a;多用户状态有网络服务 4&#xff1a;系统未使用保留给用户 5&#xff1a;图形界面 6&#xff1a;系统重…

山西电力市场日前价格预测【2024-02-11】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-11&#xff09;山西电力市场全天平均日前电价为121.99元/MWh。其中&#xff0c;最高日前电价为475.98元/MWh&#xff0c;预计出现在19:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

姿态传感器MPU6050模块的基本使用总结

以下两篇文章可作为参考&#xff1a; 姿态传感器MPU6050原理及应用超详细讲解 - 采芯网 基于STM32的四旋翼无人机项目&#xff08;二&#xff09;&#xff1a;MPU6050姿态解算&#xff08;含上位机3D姿态显示教学&#xff09;-CSDN博客 基本介绍 随着科技的发展&#xff0c;我们…

Write operation failed: computed value is readonly问题解决

源代码&#xff1a; // 封装倒计时逻辑函数 import { computed, ref } from vue import dayjs from dayjs export const useCountDown () > {// 1.响应式数据const time ref(0)// 格式化时间const formatTime computed(()>dayjs.unix(time.value).format(mm分ss秒))/…

表的连接

目录 内连接实现效果 使用左外连接&#xff0c;将所有的员工信息都显示出来&#xff0c;即便他没有对应的部门 使用右外连接&#xff0c;将所有的部门信息都显示出来 查询每个员工的编号、姓名、职位&#xff0c;以及所在各部门的领导姓名、领导职位 确定所需要的数据表 确…