vlambda博客
学习文章列表

vue-tags-input 组件使用指南

本文转载于 SegmentFault 社区




A tags input component for VueJS


前言


在开发xxx管理系统过程中,发现有多处需要用到在input输入框中输入标签的需求,于是提取关键词vue input tags搜索了相关组件,最后发现@johmun/vue-tags-input体积小,易上手,功能丰富,更能满足业务需求和后续可能的需求变更。于是总结了该组件的使用方法,方便学习和后续开发需要。





官方文档


  • http://www.vue-tags-input.com
  • https://github.com/JohMun/vue-tags-input
  • https://www.npmjs.com/package/@johmun/vue-tags-input


特点


  • 无需安装其他依赖
  • 体积小:34kb minified (css included) | gzipped 9kb
  • 快速上手
  • 添加之后可以编辑
  • 使用删除键删除标签
  • 通过粘贴添加标签
  • 钩子函数:添加之前/删除之前
  • 自定义验证规则
  • 丰富的自定义配置
  • 自定义模版
  • 自动补全
  • 文档清晰,示例丰富





安装


npm

 
   
   
 

npm install @johmun/vue-tags-input --save

CDN


通过CDN引入vue-tags-input时,会自动注册为vue全局组件。


 
   
   
 

<script ></script>




使用


基本使用

 
   
   
 

<template> <div> <vue-tags-input v-model="tag" :tags="tags" @tags-changed="newTags => tags = newTags" /> </div></template><script>import VueTagsInput from '@johmun/vue-tags-input';
export default { components: { VueTagsInput }, data() { return { // 当前编辑的标签 tag: '',
// 已添加的标签 tags: [] }; },};</script>


验证规则


添加自定义验证规则,需要设置validation属性,validation值是数组类型,每一个元素都是一个对象,包含classes和rule两个基础属性。


rule可以是正则,也可以是函数。当输入的文本匹配上对应的验证规则时,classes会被添加到标签对应的元素CSS class上。验证通过,则会自动添加ti-validCSS class,否则会自动添加ti-invalid。


默认地,验证不通过的标签也会被添加到已添加的标签数组中。如果验证规则中包含disableAdd: true属性,则验证不通过的标签不会被添加。


 
   
   
 

<template> <vue-tags-input v-model="tag" :tags="tags" :validation="validation" @tags-changed="newTags => tags = newTags" /></template><script>import VueTagsInput from '@johmun/vue-tags-input';
export default { components: { VueTagsInput, }, data() { return { // 当前编辑的标签 tag: '', // 已添加的标签 tags: [], // 验证规则 validation: [{ classes: 'min-length', rule: tag => tag.text.length < 8, }, { classes: 'no-numbers', rule: /^([^0-9]*)$/, }, { classes: 'avoid-item', rule: /^(?!Cannot).*$/, disableAdd: true, }, { classes: 'no-braces', rule: ({ text }) => text.indexOf('{') !== -1 || text.indexOf('}') !== -1 }] }; }};</script>


钩子函数


 
   
   
 

<template> <vue-tags-input v-model="tag" :tags="tags" @before-adding-tag="checkTag" @tags-changed="newTags => tags = newTags" /></template><script>import VueTagsInput from '@johmun/vue-tags-input';
export default { components: { VueTagsInput, }, data() { return { // 当前编辑的标签 tag: '',
// 已添加的标签 tags: [] }; }, methods: { checkTag(obj) { // 添加之前验证输入的文本是否包含字符'e' if (obj.tag.text.includes('e')) { // 如果包含,则显示警告提示 alert('Letter "e" is forbidden'); } else { // 如果不包含,则添加标签 obj.addTag(); } } }};</script>


属性配置



简单封装


 
   
   
 

<template> <vue-tags-input v-model.trim="tag" :tags="tags" :max-tags="maxTags" :placeholder="placeholder" :separators="separators" @before-adding-tag="beforeAddingTag" @before-deleting-tag="boforeDeletingTag" @tags-changed="newTags => $emit('update:tags', newTags)" /></template>
<script>import VueTagsInput from "@johmun/vue-tags-input";
export default { name: "BaseInputTags", components: { VueTagsInput }, props: { tags: { type: Array, default() { return []; } }, placeholder: { type: String, default: "请输入标签" }, maxTags: { type: Number, default: 100 }, beforeAddingTag: { type: Function, default: obj => obj.addTag() }, beforeDeletingTag: { type: Function, default: obj => obj.deleteTag() } }, data() { return { tag: "", separators: [";", ",", ","] }; }};</script>


调用


 
   
   
 

<template> <base-input-tags :tags.sync="tags" /></template><script> import BaseInputTags from "@/components/base/BaseInputTags" export default { components: { BaseInputTags }, data() { return { tags: [] } } }</script>


- END -