采用uniapp-vue3实现, 是一款支持高度自定义的标签选择器组件,支持H5、微信小程序(其他小程序未测试过,可自行尝试)
可到插件市场下载尝试: https://ext.dcloud.net.cn/plugin?id=14960
- 使用示例
<template>
<view>
<view class="name">标签选择器组件: wo-tag</view>
<view class="card">
<view class="header">属性-基本用法(包括disabled禁用):</view>
<view class="content">
<woTag :default-value="state.defaultValue" :options="state.options" @change-select="onChangeTag">
</woTag>
</view>
</view>
<view class="card">
<view class="header">属性-行内滑动:</view>
<view class="content">
<woTag row :options="state.options" @change-select="onChangeTag">
</woTag>
</view>
</view>
<view class="card">
<view class="header">属性-多选:</view>
<view class="content">
<woTag mult :options="state.options" @change-select="onChangeTag">
</woTag>
</view>
</view>
<view class="card">
<view class="header">属性-限制选择个数:最多可选2个(开启多选的情况下可用):</view>
<view class="content">
<woTag mult :limit="2" :options="state.options" @change-select="onChangeTag">
</woTag>
</view>
</view>
<view class="card">
<view class="header">属性-自定义初始化样式和激活样式:</view>
<view class="content">
<woTag :activate-style="state.activateObj" :init-style="state.initObj" :options="state.options" @change-select="onChangeTag">
</woTag>
</view>
</view>
<view class="card">
<view class="header">插槽-自定义显示内容:</view>
<view class="content">
<woTag mult :position="'right'" :default-value="state.selectValue" :options="state.options" @change-select="onChangeTagOne">
<template v-slot:default="slotProps">
<view style="display: flex;">
<view style="padding-right: 4rpx;" v-if="state.selectValue.includes(slotProps.item.value)">✅</view>
<view style="padding-right: 4rpx;" v-else>❌</view>
<text>{{ slotProps.item.label }}</text>
</view>
</template>
</woTag>
</view>
</view>
</view>
</template>
<script setup lang="ts">
import woTag from './woTag.vue'
import { reactive } from 'vue';
const state = reactive({
options: [
{
label: '标签一',
value: 0
},
{
label: '标签二',
value: 1
},
{
label: '标签三',
value: 2
},
{
label: '标签四',
value: 3
},
{
label: '标签五',
value: 4,
disabled: true
},
{
label: '标签六',
value: 5
},
{
label: '标签七',
value: 6
},
],
defaultValue: [2],
selectValue: [2],
activateObj: {
border: '1rpx solid orange',
background: '#fff',
color: 'orange',
borderRadius: '30rpx',
padding: '8rpx 12rpx'
},
initObj: {
border: '1rpx solid #f3f3f3',
background: '#fff',
color: '#333',
borderRadius: '30rpx',
padding: '8rpx 12rpx'
}
});
const onChangeTag = (e: any) => {
console.log('选中的标签:', e);
};
const onChangeTagOne = (e: any) => {
state.selectValue = []
e.forEach(elemt => {
state.selectValue.push(elemt.value)
})
};
</script>
<style scoped>
.flex-center {
display: flex;
justify-content: center;
align-items: center;
}
.name {
font-weight: bold;
padding: 40rpx 0 10rpx 20rpx;
}
.card {
background: #f1f1f1;
margin: 40rpx 10rpx;
padding: 30rpx;
border-radius: 12rpx;
}
.header {
font-size: 26rpx;
display: flex;
align-items: center;
margin-bottom: 30rpx;
}
.content {
font-size: 24rpx;
}
</style>