【问题标题】:How do I preselect a vue-multiselect option when options is an array of objects?How do I preselect a vue-multiselect option when options is an array of objects?
【发布时间】:2019-07-14 15:11:53
【问题描述】:

我想在vue-multiselect 生成的选择下拉列表中预先选择一个特定值。
如果我有一个简单的字符串数组,如下所示,我可以让它正常工作:

['Test 1', 'Test 2', 'Test 3']

但是,当我使用对象数组时,我无法让它工作。例如,如果我有以下内容:

<v-multiselect :options="[{id: 1, name: 'Test 1'}, {id: 2, name: 'Test 2'}, {id: 3, name: 'Test 3'}]"
               label="name"
               track-by="id"
               v-model="test">
</v-multiselect>

无论我设置 v-model 所连接的 test 数据属性是什么,它都不会预选该值。我试过123'1''2''3'test,当track-byid'Test 1',等等。是name,但似乎没有任何效果。

我在这里做错了什么?我查看了https://vue-multiselect.js.org/#sub-single-select-object 的文档,但是当您要为选项的对象数组预设值时,它们似乎没有提供示例。谷歌搜索也没有返回我要找的东西。

在一个相关主题上,一旦我得到这个工作,当我将组件设置为multiple 时,我需要更改什么来选择多个值?谢谢。

【问题讨论】:

    标签: arrays vue.js vuejs2 preset vue-multiselect


    【解决方案1】:

    track-by 用法

    文档表明track-by “用于比较对象。仅在选项是对象时使用。

    也就是说,它指定了比较options中的对象值时要使用的对象键。如果选项为对象,则应陈述track-by 987654327 @ 987654327所需的状态因为track-by 987654329 to determine which options in the dropdown are selectedto properly remove a selected option from a multiselect

    如果没有track-by,您会看到对象选项的两个错误行为:(1) 用户将能够重新选择已选择的选项,以及 (2) 尝试删除选定的选项会导致所有选项重新插入。

    设置初始值

    &lt;vue-multiselect&gt; 不支持自动转换值数组,但您可以从父组件轻松实现。

    1. 创建一个本地数据属性以指定 track-by 和初始多选值(例如,分别命名为 trackByinitialValues):

      export default {
        data() {
          return {
            //...
            trackBy: 'id',
            initialValues: [2, 5],
          }
        }
      }
      
    2. &lt;vue-multiselect&gt;.track-by 绑定到this.trackBy 并将&lt;vue-multiselect&gt;.v-model 绑定到this.value

      <vue-multiselect :track-by="trackBy" v-model="value">
      
    3. this.initialValues 上创建一个watcher,将这些值映射到基于this.trackBy 的对象数组中,将this.value 设置为结果:

      export default {
        watch: {
          initialValues: {
            immediate: true,
            handler(values) {
              this.value = this.options.filter(x => values.includes(x[this.trackBy]));
            }
          }
        }
      }
      

    Vue.component('v-multiselect', window.VueMultiselect.default);
    
    new Vue({
      el: '#app',
      data () {
        return {
          trackBy: 'id',
          initialValues: [5,2],
          value: null,
          options: [
            { id: 1, name: 'Vue.js', language: 'JavaScript' },
            { id: 2, name: 'Rails', language: 'Ruby' },
            { id: 3, name: 'Sinatra', language: 'Ruby' },
            { id: 4, name: 'Laravel', language: 'PHP' },
            { id: 5, name: 'Phoenix', language: 'Elixir' }
          ]
        }
      },
      watch: {
        initialValues: {
          immediate: true,
          handler(values) {
            this.value = this.options.filter(x => values.includes(x[this.trackBy]));
          }
        }
      }
    })
    <script src="https://unpkg.com/vue@2.6.6/dist/vue.min.js"></script>
    <script src="https://unpkg.com/vue-multiselect@2.1.0"></script>
    <link rel="stylesheet" href="https://unpkg.com/vue-multiselect@2.1.0/dist/vue-multiselect.min.css">
    
    <div id="app">
      <v-multiselect :track-by="trackBy"
                     :options="options"
                     v-model="value"
                     label="name"
                     multiple>
      </v-multiselect>
      <pre>{{ value }}</pre>
    </div>

    【讨论】:

    • 感谢您解释所有这些。我明白了,我将不得不实施类似的东西,但老实说,这感觉就像一个穷人的解决方案。当您指定 track-id 时,vue-multiselect 应该会自动为您处理此问题。
    【解决方案2】:

    看起来像一个错误。解决方法是使用对object的实际引用

    Vue.component('v-multiselect', window.VueMultiselect.default);
    let testOptions=[{id: 1, name: 'Test 1'}, {id: 2, name: 'Test 2'}, {id: 3, name: 'Test 3'}]
    new Vue({
      el: '#app',
      data: function () {
        return {
          test: testOptions[1], // <- use an object ref here!
          testOptions
        };
      }
    });
    

    【讨论】:

    • 感谢您的回复,史蒂文。我尝试在返回的data 对象中为test 设置以下所有内容,但它们都不起作用:1'1'[1]['1']{ id: 1 }{ id: '1' } .还有其他想法吗?谢谢。
    • 似乎没有什么不同。我在组件中设置了:options="testOptions",然后在data 对象中设置了以下属性:[{id: 1, name: 'Test 1'}, {id: 2, name: 'Test 2'}, {id: 3, name: 'Test 3'}]。尝试再次将test 设置为所有各种可能性,但没有任何效果。还有其他想法吗?
    • 给你:codepen.io/HartleySan/pen/NomLqN?editors=1111。被注释的代码不起作用,但如果你用注释掉的 HTML 和 JS 将其切换出来,那么它会预先选择 Test 1 值。没有线索。
    • 史蒂文,你是对的,这确实有效。虽然不是一个很好的解决方法,但有两个原因:1)我不会轻易将选定的对象放在手边。通常我会有我想从中选择对象的 ID; 2)如果你这样做,你甚至不需要track-by 属性,在这种情况下,该属性是做什么用的?是马车吗?也许我误解了一些东西,但图书馆似乎有问题。如果您设置track-by="id",那么我认为您应该能够设置test: 1 并且一切顺利。我想知道我是否应该就此提交错误报告。
    • 它肯定是一个错误。在处理完这类事情后,我开始使用vuetify...
    【解决方案3】:

    我发现最简单的方法是从 BE 发送整个对象,因此它会被预先选择。如果您从 BE 发送相同的对象,则会被预选。但我不知道您的选项是在 FE 上硬编码还是来自数据库或其他东西。我有同样的问题,但我的值来自我的数据库,所以很容易重现该对象

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-16
      • 2022-12-01
      • 2022-12-02
      • 2022-12-02
      • 1970-01-01
      • 2022-12-19
      • 1970-01-01
      • 2023-01-06
      相关资源
      最近更新 更多