首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用bootstrap vue中的表单标记组件时将对象用作标记

如何在使用bootstrap vue中的表单标记组件时将对象用作标记
EN

Stack Overflow用户
提问于 2020-01-23 22:45:36
回答 3查看 3.6K关注 0票数 3

要解释这个问题,请使用文档中的代码,如下所示:

代码语言:javascript
复制
<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>

上面的代码输出如下:

但是,当我将值作为对象数组而不是短字符串时,如何将对象的属性呈现为标记元素?

例如:如果我有value:[{name: 'apple', color: 'red'}, {name:'mango', color: 'yellow'}],那么如何获得与上面相同的输出?我尝试了像<strong>{{ tag.name }}</strong>这样的东西,但它不起作用,只给了我空标签来删除,如下所示:

关于如何实现我想在这里做的事情,有什么想法吗?

EN

回答 3

Stack Overflow用户

发布于 2020-01-23 23:05:18

根据this issue的说法,您正在尝试做的还不是支持

您必须将对象数组映射到字符串数组并利用它。

然后,一旦你准备好“使用”你的标签,你就可以基于原始对象映射回它们。

这里有一个相当简单的例子,说明可以做些什么。

代码语言:javascript
复制
new Vue({
  el: "#app",
  computed: {
    mappedTags() {
      /* This is case sensitive */
      return this.options.filter(option => this.value.includes(option.name))
    }
  },
  data: {
    value: [],
    options: [{
        name: 'Mango',
        color: 'Orange'
      },
      {
        name: 'Orange',
        color: 'Orange'
      },
      {
        name: 'Lemon',
        color: 'Yellow'
      },
      {
        name: 'Apple',
        color: 'Red'
      },
      {
        name: 'Banana',
        color: 'Yellow'
      },
    ]
  }
})
代码语言:javascript
复制
<link href="https://unpkg.com/bootstrap@4.4.1/dist/css/bootstrap.min.css" rel="stylesheet" />
<link href="https://unpkg.com/bootstrap-vue@2.4.0/dist/bootstrap-vue.css" rel="stylesheet" />

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.js"></script>
<script src="https://unpkg.com/bootstrap-vue@2.2.2/dist/bootstrap-vue.js"></script>
<style>
  /* Only added for better visibility on the text */
  
  .text-stroke {
    text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000;
  }
</style>

<div id="app" class="p-3">
  Valid (<b>Casesensitive</b>) tags - [Banana, Apple, Orange, Mango]
  <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">
        <b-input
          v-bind="inputAttrs"
          v-on="inputHandlers"
          placeholder="New tag - Press enter to add"></b-input>
        <b-input-group-append>
          <b-button @click="addTag()" variant="primary">Add</b-button>
        </b-input-group-append>
      </b-input-group>
      <ul class="list-unstyled d-inline-flex flex-wrap mb-0">
        <b-card
          v-for="tag in mappedTags"
          :key="tag.name"
          :id="`my-custom-tags-tag_${tag.name.replace(/\s/g, '_')}_`"
          tag="li"
          class="mt-1 mr-1"
          body-class="py-1 pr-2 text-nowrap"
        >
          <strong :style="`color: ${tag.color}`" class="text-stroke">
            {{ tag.name }}
          </strong>
          <b-button
            @click="removeTag(tag.name)"
            variant="link"
          >
            Remove
          </b-button>
        </b-card>
      </ul>
    </template>
  </b-form-tags>
  {{ mappedTags }}
</div>

票数 4
EN

Stack Overflow用户

发布于 2021-02-10 14:08:12

{{ JSON.parse(tag).name }}替换{{ tag.name }}

这应该可以解决问题。

票数 0
EN

Stack Overflow用户

发布于 2021-02-14 14:37:11

您有一个类似的示例,其中我需要用户的输入和它的选择,并收集对象数组中的两个输入值。

您需要将v-model添加到您的输入中,这样您就可以将其传递给自定义函数

代码语言:javascript
复制
<b-form-input
  v-model="werkTagNombre"

<b-form-select
  v-model="werkTagExp"
...

"@click="addingWerkTag({werkTagNombre, werkTagExp})"

完整的模板代码

代码语言:javascript
复制
<b-form-tags v-model="freelance.tags.nombre">
          <template v-slot="{ inputAttrs, inputHandlers }">
            <b-input-group aria-controls="tags-list">
              <b-form-input
                v-model="werkTagNombre"
                v-bind="inputAttrs"
                v-on="inputHandlers"
                placeholder="Seleccione"
                class="werk-input werk-shadow-input mr-2"
              >
              </b-form-input>
              <b-input-group-append>
                <b-form-select
                  v-model="werkTagExp"
                  :options="experienciaOptions"
                  class="werk-input werk-shadow-input ml-2 mr-2"
                >
                </b-form-select>
              </b-input-group-append>
              <b-input-group-append>
                <b-button class="shadow-none ml-2" style="border-radius:6px;"@click="addingWerkTag({werkTagNombre, werkTagExp})"> ADD</b-button>
              </b-input-group-append>
            </b-input-group>
            <span style="font-size: 10px; color: #a5a5a5;">TAGS:</span>
            <ul id="tags-list" class="list-unstyled d-inline-flex flex-wrap mb-0 mt-1">
              <b-badge
                v-for="(werkTag, index) in freelance.tags"
                :key="index"
                tag="li"
                class="mx-1 my-1 werk-tags"
              >
              {{werkTag.nombre}} {{werkTag.experiencia}}
              </b-badge>
            </ul>
          </template>
        </b-form-tags>

脚本

代码语言:javascript
复制
  export default {
data() {
  return {
    freelance: {
      tags: [
        {
          nombre:" Test name",
          experiencia:1
        }
      ],
}
...
    werkTagNombre: '',
    werkTagExp: '0',
    experienciaOptions: [
      { value: '0', text: 'Selecciona'},
      { value: 1, text: 'menor a 2 años'},
      { value: 2, text: '3 a 5 años'},
      { value: 3, text: 'mayor a 5 años'},
    ]
...

methods:{
 addingWerkTag(valor){
    this.freelance.tags.push({nombre: valor.werkTagNombre, exp: valor.werkTagExp});
  },
 ...
}

如果需要,您还可以像这样传递addTag默认函数:

在模板槽中添加像"addtag“这样的函数

代码语言:javascript
复制
<template v-slot="{ inputAttrs, inputHandlers, addTag }">
...

因此您可以将其添加到您的自定义函数中,如下所示:

代码语言:javascript
复制
@click="addingWerkTag({ werkTagNombre, werkTagExp, addTag })"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59881178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档