フォームタグ

カスタマイズ可能なインターフェースレンダリング、重複タグ検出、オプションのタグ検証機能を備えた、軽量なカスタムタグ付き入力フォームコントロール。

BootstrapVue v2.2.0以降で使用可能

タグは短い文字列の配列であり、カテゴリの割り当てなど、さまざまな方法で使用されます。デフォルトのユーザーインターフェースを使用するか、デフォルトのスコープ付きスロットを使用して独自のインターフェースを作成します。

基本的な使用方法

タグの先頭と末尾の空白は削除され、重複したタグは許可されません。スペースを含むタグはデフォルトで許可されます。

タグは、追加ボタンをクリックするか、Enterキーを押すか、または新しいタグ入力でchangeイベントが発生した場合(つまり、入力からフォーカスが移動した場合)にオプションで追加されます。追加ボタンは、ユーザーが新しいタグ値を入力した場合にのみ表示されます。

デフォルトのレンダリング

<template>
  <div>
    <label for="tags-basic">Type a new tag and press enter</label>
    <b-form-tags input-id="tags-basic" v-model="value"></b-form-tags>
    <p class="mt-2">Value: {{ value }}</p>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        value: ['apple', 'orange']
      }
    }
  }
</script>

<!-- form-tags-example.vue -->

no-add-on-enterプロパティを使用して、Enterキーを押したときに新しいタグの追加を無効にし、add-on-changeプロパティを使用して、入力のchangeイベントでタグの追加を有効にすることができます。

セパレータを使用したタグの作成

セパレータ文字が入力されたときにタグを自動的に作成するには(例:Space,など)、separatorプロパティにタグの追加をトリガーする文字を設定します。複数のセパレータ文字が必要な場合は、単一の文字列(例:' ,;')または文字の配列(例:[' ', ',', ';'])として含めます。Space,、または;が入力されると、新しいタグが追加されます。セパレータは1文字でなければなりません。

次の例では、Space,、または;が入力されると、タグが自動的に作成されます。

<template>
  <div>
    <label for="tags-separators">Enter tags separated by space, comma or semicolon</label>
    <b-form-tags
      input-id="tags-separators"
      v-model="value"
      separator=" ,;"
      placeholder="Enter new tags separated by space, comma or semicolon"
      no-add-on-enter
    ></b-form-tags>
    <p class="mt-2">Value: {{ value }}</p>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        value: ['one', 'two']
      }
    }
  }
</script>

<!-- form-tags-separator.vue -->

Backspaceキーによる最後のタグの削除

remove-on-deleteプロパティが設定され、ユーザーがBackspace(またはDel)キーを押し、入力値が空の場合、タグリストの最後のタグが削除されます。

<template>
  <div>
    <label for="tags-remove-on-delete">Enter new tags separated by space</label>
    <b-form-tags
      input-id="tags-remove-on-delete"
      :input-attrs="{ 'aria-describedby': 'tags-remove-on-delete-help' }"
      v-model="value"
      separator=" "
      placeholder="Enter new tags separated by space"
      remove-on-delete
      no-add-on-enter
    ></b-form-tags>
    <b-form-text id="tags-remove-on-delete-help" class="mt-2">
      Press <kbd>Backspace</kbd> to remove the last tag entered
    </b-form-text>
    <p>Value: {{ value }}</p>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        value: ['apple', 'orange', 'grape']
      }
    }
  }
</script>

<!-- form-tags-remove-on-delete.vue -->

スタイルオプション

デフォルトのタグ付きインターフェースの基本的なスタイルを変更するためのいくつかのプロパティがあります。

プロパティ 説明
tag-pills タグをピルの外観でレンダリングします。
tag-variant Bootstrapのコンテキストバリアントテーマカラーのいずれかをタグに適用します。
size コンポーネントの外観のサイズを設定します。'sm'、'md'(デフォルト)、または'lg'
placeholder 新しいタグ入力要素のプレースホルダーテキスト。
state コントロールのコンテキスト状態を設定します。true(有効の場合)、false(無効の場合)、またはnull
disabled コンポーネントを無効な状態にします。

追加のプロパティについては、このページの下部にあるコンポーネントリファレンスセクションを参照してください。

コンポーネントのフォーカスと検証状態のスタイルは、BootstrapVueのカスタムCSSに依存しています。

<template>
  <div>
    <label for="tags-pills">Enter tags</label>
    <b-form-tags
      input-id="tags-pills"
      v-model="value"
      tag-variant="primary"
      tag-pills
      size="lg"
      separator=" "
      placeholder="Enter new tags separated by space"
    ></b-form-tags>
    <p class="mt-2">Value: {{ value }}</p>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        value: ['apple', 'orange', 'grape']
      }
    }
  }
