Vue实现任意内容展开 / 收起功能组件

news2025/7/9 6:10:27

博主介绍

📢点击下列内容可跳转对应的界面,查看更多精彩内容!

🍎主页:水香木鱼
🍍专栏:后台管理系统


文章目录

简介:这是一篇有关【Vue实现任意内容展开 / 收起功能组件】的文章,博主用最精简的语言去表达给前端读者们。

collapse组件
页面使用

在这里插入图片描述

1、collapse组件

<!--展开/收起 组件-->
<template>
  <section
    class="collapse"
    ref="collapse"
    :style="{
      height: containerH + 'px',
      'padding-right': (hideControll ? 0 : 50) + 'px',
    }"
  >
    <div class="collapse-content" ref="content">
      <slot></slot>
    </div>
    <span
      v-if="!hideControll"
      v-show="controllVisible"
      class="collapse-controll"
      @click="handleControll"
    >
      <i
        v-show="!hideControllIcon"
        class="collapse-controll-icon"
        :class="isShow ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"
      ></i>
      {{ isShow ? foldText : unfoldText }}
    </span>
  </section>
</template>

<script>
export default {
  name: "collapse",

  model: {
    prop: "visible",
    event: "change",
  },

  props: {
    visible: Boolean,

    // 默认显示的内容高度
    defaultHeight: {
      type: Number,
      default: 100,
    },

    // 是否隐藏内置控制按钮
    hideControll: Boolean,

    // 是否隐藏内置控制按钮icon
    hideControllIcon: Boolean,

    foldText: {
      type: String,
      default: "收起",
    },

    unfoldText: {
      type: String,
      default: "展开",
    },
  },

  data() {
    return {
      isShow: false,
      controllVisible: true,

      containerH: this.defaultHeight,
      contentH: 0,
      DOMWatcher: null,
    };
  },

  watch: {
    visible(v) {
      if (v) {
        this.unfold();
      } else {
        this.handleFold();
      }
    },

    isShow(v) {
      this.$emit("change", v);
    },
  },

  mounted() {
    this.init();
    this.watch();

    if (this.visible) {
      this.unfold();
    }
  },

  destroyed() {
    this.DOMWatcher.disconnect();
  },

  methods: {
    init() {
      this.contentH = this.$refs.content.offsetHeight;
      /**
       * 当内容变化的同时也是展开状态的话,那么需要更新容器高度
       * 1. 当最新的内容高度大于默认高度时,则把容器高度更新最新内容高度一致即可
       * 2. 反之,把容器高度设到最小(即默认高度),同时设为收起状态
       */
      if (this.isShow) {
        if (this.contentH > this.defaultHeight) {
          this.containerH = this.contentH;
        } else {
          this.containerH = this.defaultHeight;
          this.isShow = false;
        }
      }
      this.controllVisible = this.contentH > this.defaultHeight; // 控制按钮的显示隐藏
    },

    watch() {
      this.DOMWatcher = new MutationObserver(() => {
        // 监测到DOM变化,重新计算高度
        this.refresh();
      });
      this.DOMWatcher.observe(this.$refs.content, {
        childList: true,
        attributes: true,
        characterData: true,
        subtree: true,
      });
    },

    refresh() {
      this.$nextTick(() => {
        this.init();
      });
    },

    handleControll() {
      let handle = this.isShow ? this.handleFold : this.unfold;
      handle();
    },

    // 收起
    handleFold() {
      this.containerH = this.defaultHeight;
      this.$nextTick(() => {
        this.isShow = false;
      });
    },

    // 展开
    unfold() {
      const contentH = this.$refs.content.offsetHeight;
      if (contentH > this.defaultHeight) {
        this.containerH = contentH;
      }
      this.$nextTick(() => {
        this.isShow = true;
      });
    },
  },
};
</script>

<style scoped>
.collapse {
  width: 100%;
  position: relative;
  overflow: hidden;
  transition: height 0.28s ease-in-out;
}
.collapse-controll {
  position: absolute;
  bottom: 0px;
  right: 8px;
  font-size: 14px;
  font-weight: 400;
  color: #6abcff;
  cursor: pointer;
}
.collapse-controll-icon {
  margin-right: 2px;
}
</style>

2、页面使用

