Skip to content

FilterTabs 过滤器选项卡

此组件通常用于数据筛选场景,通常会有多个选项卡,由于数据筛选场景各不相同,有的是可以多选,有的单选,有的还需要排序,所以此组件只提供样式,具体的逻辑还需用户自行处理。

基础使用

  • 通过 list 属性设置选项卡数据。
  • 通过 value 属性设置激活项值,value 可以是字符串、数字、数组,一般字符串、数字用于单选,数组用于多选。
  • 通过 keyName 属性设置数据中显示文本的字段名。
  • 通过 valueName 属性设置绑定值字段的字段名。
vue
<template>
    <hi-filter-tabs :list="list" keyName="label" valueName="value" :value="values" @itemClick="handleItemClick"></hi-filter-tabs>
</template>

<script setup>
    import { ref } from 'vue';

    // 选项卡数据
    // 所有属性都为可选,为空则不显示或不设置
    /// icon: 图标。
    /// activeIcon: 选中时的图标
    /// label: 显示文本
    /// disabled: 是否禁用。
    /// hover: 选项点击态类名
    /// classes: 选项类名
    /// activeClasses: 选项激活态类名
    /// styles: 选项样式
    /// activeStyles: 选项激活态样式
    const list = ref([
        { value: "1", label: "最新", disabled: false, icon: "", activeIcon: "", hover: "hi-hover", classes: "", activeClasses: "", styles: "", activeStyles: "" },
        { value: "2", label: "价格", disabled: false, icon: "", activeIcon: "", hover: "hi-hover", classes: "", activeClasses: "", styles: "", activeStyles: "" },
        { value: "3", label: "销量", disabled: false, icon: "", activeIcon: "", hover: "hi-hover", classes: "", activeClasses: "", styles: "", activeStyles: "" },
        { value: "4", label: "好评", disabled: false, icon: "", activeIcon: "", hover: "hi-hover", classes: "", activeClasses: "", styles: "", activeStyles: "" },
    ]);

    // 激活项下标
    const values = ref(["1", "2"]);

    // 选项点击事件
    function handleItemClick(item, index) {
        if(values.value.includes(item.value)) {
            values.value.splice(values.value.indexOf(item.value), 1);
        } else {
            values.value.push(item.value);
        }
    }
</script>

右侧固定项

此组件可以通过 right 属性设置右侧固定项,数据结构如下:。

vue
<template>
    <hi-filter-tabs :right="rightMenus" @rightClick="handleRightClick"></hi-filter-tabs>
</template>

<script setup>
    import { ref } from 'vue';

    // 右侧固定菜单数据
    // 所有属性都为可选,为空则不显示或不设置
    /// icon: 图标。
    /// label: 显示文本
    /// disabled: 是否禁用。
    /// hover: 选项点击态类名
    /// classes: 选项类名
    /// styles: 选项样式
    const rightMenus = ref([
        { label: "筛选", disabled: false, icon: "filter",  hover: "hi-hover", classes: "",  styles: "" },
    ]);

    // 右侧菜单点击事件
    function onRightClick(item, index) {
        console.log(item, index);
    }
</script>

等分布局

通过 equal 属性设置是否等分选项卡进行布局。
等分布局通常来说就是选项的宽度相同,选项的内容居中展示。

vue
<hi-filter-tabs :list="list" :value="values" equal></hi-filter-tabs>

两端对齐

通过 justify 属性设置是否两端对齐选项卡进行布局。
两端对齐布局通常来说就是选项靠两侧进行对齐,选项之间的间隔相同。

vue
<hi-filter-tabs :list="list" :value="values" justify></hi-filter-tabs>

Props