</script>

<!-- form-tags-style-options.vue -->

ネイティブブラウザの<form>送信との使用

nameプロパティを指定しない限り、タグ付き入力の値は標準的なフォームactionを介して送信されません。nameが指定されている場合、<b-form-tags>は各タグに対して非表示の<input>を作成します。非表示の入力には、name属性にnameプロパティの値が設定されます。

非表示の入力は、カスタムレンダリングを使用する場合にも生成されます(nameプロパティが設定されている場合)。

タグ検証

デフォルトでは、<b-form-tags>はユーザーが(大文字と小文字を区別する)重複タグを入力しようとしているかどうかを検出し、ユーザーに統合されたフィードバックを提供します。

tag-validatorプロパティを介して、タグ検証メソッドをオプションで提供できます。検証関数は、追加されるタグを1つの引数として受け取り、タグが検証に合格して追加できる場合はtrueを、検証に失敗した場合(その場合はタグが配列に追加されない)はfalseを返します。追加できなかった無効なタグをリストする、統合されたフィードバックがユーザーに提供されます。

タグ検証は、ユーザー入力によって追加されたタグに対してのみ行われます。v-modelによるタグの変更は検証されません。

<template>
  <div>
    <b-form-group label="Tags validation example" label-for="tags-validation" :state="state">
      <b-form-tags
        input-id="tags-validation"
        v-model="tags"
        :input-attrs="{ 'aria-describedby': 'tags-validation-help' }"
        :tag-validator="tagValidator"
        :state="state"
        separator=" "
      ></b-form-tags>

      <template #invalid-feedback>
        You must provide at least 3 tags and no more than 8
      </template>

      <template #description>
        <div id="tags-validation-help">
         Tags must be 3 to 5 characters in length and all lower
         case. Enter tags separated by spaces or press enter.
        </div>
      </template>
    </b-form-group>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        tags: [],
        dirty: false
      }
    },
    computed: {
      state() {
        // Overall component validation state
        return this.dirty ? (this.tags.length > 2 && this.tags.length < 9) : null
      }
    },
    watch: {
      tags(newValue, oldValue) {
        // Set the dirty flag on first change to the tags array
        this.dirty = true
      }
    },
    methods: {
      tagValidator(tag) {
        // Individual tag validator function
        return tag === tag.toLowerCase() && tag.length > 2 && tag.length < 6
      }
    }
  }
</script>

<!-- b-form-tags-validation-feedback.vue -->

新規、無効、および重複タグの検出

新しいタグ入力要素に新しいタグが入力された場合、検証に合格しなかったタグ、または重複タグが検出された場合、tag-stateイベントが送信されます。イベントハンドラーは、3つの配列を引数として受け取ります。

  • validTags(検証に合格したタグ)
  • invalidTags(検証に合格しなかったタグ)
  • duplicateTags(既存のvalidTagsの複製となるタグ)

このイベントは、新しいタグ入力の変更時(タグの一部と見なされる文字が入力された場合)、またはユーザーがタグの追加を試みた場合(つまり、Enterキー、追加ボタンのクリック、またはセパレータの入力)のみに送信されます。ユーザーが新しいタグ入力要素をクリアした場合(またはスペースのみが含まれている場合)、3つの配列は空になります。

<b-form-tags>コンポーネントの外側で重複タグと無効タグに対する独自のフィードバックを提供している場合(tag-stateイベントを使用)、duplicate-tag-textおよびinvalid-tag-textプロパティ(それぞれ)を空文字列('')またはnullに設定することで、組み込みの重複メッセージと無効メッセージを無効にすることができます。

<template>
  <div>
    <label for="tags-state-event">Enter tags</label>
    <b-form-tags
      input-id="tags-state-event"
      v-model="tags"
      :tag-validator="validator"
      placeholder="Enter tags (3-5 characters) separated by space"
      separator=" "
      @tag-state="onTagState"
    ></b-form-tags>
    <p class="mt-2">Tags: {{ tags }}</p>
    <p>Event values:</p>
    <ul>
        <li>validTags: {{ validTags }}</li>
        <li>invalidTags: {{ invalidTags }}</li>
        <li>duplicateTags: {{ duplicateTags }}</li>
    </ul>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        tags: [],
        validTags: [],
        invalidTags: [],
        duplicateTags: []
      }
    },
    methods: {
      onTagState(valid, invalid, duplicate) {
        this.validTags = valid
        this.invalidTags = invalid
        this.duplicateTags = duplicate
      },
      validator(tag) {
        return tag.length > 2 && tag.length < 6
      }
    }
  }