<template>
  <div>
    <!-- 自动适应外层容器宽度 -->
    <div style="width: 130px">
      <collapse :default-height="34">
        <div>详细内容:</div>
        <div>水香木鱼欢迎您~</div>
        <div>自己定义内容~</div>
        <div>页面简洁 美观~~</div>
      </collapse>
    </div>
  </div>
</template>

<script>
import collapse from "@/components/collapse.vue";
export default {
  components: { collapse },
};
</script>

相关推荐

⭐Vue实现点击按钮或者图标可编辑输入框
⭐vue实现隐藏浏览器右侧滚动条功能
⭐vue实现keep-alive页面缓存【三步骤配置,一步到位】
⭐vue实现pdf在线预览业务
⭐前端vue正则表达式-隐私脱敏处理

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

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

相关文章

1.jdk,数据类型,运算符

Java语言跨平台性的解释 一次编译&#xff0c;到处运行 将.java文件编译成.class文件&#xff0c;然后就可以在linux&#xff0c;windows运行。 java的跨平台的实现是通过在不同的操作系统上的不同的jvm差异来实现跨平台的 jdk jdk jre&#xff08;jvmjavase核心类库&…

MySQL基础操作总结_CRUD

文章目录 1.新增 insert 1.1 单行数据全列插入 1.2 多行数据指定列插入 2.查询 select 2.1 全列查询 2.2 指定列查询 2.3 查询字段包含表达式 2.4 别名 2.5 去重:distinct 2.6 排序:order by 2.7 条件查询 2.7.1 where条件查询 2.7.2 and与or查询 2.7.3 范围查…

Java简介

Java是一门面向对象的编程语言&#xff0c;不仅吸收了C语言的各种优点&#xff0c;还摒弃了C里难以理解的多继承、指针等概念&#xff0c;因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表&#xff0c;极好地实现了面向对象理论&#xff0…

Matplotlib 基础入门知识点总结

目录 1、绘图的一些基本命令展示 2、Matplotlib 绘制网格 3、plt.gca() 对坐标轴的操作 4、 图表的样式参数设计 5、创建图形对象 6、绘制多子图 1.add_axes()&#xff1a;添加区域 2. subplot()函数&#xff0c;可以均等的划分画布 3.subplots()函数详解 7、柱形图的…

踩坑List.addAll抛出UnsupportedOperationException

