文章目录
- 一、组件封装
- 二、使用
- 三、最终效果(参考)
- 四、参考
一、组件封装
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>
二、使用
- 当按钮较多时,在按钮外部使用 ButtonFold 组件包裹。
- 屏幕宽度变化在 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>
三、最终效果(参考)
四、参考
- 画面宽度发生变化,导致的按钮换行
- 插槽 Slots