</script>

<!-- b-form-tags-tags-state-event.vue -->

タグの制限

ユーザーが追加できるタグの数を制限する場合は、limitプロパティを使用します。設定されている場合、limitで許可されている数を超えるタグを追加できるのは、v-modelを使用する場合のみです。

タグの制限に達すると、ユーザーは入力できますが、タグの追加は無効になります。制限に達したことをユーザーに知らせるメッセージが表示されます。このメッセージはlimit-tags-textプロパティで設定できます。空文字列('')またはnullに設定すると、フィードバックが無効になります。

タグの削除は、limitプロパティの影響を受けません。

<template>
  <div>
    <label for="tags-limit">Enter tags</label>
    <b-form-tags input-id="tags-limit" v-model="value" :limit="limit" remove-on-delete></b-form-tags>
    <p class="mt-2">Value: {{ value }}</p>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        value: [],
        limit: 5
      }
    }
  }
</script>

<!-- b-form-tags-limit.vue -->

デフォルトのスコープ付きスロットを使用したカスタムレンダリング

タグコントロールの外観を変更したい場合は、デフォルトのスコープ付きスロットを使用して独自のカスタムレンダリングを提供できます。独自のタグを作成するか、ヘルパーコンポーネント<b-form-tag>を使用できます。

スコーププロパティ

デフォルトのスコープ付きスロットは、カスタムインターフェースのレンダリングに使用できる多数のプロパティとメソッドを提供します。インターフェースを生成するために、すべてプロパティまたはメソッドが必要なわけではありません。

デフォルトのスロットスコーププロパティは次のとおりです。

プロパティ 説明
addButtonText 文字列 add-button-textプロパティの値
addButtonVariant 文字列 add-button-variantプロパティの値
addTag 関数 新規タグを追加するメソッド。タグは入力値を想定していますが、追加するタグ値を1つの引数としてオプションで受け付けます。
disableAddButton ブール値 入力されたタグ(すべて無効または重複)を追加できない場合、trueになります。
disabled ブール値 コンポーネントが無効状態の場合truedisabledプロパティの値。
duplicateTagText 文字列 duplicate-tag-textプロパティの値。
duplicateTags 配列 ユーザーが入力した重複タグの配列。
form 文字列 v2.20.0+ formプロパティの値。
inputAttrs オブジェクト v-bind="inputAttrs" を介して新しいタグ入力要素に適用する属性のオブジェクト。詳細は下記参照。
inputHandlers オブジェクト v-on="inputHandlers" を介して新しいタグ入力要素に適用するイベントハンドラのオブジェクト。詳細は下記参照。
inputId 文字列 新しいタグ入力要素に追加するID。デフォルトはプロパティinput-id。指定されていない場合は、一意のIDが自動生成されます。'inputAttrs.id'からも利用可能です。
inputType 文字列 v2.3.0+ レンダリングする入力の種類(プロパティinput-typeの正規化されたバージョン)。
invalidTagText 文字列 invalid-tag-textプロパティの値。
invalidTags 配列 ユーザーが入力した無効なタグの配列。
isDuplicate ブール値 ユーザー入力が重複タグを含む場合true
isInvalid ブール値 ユーザー入力が無効なタグを含む場合true
isLimitReached ブール値 v2.17.0+ limitが設定されていて、タグ数が制限に達した場合true
limitTagsText 文字列 v2.17.0+ limit-tags-textプロパティの値。
limit 文字列 v2.17.0+ limitプロパティの値。
noTagRemove ブール値 v2.21.0+ no-tag-removeプロパティの値。
placeholder 文字列 placeholderプロパティの値。
removeTag 関数 タグを削除するメソッド。削除するタグ値を1つの引数として受け付けます。
required ブール値 v2.20.0+ requiredプロパティの値。
separator 文字列 separatorプロパティの値。
size 文字列 sizeプロパティの値。
state ブール値 コンポーネントのコンテキスト状態。stateプロパティの値。可能な値はtruefalse、またはnull
tagClass 文字列、配列、またはオブジェクト tag-variantプロパティの値。タグ要素に適用するクラス(またはクラスの集合)。
tagPills ブール値 tag-pillsプロパティの値。
tagRemoveLabel 文字列 tag-remove-labelプロパティの値。タグの削除ボタンのaria-label属性として使用されます。
tagVariant 文字列 tag-variantプロパティの値。
tags 配列 現在のタグ文字列の配列。

inputAttrsオブジェクトのプロパティ

inputAttrsオブジェクトには、新しいタグ入力要素にバインドする属性(v-bind)が含まれています。

