TagsInput 标签输入
新粗野主义风格的标签录入组件,基于 reka-ui 原语构建,常用于文章标签、邮件收件人、关键词筛选等表单场景。支持键盘快捷键、分隔符自动添加和多种配色变体。
预览
默认
主要
次要
强调
危险
成功
自定义 aria-label
安装
pnpm dlx brutx-vue@latest add tags-input用法
<script setup>
import { ref } from 'vue'
import {
TagsInput,
TagsInputInput,
TagsInputItem,
TagsInputItemText,
TagsInputItemDelete
} from 'brutx-ui-vue'
const tags = ref(['vue', 'css'])
</script>
<template>
<TagsInput v-model="tags">
<TagsInputItem v-for="tag in tags" :key="tag" :value="tag">
<TagsInputItemText>{{ tag }}</TagsInputItemText>
<TagsInputItemDelete />
</TagsInputItem>
<TagsInputInput placeholder="Add tag..." />
</TagsInput>
</template>变体
可以使用 TagsInputItem 的 variant 属性定制单个标签的配色方案:
| 变体 | 说明 |
|---|---|
primary | 默认珊瑚红背景,配黑色粗边框 |
secondary | 薄荷青背景 |
accent | 粗野黄色背景 |
success | 经典绿色背景 |
danger | 经典红色背景 |
default | 纯白背景 |
<template>
<TagsInputItem value="css" variant="secondary">
<TagsInputItemText>CSS</TagsInputItemText>
<TagsInputItemDelete />
</TagsInputItem>
</template>子组件
| 组件 | 说明 |
|---|---|
TagsInput | 根组件,管理标签列表状态 |
TagsInputInput | 文本输入框 |
TagsInputItem | 单个标签项容器 |
TagsInputItemText | 标签文本内容 |
TagsInputItemDelete | 标签删除按钮 |
API 参考
TagsInput
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
modelValue可空 | AcceptableInputValue[] | null | undefined | — | 受控的标签值列表,可通过 v-model 同步;每项可以是字符串、数字、bigint 或对象。 |
详情声明类型AcceptableInputValue[] | null | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInput.vue | |||
defaultValue | AcceptableInputValue[] | undefined | — | 非受控模式使用的初始标签值列表;需要从外部同步时请改用 modelValue。 |
详情声明类型AcceptableInputValue[] | undefined 默认值详情
来源packages/ui/src/components/tags-input/TagsInput.vue | |||
addOnPaste | boolean | undefined | — | 粘贴文本时按 delimiter 拆分并尝试添加标签;是否成功仍受 max 和 duplicate 限制。 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInput.vue | |||
addOnTab | boolean | undefined | — | 按 Tab 键时将当前输入提交为标签。 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInput.vue | |||
addOnBlur | boolean | undefined | — | 输入框失焦时将当前输入提交为标签。 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInput.vue | |||
duplicate | boolean | undefined | — | 允许列表中存在重复标签值;关闭时重复值会被视为无效。 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInput.vue | |||
disabled | boolean | undefined | — | 禁用标签输入组及其子项的用户交互。 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInput.vue | |||
delimiter | string | RegExp | undefined | — | 用于提交输入和拆分粘贴内容的分隔符;可以传入单个字符串或正则表达式。 |
详情声明类型string | RegExp | undefined 默认值详情
来源packages/ui/src/components/tags-input/TagsInput.vue | |||
dir | Direction | undefined | — | 设置组合框内容的阅读方向;未指定时继承 ConfigProvider 配置,否则按从左到右处理。 |
详情声明类型Direction | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInput.vue | |||
max | number | undefined | — | 允许的最大标签数量;达到上限后不再添加标签并发出 invalid,设为 0 表示不限制。 |
详情声明类型number | undefined 默认值详情
来源packages/ui/src/components/tags-input/TagsInput.vue | |||
id | string | undefined | — | 传递给标签输入根原语的 DOM ID,用于标识该输入组。 |
详情声明类型string | undefined 默认值详情
来源packages/ui/src/components/tags-input/TagsInput.vue | |||
convertValue | ((value: string) => AcceptableInputValue) | undefined | — | 将输入字符串转换为标签值的函数;使用对象标签并通过 TagsInputInput 输入时必须提供。 |
详情声明类型((value: string) => AcceptableInputValue) | undefined 默认值详情
来源packages/ui/src/components/tags-input/TagsInput.vue | |||
displayValue | ((value: AcceptableInputValue) => string) | undefined | — | 将标签值转换为显示文本;适用于对象标签或需要添加后缀等展示格式的场景。 |
详情声明类型((value: AcceptableInputValue) => string) | undefined 默认值详情
来源packages/ui/src/components/tags-input/TagsInput.vue | |||
asChild | boolean | undefined | — | 将组件的属性与交互行为合并到唯一子元素上,并由该子元素替代默认渲染元素。 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInput.vue | |||
as | AsTag | Component | undefined | — | 指定此标签输入子组件使用的 HTML 标签或 Vue 组件;与 asChild 同时设置时由 asChild 决定渲染元素。 |
详情声明类型AsTag | Component | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInput.vue | |||
name | string | undefined | — | 表单字段名;提交所属表单时,标签值会以此名称参与表单数据提交。 |
详情声明类型string | undefined 默认值详情
来源packages/ui/src/components/tags-input/TagsInput.vue | |||
required | boolean | undefined | — | 将标签输入标记为所属表单的必填字段。 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInput.vue | |||
class | string | undefined | — | 追加到标签输入根容器的 CSS 类。 |
详情声明类型string | undefined 默认值详情
来源packages/ui/src/components/tags-input/TagsInput.vue | |||
ariaLabel | string | undefined | — | 标签输入组的无障碍名称;未提供时使用当前语言的 tagsInput.label 文案。 |
详情声明类型string | undefined 默认值详情
来源packages/ui/src/components/tags-input/TagsInput.vue | |||
| 名称 | 签名或类型 | 说明 |
|---|---|---|
@update:modelValue | [payload: AcceptableInputValue[]] | 标签列表变化时发出新数组,用于同步受控 v-model。 |
详情声明类型[payload: AcceptableInputValue[]] 来源packages/ui/src/components/tags-input/TagsInput.vue | ||
@invalid | [payload: AcceptableInputValue] | 尝试添加重复值或超过 max 上限的标签时发出被拒绝的标签值。 |
详情声明类型[payload: AcceptableInputValue] 来源packages/ui/src/components/tags-input/TagsInput.vue | ||
@addTag | [payload: AcceptableInputValue] | 成功添加标签后发出新增的标签值。 |
详情声明类型[payload: AcceptableInputValue] 来源packages/ui/src/components/tags-input/TagsInput.vue | ||
@removeTag | [payload: AcceptableInputValue] | 成功移除标签后发出被移除的标签值。 |
详情声明类型[payload: AcceptableInputValue] 来源packages/ui/src/components/tags-input/TagsInput.vue | ||
| 名称 | 签名或类型 | 说明 |
|---|---|---|
#default | {} | 组合标签项和输入框的内容;作用域中提供当前 modelValue,通常放置 TagsInputItem 与 TagsInputInput。 |
详情声明类型{}来源packages/ui/src/components/tags-input/TagsInput.vue | ||
TagsInputInput
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
placeholder | string | undefined | — | 输入框为空时显示的占位文本。 |
详情声明类型string | undefined 默认值详情
来源packages/ui/src/components/tags-input/TagsInputInput.vue | |||
autoFocus | boolean | undefined | — | 组件挂载后自动将焦点移到输入框。 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInputInput.vue | |||
maxLength | number | undefined | — | 限制输入框中可输入的字符数。 |
详情声明类型number | undefined 默认值详情
来源packages/ui/src/components/tags-input/TagsInputInput.vue | |||
asChild | boolean | undefined | — | 将组件的属性与交互行为合并到唯一子元素上,并由该子元素替代默认渲染元素。 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInputInput.vue | |||
as | AsTag | Component | undefined | — | 指定此标签输入子组件使用的 HTML 标签或 Vue 组件;与 asChild 同时设置时由 asChild 决定渲染元素。 |
详情声明类型AsTag | Component | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInputInput.vue | |||
class | string | undefined | — | 追加到标签输入原生输入元素的 CSS 类。 |
详情声明类型string | undefined 默认值详情
来源packages/ui/src/components/tags-input/TagsInputInput.vue | |||
TagsInputItem
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
variant | "accent" | "danger" | "default" | "primary" | "secondary" | "success" | undefined | "primary" | 设置单个标签的配色变体。 |
详情声明类型NonNullable<"default" | "primary" | "secondary" | "success" | "danger" | "accent" | null | undefined> | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInputItem.vue | |||
class | string | undefined | undefined | 追加到单个标签容器的 CSS 类。 |
详情声明类型string | undefined 默认值详情
来源packages/ui/src/components/tags-input/TagsInputItem.vue | |||
value必填 | AcceptableInputValue | — | 此标签对应的值,必须与根组件标签列表中的一项匹配。 |
详情声明类型AcceptableInputValue 默认值详情
来源packages/ui/src/components/tags-input/TagsInputItem.vue | |||
disabled | boolean | undefined | — | 禁止对此标签执行交互操作。 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInputItem.vue | |||
asChild | boolean | undefined | — | 将组件的属性与交互行为合并到唯一子元素上,并由该子元素替代默认渲染元素。 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInputItem.vue | |||
as | AsTag | Component | undefined | — | 指定此标签输入子组件使用的 HTML 标签或 Vue 组件;与 asChild 同时设置时由 asChild 决定渲染元素。 |
详情声明类型AsTag | Component | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInputItem.vue | |||
| 名称 | 签名或类型 | 说明 |
|---|---|---|
#default | {} | 渲染标签项内容,通常包含 TagsInputItemText 和 TagsInputItemDelete。 |
详情声明类型{}来源packages/ui/src/components/tags-input/TagsInputItem.vue | ||
TagsInputItemDelete
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
class | string | undefined | undefined | 追加到标签删除按钮的 CSS 类。 |
详情声明类型string | undefined 默认值详情
来源packages/ui/src/components/tags-input/TagsInputItemDelete.vue | |||
ariaLabel | string | undefined | undefined | 删除按钮的无障碍名称;未提供时使用当前语言的默认删除文案。 |
详情声明类型string | undefined 默认值详情
来源packages/ui/src/components/tags-input/TagsInputItemDelete.vue | |||
type | "button" | "submit" | "reset" | undefined | "button" | 设置原生按钮类型,默认 button 可避免在表单中误触发提交。 |
详情声明类型"button" | "submit" | "reset" | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInputItemDelete.vue | |||
asChild | boolean | undefined | — | 将组件的属性与交互行为合并到唯一子元素上,并由该子元素替代默认渲染元素。 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInputItemDelete.vue | |||
as | AsTag | Component | undefined | — | 指定此标签输入子组件使用的 HTML 标签或 Vue 组件;与 asChild 同时设置时由 asChild 决定渲染元素。 |
详情声明类型AsTag | Component | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInputItemDelete.vue | |||
| 名称 | 签名或类型 | 说明 |
|---|---|---|
#default | {} | 自定义删除按钮内容;未提供时显示 X 图标。 |
详情声明类型{}来源packages/ui/src/components/tags-input/TagsInputItemDelete.vue | ||
TagsInputItemText
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
asChild | boolean | undefined | — | 将组件的属性与交互行为合并到唯一子元素上,并由该子元素替代默认渲染元素。 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInputItemText.vue | |||
as | AsTag | Component | undefined | — | 指定此标签输入子组件使用的 HTML 标签或 Vue 组件;与 asChild 同时设置时由 asChild 决定渲染元素。 |
详情声明类型AsTag | Component | undefined 字面量
默认值详情
来源packages/ui/src/components/tags-input/TagsInputItemText.vue | |||
class | string | undefined | — | 追加到标签文本元素的 CSS 类。 |
详情声明类型string | undefined 默认值详情
来源packages/ui/src/components/tags-input/TagsInputItemText.vue | |||
| 名称 | 签名或类型 | 说明 |
|---|---|---|
#default | {} | 渲染标签的文本内容。 |
详情声明类型{}来源packages/ui/src/components/tags-input/TagsInputItemText.vue | ||
可访问性
- ARIA 属性:TagsInput 默认通过 locale 提供
aria-label(中文为"标签输入"),未提供时回退到t('tagsInput.label') - 自定义标签:当需要更具体的描述(如"文章标签"、"收件人")时,可通过
ariaLabelprop 自定义
<script setup>
import { ref } from 'vue'
import {
TagsInput,
TagsInputInput,
TagsInputItem,
TagsInputItemText,
TagsInputItemDelete
} from 'brutx-ui-vue'
const tags = ref(['vue', 'css'])
</script>
<template>
<TagsInput v-model="tags" aria-label="文章标签">
<TagsInputItem v-for="tag in tags" :key="tag" :value="tag">
<TagsInputItemText>{{ tag }}</TagsInputItemText>
<TagsInputItemDelete />
</TagsInputItem>
<TagsInputInput placeholder="添加标签..." />
</TagsInput>
</template>常见问题
Q: 如何使用对象作为标签值而非字符串?
A: 当标签值为对象时,必须提供 convertValue 函数将输入字符串转换为目标对象类型,同时建议提供 displayValue 函数来自定义标签的显示文本。如果未提供 convertValue,组件将使用字符串作为标签值。
Q: 为什么设置了 max 属性后添加标签没有反应?
A: 当标签数量达到 max 限制时,新标签不会被添加,同时会触发 invalid 事件。可以通过监听该事件来向用户展示提示信息。如果 max 设为 0,则表示不限制标签数量。
Q: 粘贴多个标签时如何自动拆分?
A: 设置 addOnPaste 为 true 后,粘贴包含分隔符的文本时会自动拆分为多个标签。默认分隔符为逗号(,),可通过 delimiter 属性自定义,支持字符串和正则表达式。例如设置 delimiter=";" 可以按分号拆分。