【问题标题】:Allow Vue2 Select Component to take in any array for select options允许 Vue2 选择组件为选择选项接收任何数组
【发布时间】:2019-12-04 05:41:00
【问题描述】:

我正在尝试创建一个可重用的 Select 组件,该组件将与作为选项传递给它的任何 Array 一起使用。

如果数组中的对象属性共享组件中绑定的相同名称,我可以正常工作,但是如果您传递具有不同属性/属性名称的对象数组,如预期的那样,选项将不会呈现。如何在组件上分配我想要作为选项值的对象属性以及我想要作为选项标签/名称的对象属性?

FormSelect.vue / 组件

<template>
   <select :id="id" v-model="selected">     
      <option v-if="options.length > 0" value="">Please Select</option>
      <option
        v-if="options.length > 0"
        v-for="(option, index) in options"
        :key="index"
        :selected="selected"
        :value="option.value"
        v-text="option.name"
       />  

    </select>
</template>
<script>
props: {
 value: {    
      type: [Array, String, Number, Object],
      default: null
    },
 options: {
      type: Array,
      default: () => []
    }
},

computed: {
    selected: {
      get() {
        return this.value ? this.value : "";
      },
      set(v) {
        this.$emit("input", v);
      }
    }
  }
</script>

Parent.vue / Parent

<form-select
   id="gender"
   label="Gender"
   :options="genderOptions"
   @input="handleEdit(deep(profile))"
   v-model="user.gender"
/>

这行得通:

genderOptions: [
  { name: "Male", value: "MALE" },
  { name: "Female", value: "FEMALE" }
],

这不会(注意 obj 键名):

genderOptions: [
    { id: "Male", gender: "MALE" },
    { id: "Female", gender: "FEMALE" }
 ],

所以我认为需要一种方法来告诉组件我想将哪些属性用作选项值和标签。像这样的东西,但它也需要是组件端的句柄:

<form-select
   id="gender"
   label="Gender"
   :options="genderOptions"

   optionVal="gender"
   optionName="id"

   @input="handleEdit(deep(profile))"
   v-model="user.gender"
/>

【问题讨论】:

    标签: javascript arrays object vue.js html-select


    【解决方案1】:

    您缺少将 optionValoptionName 道具添加到您的组件并使用它们,我建议以下解决方案

    <script>
    props: {
     value: {    
          type: [Array, String, Number, Object],
          default: null
        },
     options: {
          type: Array,
          default: () => []
        },
    optionVal:{
        type:String,
        default: 'value'
        },
    optionName:{
        type:String,
        default: 'name'
        }
    },
    
    computed: {
        selected: {
          get() {
            return this.value ? this.value : "";
          },
          set(v) {
            this.$emit("input", v);
          }
        }
      }
    </script>
    
     <select :id="id" v-model="selected">     
          <option v-if="options.length > 0" value="">Please Select</option>
          <option
            v-if="options.length > 0"
            v-for="(option, index) in options"
            :key="index"
            :selected="selected"
            :value="option[optionVal]"
        v-text="option[optionName]"
           />  
    
        </select>
    

    【讨论】:

    • 哇.. 好用! ( :value="option[optionVal]" )。谢谢!我肯定是想多了这个。如果选项确实具有右侧obj键? spp>
    • 我们有两种方法可以通过 . (点)或 [] 像 user.nameuser["name"],所以我使用第二个,因为它是动态的
    • 啊,我明白了你对 prop 默认值('name' 和 'value')所做的事情。这就是为什么它仍然可以在没有我为 optionVal 设置值的情况下工作。干得好,再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多