プロパティ 説明
disabled ブール値 新しいタグ入力に対するdisabled属性。disabledプロパティの値。
form 文字列 新しいタグ入力に対するform属性。formプロパティの値。
id 文字列 新しいタグ入力に対するid属性。
value 文字列 新しいタグ入力に対するvalue属性。

inputAttrsオブジェクトには、input-attrsプロパティで設定された属性も含まれます。ただし、上記の属性はinput-attrsプロパティで指定された同じ属性よりも優先されます。

inputHandlersオブジェクトのプロパティ

inputHandlersオブジェクトには、新しいタグ入力要素にバインドするイベントハンドラ(v-on)が含まれています。

プロパティ 説明
change 関数 入力要素のchangeイベントのイベントハンドラ。イベントオブジェクトまたは文字列のいずれかの単一引数を受け付けます。変更により、タグの追加がトリガーされます。
input 関数 入力要素のinputイベントのイベントハンドラ。イベントオブジェクトまたは文字列のいずれかの単一引数を受け付けます。新しいタグ入力要素の内部v-modelを更新します。
keydown 関数 入力要素のkeydown Enter および Del イベントのイベントハンドラ。ネイティブのkeydownイベントオブジェクトを単一引数として受け付けます。

必要な場合、changeハンドラはadd-on-changeプロパティを介して有効にする必要があります。そうでない場合は、noopメソッドになります。

ネイティブブラウザ入力の使用

このスコープには、ネイティブの<input>または<select>要素に直接バインドできる属性とイベントハンドラが含まれています。

次の例には、スクリーンリーダーのサポートに必要な推奨されるARIA属性とロールが含まれています。

<template>
  <div>
    <b-form-tags v-model="value" no-outer-focus class="mb-2">
      <template v-slot="{ tags, inputAttrs, inputHandlers, addTag, removeTag }">
        <b-input-group aria-controls="my-custom-tags-list">
          <input
            v-bind="inputAttrs"
            v-on="inputHandlers"
            placeholder="New tag - Press enter to add"
            class="form-control">
          <b-input-group-append>
            <b-button @click="addTag()" variant="primary">Add</b-button>
          </b-input-group-append>
        </b-input-group>
        <ul
          id="my-custom-tags-list"
          class="list-unstyled d-inline-flex flex-wrap mb-0"
          aria-live="polite"
          aria-atomic="false"
          aria-relevant="additions removals"
        >
          <!-- Always use the tag value as the :key, not the index! -->
          <!-- Otherwise screen readers will not read the tag
               additions and removals correctly -->
          <b-card
            v-for="tag in tags"
            :key="tag"
            :id="`my-custom-tags-tag_${tag.replace(/\s/g, '_')}_`"
            tag="li"
            class="mt-1 mr-1"
            body-class="py-1 pr-2 text-nowrap"
          >
            <strong>{{ tag }}</strong>
            <b-button
              @click="removeTag(tag)"
              variant="link"
              size="sm"
              :aria-controls="`my-custom-tags-tag_${tag.replace(/\s/g, '_')}_`"
            >remove</b-button>
          </b-card>
        </ul>
      </template>
    </b-form-tags>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        value: ['apple', 'orange', 'banana', 'pear', 'peach']
      }
    }
  }
</script>

<!-- form-tags-custom-native.vue -->

カスタムフォームコンポーネントの使用

このスコープには、ほとんどのカスタム入力またはセレクトコンポーネントに直接バインドできる属性とイベントハンドラが含まれています(イベントハンドラは、文字列のタグ値またはネイティブのイベントオブジェクトのいずれかを受け付けます)。文字が入力されるとinputを、入力値が変更されると(例:フォーカスを外す時、選択時)changeを発行し、valueプロパティをv-modelとして使用するコンポーネントは、変更せずに動作するはずです。

この例では、<b-form-tag>ヘルパーコンポーネントを使用していますが、標準のHTMLまたはコンポーネントを使用してタグを自由にレンダリングできます。

<template>
  <div>
    <b-form-tags v-model="value" no-outer-focus class="mb-2">
      <template v-slot="{ tags, inputAttrs, inputHandlers, tagVariant, addTag, removeTag }">
        <b-input-group class="mb-2">
          <b-form-input
            v-bind="inputAttrs"
            v-on="inputHandlers"
            placeholder="New tag - Press enter to add"
            class="form-control"
          ></b-form-input>
          <b-input-group-append>
            <b-button @click="addTag()" variant="primary">Add</b-button>
          </b-input-group-append>
        </b-input-group>
        <div class="d-inline-block" style="font-size: 1.5rem;">
          <b-form-tag
            v-for="tag in tags"
            @remove="removeTag(tag)"
            :key="tag"
            :title="tag"
            :variant="tagVariant"
            class="mr-1"
          >{{ tag }}</b-form-tag>
        </div>
      </template>
    </b-form-tags>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        value: ['apple', 'orange', 'banana']
      }
    }
  }