转载标明出处: 公司内部博客,作者 居xx, 在此表示感谢 1、我自己遇到的问题 try { // 不加try..catch报错 java.lang.UnsupportedOperationException: null ,原因未知list.addAll(a.getResult());list.addAll(b.getResult());list.addAll(c.getResult());list.addAll(d.getResu…

双软认证是指哪两项证书认证

一、双软认证是指哪两项证书认证&#xff1a; “双软认证”&#xff1a;指软件产品等登记和软件企业认定&#xff1b;企业申请双软认证&#xff0c;除了获得软件企业和软件产品的认证资格外&#xff0c;也可以使企业享受国家对软件行业提供的税收优惠政策。 二、认证的好处 1、…

后量子密码学中的模数是多少?

密码学&#xff1a;后量子密码学中的模数是多少&#xff1f; 只要是从事网络安全或安全软件开发的人&#xff0c;就都可能已经了解过公钥加密以及在20世纪70年代末和80年代前后创建的方法。现在我们可能需要学习更多的理论&#xff0c;因为我们所学的方法可能会受到量子计算机的…

网页字体图标用法

目录前言引用流程1、打开网页2、选择自己喜欢的图标加入购物车3、下载图标4、引用引用前言 1、接下来介绍引用图标都是免费的&#xff0c;可以放心食用。 2、标签可以自己设计&#xff0c;用css、svg画图或者引用图片都可以。但我们设计的很难超过专业人员的设计。引用图片的画…

深入理解mvcc机制(详解)

深入理解mvcc机制一&#xff0c;MVCC定义1&#xff0c;undolog日志2&#xff0c;undolog版本控制链3&#xff0c;readView3.1&#xff0c;readview简介3.2&#xff0c;readview和undolog结合使用规则3.3&#xff0c;readview和undolog基本使用4&#xff0c;总结一&#xff0c;M…

Java学习----前端3

今日学习内容如下&#xff1a; JavaScript JavaScript是一种基于对象和事件驱动的客户端脚本语言动态、弱类型、基于原型&#xff0c;内置了支持类 解释器称为 JS 引擎&#xff0c;内置于浏览器中 ECMA 欧洲计算机制造商协会Hello world <input type"button" on…

与git相关错误的究极解决方案

没有科学上网导致的git推送和拉取错误&#xff0c;严重阻碍了搬砖进度&#xff0c;遇到的与git有关的错误&#xff1a; 1. gnutls_handshake() failed: The TLS connection was non-properly terminated. 2. Failed to connect to github.com port 443:connection timed out …

Postman 如何获取请求结果并设置到请求头中

目录1.设置环境变量2.获取token&#xff0c;并赋值给环境变量3.将环境变量添加到请求头Postman&#xff1a; 是一款用于接口调试和测试的开发工具&#xff0c;功能强大&#xff0c;使用简单。 无论是开发人员进行接口调试&#xff0c;还是测试人员做接口测试&#xff0c;Postma…

本地生活小程序有什么功能_本地生活小程序的优势

对于平台运营方 痛点&#xff1a;社区团购毛利偏低 零售行业竞争激烈&#xff0c;单纯依靠社区团购卖货整体毛利率较低 手中大量用户&#xff0c;缺少好的变现模式&#xff0c;迫切需要提升盈利能力。 优势&#xff1a;提升盈利&#xff0c;解决流量变现 本地生活属于轻资产…

8Manage:千万别忽视了供应商绩效管理

供应商绩效管理是采购管理流程中的一部分&#xff0c;现代企业几乎都会对供应商实行绩效考核。绩效管理的主要目的是了解供应商的表现、促进供应商改进&#xff0c;并为工业商奖励、供应商优化提供依据&#xff0c;以此来发现优质的供应商&#xff0c;及时改进不合格的供应商。…

Python控制自己的手机摄像头拍照,并把照片自动发送到邮箱

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 今天这个案例&#xff0c;就是控制自己的摄像头拍照&#xff0c; 并且把拍下来的照片&#xff0c;通过邮件发到自己的邮箱里。 想完成今天的这个案例&#xff0c;只要记住一个重点&#xff1a;你…

CSDN的MD编辑器【写作技巧】

CSDN的MD编辑器【写作技巧】在线LaTeX公式的编辑器快捷键&#xff0c;结合快捷键提高效率写作技巧在线LaTeX公式的编辑器 推荐去https://www.latexlive.com/在线LaTeX公式编辑器 将写好的公式代码复制过来。 然后复制在CSDN编辑器里面前后加上符合$就行了 前后加两个该符合就会…

Java环境安装即配置

一、java1.8的安装步骤 1 安装目录创建java文件夹 在想要安装java的目录下创建一个java文件夹,不能出现特殊符号和汉字、空格等 2 java文件夹内创建jdk和jre Java安装需要两部分,一个jdk一个jre 所以在java文件夹中创建两个文件夹 3 解压安装包 通过百度网盘分享的文件&#…

【论文精读3】MVSNet系列论文详解-P-MVSNet

P-MVSNet全名为“P-MVSNet: Learning Patch-wise Matching Confidence Aggregation for Multi-View Stereo”&#xff0c;名字当中反映了论文的核心模块即基于学习方法的分块匹配置信聚合模块&#xff0c;乍一看有点难理解&#xff0c;但看完本文肯定很清楚啦。 本文是MVSNet系…

mysql 数据库使用分享(多图解析)

1、大体流程 1.1 一些概念 1.1.1 RDBMS 关系型数据库&#xff0c;是指采用了关系模型来组织数据的数据库&#xff0c;其以行和列的形式存储数据&#xff0c;类似excel 1.1.2 OLAP 和 OLTP OLTP(Online transactionprocessing):在线/联机 事务 处理。主要是对数据库中的数据…

PTA:字符串加密

输入一个原始字符串&#xff08;长度小于80&#xff09;&#xff0c;然后输入一个5位的数字字符串作为加密密钥&#xff0c;对原始字符串中的每个字符根据其位置&#xff08;对5取模&#xff09;变换为加上数字字符串中的数字的字符。如输入原始字符串student&#xff0c;然后输…