Vue3 按钮根据屏幕宽度展示折叠按钮

devtools/2024/11/14 13:15:55/

文章目录

  • 一、组件封装
  • 二、使用
  • 三、最终效果(参考)
  • 四、参考

一、组件封装

ButtonFold.vue

1、获取父组件的元素,根据元素创建动态插槽
2、插槽中插入父元素标签。默认效果和初始状态相同。
3、当屏幕宽度缩小时,部分按钮通过 dropdown 的方式展示出来,doropdown 默认按钮使用 ... 图标
4、firstHideBtnIndex 边界值可自定义

<!-- 按钮折叠组件 -->
<template><template v-for="(item, index) in btns"><slot v-if="isShowBtn(index)" :name="`slot${index}`"></slot></template><a-dropdown :trigger="['click']" v-if="isShowMoreBtns()"><a-button type="text"><EllipsisOutlined /></a-button><template #overlay><a-menu><template v-for="(item, index) in btns" :key="index" ><a-menu-item class="ant-pro-drop-down menu"v-if="index >= Number(firstHideBtnIndex)"><slot :name="`slot${index}`"></slot></a-menu-item></template></a-menu></template></a-dropdown>
</template><script lang="ts" setup>javascript">
import { throttle } from 'lodash-es';
import {EllipsisOutlined,
} from '@ant-design/icons-vue';
import { useRouter } from 'vue-router';const slots = useSlots();
const router = useRouter();const btns = computed(() => slots.default?.());const firstHideBtnIndex = ref<number>(Number(btns.value?.length));btns.value?.forEach((x: any, i: number) => {Object.assign(slots, { [`slot${i}`]: () => ([x]) });
});const isShowBtn = (i: number) => {return i < Number(firstHideBtnIndex.value);
};const isShowMoreBtns = () => {return Number(firstHideBtnIndex.value) < Number(btns.value?.length);
};const foldResiez = throttle((e: any) => {setFirstBtnIndex();
}, 400);const setFirstBtnIndex = () => {if (document.body.scrollWidth < 1300 ) {firstHideBtnIndex.value = 4;} else {firstHideBtnIndex.value = Number(btns.value?.length);}
};onBeforeUpdate(() => {btns.value?.forEach((x: any, i: number) => {Object.assign(slots, { [`slot${i}`]: () => ([x]) });});setFirstBtnIndex();
});onMounted(() => {window.addEventListener('resize', foldResiez, false);
});onBeforeUnmount(() => {window.removeEventListener('resize', foldResiez, false);
});
</script><style scoped lang="scss"></style>

二、使用

  1. 当按钮较多时,在按钮外部使用 ButtonFold 组件包裹。
  2. 屏幕宽度变化在 ButtonFold 中监测
import ButtonFold from './ButtonFold.vue';<button-fold><button>1</button><button>2</button><button>3</button><button>4</button><button>5</button><button>6</button><button>7</button><button>8</button>
</button-fold>

三、最终效果(参考)

按钮折叠样式

四、参考

  1. 画面宽度发生变化,导致的按钮换行
  2. 插槽 Slots

http://www.ppmy.cn/devtools/55701.html

相关文章

怎样实现聊天弹幕效果?

可以使用HTML、CSS和JavaScript的组合。以下是一个简单的步骤和示例代码&#xff0c;说明如何创建一个基本的弹幕效果&#xff1a; HTML结构&#xff1a; 创建一个用于显示弹幕的容器和输入弹幕的表单。 <!DOCTYPE html> <html lang"en"> <hea…

SelfReg-UNet:解决UNet语义损失,增强特征一致性与减少冗余的优化模型

SelfReg-UNet&#xff1a;解决UNet语义损失&#xff0c;增强特征一致性与减少冗余的优化模型 提出背景拆解类比&#xff1a;整理书架语义一致性正则化内部特征蒸馏为什么 UNet 会有语义损失&#xff1f; 提出背景 论文&#xff1a;https://arxiv.org/pdf/2406.14896 代码&…

TIME_WAIT的危害

前言 该文章主要讨论下TIME_WAIT的存在意义和潜在危害&#xff0c;以及解决措施。 具体内容 首先看一下下面这幅图 这幅图来自《TCP IP详解卷1&#xff1a;协议 原书第2版中文》TCP状态变迁图。 TIME_WAIT存在意义 可靠的终止TCP连接。 保证让迟来的TCP报文有足够的时间被…

资信乙级预评详解:如何确保社保唯一

在资信乙级预评过程中&#xff0c;确保社保的唯一性是一个重要环节。以下是对如何确保社保唯一性的详细解释&#xff0c;按照清晰的结构进行分点表示和归纳&#xff1a; 一、了解社保唯一性的重要性 社保唯一性是指参与申请的咨询工程师在申请单位有唯一且连续的社保缴纳记录…

Snipaste--一款截屏神奇分享,桌面置顶显示截图

桌面置顶显示截图! 桌面置顶显示截图! 桌面置顶显示截图! 官网&#xff1a; https://zh.snipaste.com/ 介绍&#xff1a;Snipaste 是一个简单但强大的截图工具&#xff0c;也可以让你将截图贴回到屏幕上&#xff01;下载并打开 Snipaste&#xff0c;按下 F1 来开始截图&#xf…

使用Python实现网页数据获取与处理:以财经新闻为例

在现代数据驱动的世界中&#xff0c;获取并处理丰富的网页数据是非常重要的技能。本文将介绍如何使用Python编写一个程序&#xff0c;自动获取财经新闻数据并进行处理。这不仅可以帮助我们快速获取最新的财经信息&#xff0c;还可以为后续的数据分析和研究提供支持。 环境准备…

Nuxt3 的生命周期和钩子函数(一)

title: Nuxt3 的生命周期和钩子函数&#xff08;一&#xff09; date: 2024/6/25 updated: 2024/6/25 author: cmdragon excerpt: 摘要&#xff1a;本文是关于Nuxt3的系列文章之一&#xff0c;主要探讨Nuxt3的生命周期和钩子函数&#xff0c;引导读者深入了解其在前端开发中…

用C语言声明汇编编写的函数,是否需要带参数列表?

1.被声明的汇编函数本身有参数输入 例如&#xff0c;有如下汇编函数&#xff1a; section .text global add add: ; 假设 a 在 [ebp8]&#xff0c;b 在 [ebp12]&#xff08;这是基于 C 调用约定的典型栈布局&#xff09; mov eax, [ebp8] ; 将 a 的值加载到 eax 寄存器 add e…