</script>

<!-- form-tags-custom-components-input.vue -->

これは、事前に定義されたタグセットから選択するためのカスタムセレクトコンポーネントを使用する例です。

<template>
  <div>
    <b-form-group label="Tagged input using select" label-for="tags-component-select">
      <!-- Prop `add-on-change` is needed to enable adding tags vie the `change` event -->
      <b-form-tags
        id="tags-component-select"
        v-model="value"
        size="lg"
        class="mb-2"
        add-on-change
        no-outer-focus
      >
        <template v-slot="{ tags, inputAttrs, inputHandlers, disabled, removeTag }">
          <ul v-if="tags.length > 0" class="list-inline d-inline-block mb-2">
            <li v-for="tag in tags" :key="tag" class="list-inline-item">
              <b-form-tag
                @remove="removeTag(tag)"
                :title="tag"
                :disabled="disabled"
                variant="info"
              >{{ tag }}</b-form-tag>
            </li>
          </ul>
          <b-form-select
            v-bind="inputAttrs"
            v-on="inputHandlers"
            :disabled="disabled || availableOptions.length === 0"
            :options="availableOptions"
          >
            <template #first>
              <!-- This is required to prevent bugs with Safari -->
              <option disabled value="">Choose a tag...</option>
            </template>
          </b-form-select>
        </template>
      </b-form-tags>
    </b-form-group>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        options: ['Apple', 'Orange', 'Banana', 'Lime', 'Peach', 'Chocolate', 'Strawberry'],
        value: []
      }
    },
    computed: {
      availableOptions() {
        return this.options.filter(opt => this.value.indexOf(opt) === -1)
      }
    }
  }
</script>

<!-- b-form-tags-components-select.vue -->

カスタム入力がinputchangeを模倣するカスタムイベント名を使用している場合、またはkeydownに.native修飾子が必要な場合、イベントハンドラをバインドするために以下のような方法を使用できます。

<template #default="{ inputAttrs, inputHandlers, removeTag, tags }">
  <custom-input
    :id="inputAttrs.id"
    :vistom-value-prop="inputAttrs.value"
    @custom-input-event="inputHandlers.input($event)"
    @custom-change-event="inputHandlers.change($event)"
    @keydown.native="inputHandlers.keydown($event)"
  ></custom-input>
  <template v-for="tag in tags">
    <!-- Your custom tag list here -->
  </template>
</template>

inputHandlers.inputハンドラは、ユーザーが入力した各文字で更新するイベントにバインドする必要があります。これは、入力中のタグ検証を行うために必要です。

高度なカスタムレンダリングの使用

inputHandlersがカスタム入力では機能しない場合、またはタグの作成をより細かく制御する必要がある場合、デフォルトのスロットのスコープを介して提供される追加のプロパティを利用できます。

<template>
  <div>
    <b-form-checkbox switch size="lg" v-model="disabled">Disable</b-form-checkbox>
    <b-form-tags
      v-model="value"
      @input="resetInputValue()"
      tag-variant="success"
      class="mb-2 mt-2"
      :disabled="disabled"
      no-outer-focus
      placeholder="Enter a new tag value and click Add"
      :state="state"
    >
      <template v-slot="{tags, inputId, placeholder, disabled, addTag, removeTag }">
        <b-input-group>
          <!-- Always bind the id to the input so that it can be focused when needed -->
          <b-form-input
            v-model="newTag"
            :id="inputId"
            :placeholder="placeholder"
            :disabled="disabled"
            :formatter="formatter"
          ></b-form-input>
          <b-input-group-append>
            <b-button @click="addTag(newTag)" :disabled="disabled" variant="primary">Add</b-button>
          </b-input-group-append>
        </b-input-group>
        <b-form-invalid-feedback :state="state">
          Duplicate tag value cannot be added again!
        </b-form-invalid-feedback>
        <ul v-if="tags.length > 0" class="mb-0">
          <li v-for="tag in tags" :key="tag" :title="`Tag: ${tag}`" class="mt-2">
            <span  class="d-flex align-items-center">
              <span class="mr-2">{{ tag }}</span>
              <b-button
                :disabled="disabled"
                size="sm"
                variant="outline-danger"
                @click="removeTag(tag)"
              >
                remove tag
              </b-button>
            </span>
          </li>
        </ul>
        <b-form-text v-else>
          There are no tags specified. Add a new tag above.
        </b-form-text>
      </template>
    </b-form-tags>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        newTag: '',
        disabled: false,
        value: []
      }
    },
    computed: {
      state() {
        // Return false (invalid) if new tag is a duplicate
        return this.value.indexOf(this.newTag.trim()) > -1 ? false : null
      }
    },
    methods: {
      resetInputValue() {
        this.newTag = ''
      },
      formatter(value) {
        return value.toUpperCase()
      }
    }
  }