属性名说明类型默认值可选值版本
hover指定选项按下去的样式类Stringhi-hover--
list选项卡数据Array<Object>[]--
value选中项的值[String, Number, Array]undefined--
keyName显示文字的字段名Stringlabel--
valueName绑定值值字段名Stringvalue--
right右侧固定菜单数据Array<Object>[]--
equal是否等分布局Booleanfalsetrue-
justify是否两端对齐布局Booleanfalsetrue-
color组件文字颜色String---
activeColor激活项文字颜色String---
fontSize组件文字大小String---
activeFontSize激活项文字大小String---
fontWeight组件文字粗细String---
activeFontWeight激活项文字粗细String---
bg组件背景String---
radius组件圆角String---
gap选项间距String---
itemPadding选项内边距String---
itemBg选项背景String---
activeItemBg激活项背景String---
itemStyle选项样式[String, Object, Array]---
activeItemStyle激活项样式[String, Object, Array]---
iconColor图标颜色String---
activeIconColor激活项图标颜色String---
iconSize图标大小String---
activeIconSize激活项图标大小String---

Event

事件名说明回调参数版本
itemClick选项点击事件item: 选项数据。index: 选项索引。-
rightClick右键固定菜单点击事件item: 菜单项数据。index: 菜单项索引。-

Slots

名称说明参数版本
item选项插槽-item: 选项数据。index: 选项索引。
rightItem右侧选项插槽-item: 选项数据。index: 选项索引。

样式变量

组件提供了以下样式变量,可以在使用时设置这些变量来修改组件的样式。

变量名默认值版本
--hi-filter-tabs-backgroundnone-
--hi-filter-tabs-border-radius0-
--hi-filter-tabs-displayflex-
--hi-filter-tabs-flex-directionrow-
--hi-filter-tabs-align-itemsstretch-
--hi-filter-tabs-gap0-
--hi-filter-tabs-width100%-
--hi-filter-tabs-height3em-
--hi-filter-tabs-text-aligncenter-
--hi-filter-tabs-colorinherit-
--hi-filter-tabs-active-colorvar(--hi-theme-primary)-
--hi-filter-tabs-font-sizeinherit-
--hi-filter-tabs-active-font-size--
--hi-filter-tabs-font-weightinherit-
--hi-filter-tabs-active-font-weight--
--hi-filter-tabs-left-flex1-
--hi-filter-tabs-left-overflowhidden-
--hi-filter-tabs-left-positionrelative-
--hi-filter-tabs-scroll-white-spacenowrap-
--hi-filter-tabs-scroll-height100%-
--hi-filter-tabs-scroll-content-height100%-
--hi-filter-tabs-scroll-content-displayflex-
--hi-filter-tabs-scroll-content-flex-wrapnowrap-
--hi-filter-tabs-scroll-content-white-spacenowrap-
--hi-filter-tabs-scroll-content-width100%-
--hi-filter-tabs-items-displayflex-
--hi-filter-tabs-items-gap15px-
--hi-filter-tabs-items-width100%-
--hi-filter-tabs-items-height100%-
--hi-filter-tabs-items-flex-wrapnowrap-
--hi-filter-tabs-items-white-spacenowrap-
--hi-filter-tabs-items-flex-directionrow-
--hi-filter-tabs-items-justify-contentflex-start / space-between-
--hi-filter-tabs-item-gap2px-
--hi-filter-tabs-item-positionrelative-
--hi-filter-tabs-item-displayflex-
--hi-filter-tabs-item-flex-directionrow-
--hi-filter-tabs-item-align-itemscenter-
--hi-filter-tabs-item-justify-contentcenter-
--hi-filter-tabs-item-transition100ms-
--hi-filter-tabs-item-flex-shrink0-
--hi-filter-tabs-item-backgroundnone-
--hi-filter-tabs-item-active-background--
--hi-filter-tabs-item-padding0 5px-
--hi-filter-tabs-item-flexnone / 1-
--hi-filter-tabs-item-widthauto-
--hi-filter-tabs-item-icon-colorinherit-
--hi-filter-tabs-item-active-icon-color--
--hi-filter-tabs-item-icon-font-size1.25em-
--hi-filter-tabs-item-active-icon-font-size--
--hi-filter-tabs-right-flex-shrink0-
--hi-filter-tabs-right-displayflex-
--hi-filter-tabs-right-align-itemscenter-
--hi-filter-tabs-right-font-sizeinherit-
--hi-filter-tabs-right-font-weightinherit-
--hi-filter-tabs-right-colorinherit-
--hi-filter-tabs-right-gap10px-

基于 MIT 许可发布