当前位置: 首页 > 知识库问答 >
问题:

Vue自定义选择具有对象值的组件

龚博涛
2023-03-14

我试图用Vuejs 2实现自定义选择组件。如文档中所述,我不应该直接修改值属性,并建议使用事件将选定的数据传递给父组件。当选项值是一个对象时,我遇到了问题,却得到了[Object object]。

这是我的选择组件模板:

<div :class="inputLength">
        <select :id="id"
                :value="value"
                @change="setValue($event.target.value)"
                :multiple="multiple"
                class="selectpicker">
            <option value="">Nothing selected.</option>
            <option :selected="option == value" v-for="option in options"
                    :value="option">
                {{ option[label] }}
            </option>
        </select>
        <span v-if="error.any()" class="help-block" v-text="error.all()"></span>

</div>

这是脚本部分:

export default {
    props: {
        value: {
            default() {
               return ''
            }
        },
        options: {
            type: Array,
            require: true
        },
        ...
    },
    methods: {
        setValue(val) {
            this.error.clear();
            this.$emit('input', val);
        }
    }
}

这是父组件

<input-select-horizontal
    v-model="form.category"
    :label-class="{'col-md-4': true}"
    input-length="col-md-8"
    :options="categories.all()"
    label="name"
    :error="form.errors.get('category_id')">
<span slot="label">Category <span class="required" aria-required="true">*</span></span>

选项:

[
    {
        id: 1,
        name: 'Category 1',
        description: 'desc 1'
    },
    {
        id: 2,
        name: 'Category 2',
        description: 'desc 2'
    },
    ...
]

我期待

form.category = {
    id: 1,
    name: "Category 1",
    description: "desc 1"
}

但得到了[Object object]

我错过了什么吗?

共有3个答案

桂坚
2023-03-14
https://www.npmjs.com/package/stf-vue-select


<stf-select v-model="value" style="width: 300px; margin: 0 auto">
      <div slot="label">Input address</div>
      <div slot="value">
        <div v-if="value">
           <span>{{value.address}} (<small>{{value.text}}</small>)</span>
        </div>
      </div>
      <section class="options delivery_order__options">
          <stf-select-option  
           v-for="item of list" :key="item.id"
           :value="item"
           :class="{'stf-select-option_selected': item.id === (value && value.id)}" 
           >
              <span>{{item.text}} (<small>{{item.address}}</small>)</span>
          </stf-select-option>
      </section>
    </stf-select>
酆阳煦
2023-03-14

正如 mzgajner 所提到的,你不能绑定一个对象,因为它会把它转换成一个字符串。但是,您可以做的是将对象转换为选项组件中的 base64 字符串,然后在选择组件中再次对其进行解码。

例如:组件自定义选项

<template>
  <option v-bind="{ ...$attrs, value: innerValue }" v-on="$listeners">
    <slot>
      {{ label || $attrs.value }}
    </slot>
  </option>
</template>

<script>
export default {
  props: {
    label: [String, Number, Boolean],
  },
  computed: {
    innerValue() {
      return btoa(JSON.stringify(this.$attrs.value));
    },
  },
};
</script>

组件CustomSelect

<template>
  <select
    :value="innerValue"
    v-bind="$attrs"
    v-on="{
      ...$listeners,
      input: onInput,
    }"
  >
    <slot></slot>
  </select>
</template>

<script>
export default {
  props: {
    value: null
  },
  computed: {
    innerValue() {
      return btoa(JSON.stringify(this.value));
    },
  },
  methods: {
    onInput(e) {
      let value = JSON.parse(atob(e.target.value));
      this.$emit('input', value);
    },
  },
};
</script>
於子晋
2023-03-14

你的问题就在这里:

<option v-for="option in options" :value="option">
  {{ option[label] }}
</option>

您要获取整个对象并将其分配给选项元素的value属性。这是行不通的,因为value属性必须是一个字符串。所以对象被转换为[Object对象]

您应该尝试使用: value="option.id",ID值应该正常通过父组件,您可以使用它来查找正确的类别。

 类似资料:
  • 我有下面的对象数组, 首先,我需要用忽略时间的日期分组。 所以, 如果是像这样的日期,我可以使用。 我仍然可以使用它,但现在它涉及到一些条件,将那些转换为日期格式。 此外,我还需要按那些按日期结果分组的对象进行分组,以便它们的落在一个时间间隔内。 因此,如果,它应该在组中, 因此,首先应该按照创建日期对结果进行分组,然后再按照定义的时隙对每个组中的元素进行分组。 我想,如果我可以使用条件分组,我可

  • 问题内容: 说有这样的表: 字段名称很容易解释。我想选择同时具有1和3 的,因此在此示例中仅。我想到了类似的 清单,之后我想列出该组中存在的。我怎么做? 问题答案: 如果没有任何唯一约束,请尝试: 如果仅尝试检测两个值,请使用此子句: 如果post_id和tag_id都具有唯一约束,那么这也应该起作用:

  • 是否可以在OpenAPI中为组件对象指定自定义名称? 我目前有两个组件对象指定请求模式: 在endpoint描述中,我将这些模式引用如下: 当我发布yaml文件时,UI在选择选项卡中显示Request est1和Request est2,其中包含名称“Request est1”和“Request est2”。是否可以为它们分配自定义名称,以便UI显示自定义名称?例如“自定义名称请求1”和“自定义名

  • 我正在尝试使用Javascript选择此复选框 下面的代码可以工作,但并不理想 我试过这些 但它们并不起作用。有什么想法能让这件事成功吗? 数据值未硬编码的更新代码

  • 我不知道以前有没有人问过这个问题。我要给我爸爸建一个计算器。他问我有没有办法用按钮定制。 我还没有完成任何代码。我打算尝试一些东西。我的研究结果一无所获。 这就是我想要实现的,我感觉它打破了android studio的编码法则。这就是概念: 想象一下计算器。数字上方有8个空白按钮。这些按钮通常具有百分比和sqrt等功能。,。。等 有人问我,他是否可以按住按钮,随意改变这些功能。 所以现在的问题是

  • 问题内容: 我希望有一个输入字段,用户可以输入自定义文本值或从下拉菜单中选择。普通只提供下拉选项。 我如何才能接受自定义值?例如:福特? 问题答案: HTML5具有内置的组合框。您创建一个文本和一个。然后,您向中添加一个属性,其值为的。 更新: 自2019年3月起,所有主要浏览器(现在包括Safari12.1和iOSSafari12.3)都支持此功能所需的级别。有关详细的浏览器支持。 看起来像这样