</script>

<!-- form-tags-custom-components-advanced.vue -->

これは、事前に定義されたタグセットから選択または検索するために<b-dropdown>コンポーネントを使用する例です。

<template>
  <div>
    <b-form-group label="Tagged input using dropdown" label-for="tags-with-dropdown">
      <b-form-tags id="tags-with-dropdown" v-model="value" no-outer-focus class="mb-2">
        <template v-slot="{ tags, disabled, addTag, removeTag }">
          <ul v-if="tags.length > 0" class="list-inline d-inline-block mb-2">
            <li v-for="tag in tags" :key="tag" class="list-inline-item">
              <b-form-tag
                @remove="removeTag(tag)"
                :title="tag"
                :disabled="disabled"
                variant="info"
              >{{ tag }}</b-form-tag>
            </li>
          </ul>

          <b-dropdown size="sm" variant="outline-secondary" block menu-class="w-100">
            <template #button-content>
              <b-icon icon="tag-fill"></b-icon> Choose tags
            </template>
            <b-dropdown-form @submit.stop.prevent="() => {}">
              <b-form-group
                label="Search tags"
                label-for="tag-search-input"
                label-cols-md="auto"
                class="mb-0"
                label-size="sm"
                :description="searchDesc"
                :disabled="disabled"
              >
                <b-form-input
                  v-model="search"
                  id="tag-search-input"
                  type="search"
                  size="sm"
                  autocomplete="off"
                 ></b-form-input>
              </b-form-group>
            </b-dropdown-form>
            <b-dropdown-divider></b-dropdown-divider>
            <b-dropdown-item-button
              v-for="option in availableOptions"
              :key="option"
              @click="onOptionClick({ option, addTag })"
            >
              {{ option }}
            </b-dropdown-item-button>
            <b-dropdown-text v-if="availableOptions.length === 0">
              There are no tags available to select
            </b-dropdown-text>
          </b-dropdown>
        </template>
      </b-form-tags>
    </b-form-group>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        options: ['Apple', 'Orange', 'Banana', 'Lime', 'Peach', 'Chocolate', 'Strawberry'],
        search: '',
        value: []
      }
    },
    computed: {
      criteria() {
        // Compute the search criteria
        return this.search.trim().toLowerCase()
      },
      availableOptions() {
        const criteria = this.criteria
        // Filter out already selected options
        const options = this.options.filter(opt => this.value.indexOf(opt) === -1)
        if (criteria) {
          // Show only options that match criteria
          return options.filter(opt => opt.toLowerCase().indexOf(criteria) > -1);
        }
        // Show all options available
        return options
      },
      searchDesc() {
        if (this.criteria && this.availableOptions.length === 0) {
          return 'There are no tags matching your search criteria'
        }
        return ''
      }
    },
    methods: {
      onOptionClick({ option, addTag }) {
        addTag(option)
        this.search = ''
      }
    }
  }
</script>

<!-- b-form-tags-dropdown-example.vue -->

ラッパーコンポーネントの作成

次の手順で、好みのレンダリングスタイルを持つカスタムラッパーコンポーネントを簡単に作成できます。

<template>
  <b-form-tags :value="value" @input="$emit('input', $event)">
    <template v-slot="{ tags, addTag, removeTag, inputAttrs, inputHandlers }">
     <!-- Place your custom rendering here -->
    </template>
  </b-form-tags>
</template>

<script>
  import { BFormTags } from 'bootstrap-vue'

  export default {
    name: 'MyCustomTags',
    components: { BFormTags },
    model: {
      prop: 'value',
      event: 'input'
    },
    props: {
      value: {
        type: Array,
        default: () => []
      }
    }
  }
</script>

<b-form-tag>ヘルパーコンポーネント

BootstrapVueは、<b-form-tags>のデフォルトのスコープ付きスロットで使用するためのヘルパーコンポーネント<b-form-tag>を提供します。このコンポーネントは、<b-badge><b-button-close>に基づいています。

<b-form-tag><b-badge>と同じバリアントをサポートし、pillスタイルもサポートします。サイズは、包含要素のフォントサイズに基づいています。

<b-form-tag>の削除ボタンがクリックされると、removeイベントが発行されます。

親コンテナに対して幅が広いタグは、自動的にテキストコンテンツが省略記号で切り捨てられます。このため、<b-form-tag>のデフォルトスロットでタグコンテンツを使用する場合は、titleプロパティを指定することをお勧めします。

注記 <b-form-tag>には、適切なスタイルのためにBootstrapVueのカスタムCSS/SCSSが必要です。

コンポーネントリファレンス

<b-form-tags>

v2.2.0+

コンポーネントエイリアス

<b-form-tags>は、以下のエイリアスでも使用できます。

  • <b-tags>

注記:コンポーネントエイリアスは、BootstrapVue全体をインポートする場合、またはコンポーネントグループプラグインを使用する場合のみ使用できます。

プロパティ

すべてのプロパティのデフォルト値は、グローバルに設定可能です。

プロパティ
(昇順にソートするにはクリックしてください)
(昇順にソートするにはクリックしてください)
デフォルト
説明
add-button-text
文字列'追加'組み込みの「追加」ボタンのテキスト。スロット`add-button-text`が優先されます。
add-button-variant
文字列'outline-secondary''追加'ボタンにBootstrapテーマカラーバリアントのいずれかを適用します。
add-on-change
ブール値false設定されている場合、入力の'change'イベントでタグの追加を有効にします。
autofocus
ブール値false`true`に設定されている場合、マウント時にコントロールに自動的にフォーカスを試みます。または、keep-aliveの場合に再アクティブ化します。コントロールに`autofocus`属性を設定しません。
disabled
ブール値falsetrueに設定すると、コンポーネントの機能を無効にし、無効状態にします。
重複タグテキスト
文字列「重複タグ」重複タグが検出された場合のメッセージです。メッセージを無効にするには、空文字列に設定します。
フィードバックARIAライブ
v2.22.0以降
文字列「assertive」フィードバックテキストの`aria-live`属性に使用する値です。
form
文字列フォームコントロールが属するフォームのIDです。コントロールの`form`属性を設定します。
id
文字列レンダリングされたコンテンツの`id`属性を設定するために使用され、必要に応じて追加の要素IDを生成するためのベースとして使用されます。
入力フォーカスセレクターの無視
v2.16.0以降
ArrayまたはString`.b-form-tag button input select`クリックして入力ルーチンにフォーカスする際に、CSSセレクターで指定された特定の要素を無視します。
入力属性
オブジェクト{}新しいタグ入力要素に適用する追加属性です。
入力クラス
ArrayまたはObjectまたはString新しいタグ入力要素に適用するクラス(またはクラス名)です。
入力ID
文字列新しいタグ入力要素に適用するIDです。指定しない場合、一意のIDが自動生成されます。
入力タイプ
v2.3.0以降
文字列「text」使用する入力の種類を指定します:「text」、「email」、「tel」、「url」、「number」。デフォルトは「text」です。
無効なタグテキスト
文字列「無効なタグ」無効なタグが検出された場合のエラーメッセージです。メッセージを無効にするには、空文字列に設定します。
limit
v2.17.0以降
数値追加できるタグの最大数です。コンポーネントの外から操作された場合は、この制限を超える可能性があります。
タグ制限テキスト
v2.17.0以降
文字列「タグの制限に達しました」制限に達した場合のメッセージです。メッセージを無効にするには、空文字列に設定します。
名前
文字列フォームコントロールの「name」属性の値を設定します。設定すると、各タグに対して非表示の入力が作成されます。
Enterキーでの追加を無効化
ブール値false設定すると、入力の「keydown.enter」イベントでタグの追加が無効になります。
外部フォーカスを無効化
ブール値false設定すると、コンポーネントルート要素のフォーカススタイルが無効になります。
タグ削除を無効化
v2.21.0以降
ブール値false設定すると、タグに削除ボタンが表示されなくなります。
placeholder
文字列「タグを追加...」フォームコントロールの「placeholder」属性の値を設定します。
削除時の削除
ブール値false設定すると、ユーザーがDeleteキーまたはBackspaceキーを押して入力が空の場合、タグの最後のタグが削除されます。
required
ブール値falseフォームコントロールに`required`属性を追加します。
separator
ArrayまたはStringタグを作成するトリガーとなる区切り文字です。
size
文字列コンポーネントの外観のサイズを設定します。'sm'、'md'(デフォルト)、または'lg'
state
ブール値nullコンポーネントの検証状態の外観を制御します。有効な場合は`true`、無効な場合は`false`、検証状態がない場合は`null`です。
タグクラス
ArrayまたはObjectまたはStringタグに適用するクラス(またはクラス名)です。
tag-pills
ブール値false組み込みタグにピル形式の外観を適用します。
タグ削除ラベル
文字列「タグを削除」タグ内の削除ボタンの「aria-label」属性の値です。
タグ削除ラベル
v2.5.0以降
文字列「タグが削除されました」スクリーンリーダーユーザーに削除されたタグを通知するaria-live領域のラベルです。
タグバリデーター
関数オプションのタグバリデーターメソッドです。追加されるタグを単一引数として渡します。タグが検証に合格した場合は'true'、追加できない場合は'false'を返します。
tag-variant
文字列「secondary」Bootstrapテーマの色バリアントの1つをタグに適用します。
value
v-model
配列[]現在のタグの配列です。これがv-modelです。

v-model

プロパティ
イベント
valueinput

スロット

名前
スコープ付き
説明
add-button-text いいえ組み込みの「追加」ボタンに配置するコンテンツです。「add-button-text」プロップよりも優先されます。デフォルトのスコープ付きスロットが提供されている場合は使用されません。
デフォルト タグコンポーネントのデフォルトのレンダリングをオーバーライドするスロットです。

イベント

イベント
引数
説明
blur
  1. event - ネイティブblurイベント(フォーマット前)
コンポーネントがフォーカスを失ったときに発生します。
focus
  1. event - ネイティブfocusイベント(フォーマット前)
コンポーネントがフォーカスを獲得したときに発生します。
focusin
  1. event - ネイティブfocusinイベント(フォーマット前)
コンポーネントの内部要素がフォーカスを獲得したときに発生します。
focusout
  1. event - ネイティブfocusoutイベント(フォーマット前)
コンポーネントの内部要素がフォーカスを失ったときに発生します。
input
  1. value - 現在のタグの配列
タグが変更されたときに発生します。v-modelを更新します。
タグの状態
  1. validTags - 追加された(または追加される)新しいタグの配列です。タグが追加されていない場合はゼロの長さになります。
  2. invalidTags - 検証に合格しなかったため追加できないタグの配列です。無効なタグがない場合はゼロの長さになります。
  3. duplicateTags - 重複タグになるため追加できないタグの配列です。重複タグがない場合はゼロの長さになります。
ユーザー入力のタグが解析されたときに発生します。

<b-form-tag>

v2.2.0+

コンポーネントのエイリアス

<b-form-tag>は、次のエイリアスでも使用できます。

  • <b-tag>

注記:コンポーネントエイリアスは、BootstrapVue全体をインポートする場合、またはコンポーネントグループプラグインを使用する場合のみ使用できます。

プロパティ

すべてのプロパティのデフォルト値は、グローバルに設定可能です。

プロパティ
デフォルト
説明
disabled
ブール値falsetrueに設定すると、コンポーネントの機能を無効にし、無効状態にします。
id
文字列レンダリングされたコンテンツの`id`属性を設定するために使用され、必要に応じて追加の要素IDを生成するためのベースとして使用されます。
削除不可
v2.21.0以降
ブール値false設定すると、タグに削除ボタンが表示されなくなります。
ピル
ブール値falseタグにピル形式の外観を適用します。
削除ラベル
文字列「タグを削除」タグ内の削除ボタンの「aria-label」属性の値です。
タグ
文字列「span」デフォルトのタグの代わりにレンダリングするHTMLタグを指定します。
タイトル
文字列タグの「title」属性に配置する値です。デフォルトのスロットが提供されていない場合、タグコンテンツにも使用されます。
バリアント
文字列「secondary」Bootstrapテーマの色バリアントの1つをコンポーネントに適用します。

スロット

名前
説明
デフォルト タグに配置するコンテンツです。`title`プロップをオーバーライドします。

イベント

イベント
引数
説明
削除 削除ボタンがクリックされたときに発生します。

個々のコンポーネントのインポート

次の名前付きエクスポートを使用して、個々のコンポーネントをプロジェクトにインポートできます。

コンポーネント
名前付きエクスポート
インポートパス
<b-form-tags>BFormTagsbootstrap-vue
<b-form-tag>BFormTagbootstrap-vue

import { BFormTags } from 'bootstrap-vue'
Vue.component('b-form-tags', BFormTags)

Vue.jsプラグインとしてのインポート

このプラグインには、上記にリストされているすべての個々のコンポーネントが含まれています。プラグインには、コンポーネントのエイリアスも含まれています。

名前付きエクスポート
インポートパス
FormTagsPluginbootstrap-vue

import { FormTagsPlugin } from 'bootstrap-vue'
Vue.use(FormTagsPlugin)