代码之家  ›  专栏  ›  技术社区  ›  ekjcfn3902039

Vuetify v-select动态填充/排序

  •  0
  • ekjcfn3902039  · 技术社区  · 5 年前

    我正在尝试动态填充和排序v-select使用的数组。但是,我遇到了es lint警告“计算属性中的意外副作用”,因为我在该调用中改变了对象。是否有更合适的模式将新数据附加到数组并对其排序?这里有一些快捷方式;用肮脏的代码来理解要点

    // SomeFile.vue
    <MySelectComponent :someData="changingArray" />
    
    // MySelectComponent.vue
    <v-select v-model="selectedItems" :items="mergeWithNewData" >
    ...
    
    props: { 
      someData: Array,
    },
    data: () => ({
      selectedItems: [],
      holdsEverything: [],
    },
    computed: {
      mergeWithNewData() {
        this.someData.forEach(item => {
          if (!this.holdsEverything.includes(item)){
            this.holdsEverything.push(item);
            this.holdsEverything.sort();
          }
        });
        return this.holdsEverything;
      },
    }
    

    例如,假设changingArray以['a','b','c']开头。当代码运行时,数组现在是['b','z']。holdsEverything应该是['a','b','c','z']

    1 回复  |  直到 5 年前
        1
  •  1
  •   akuiper    5 年前

    看起来您需要从 someData

    computed: {
      mergeWithNewData () {
        return [...new Set(this.someData)].sort()
      }
    }
    

    或使用 watch 而不是 computed

    <v-select v-model="selectedItems" :items="holdsEverything" >  
    // use holdsEverthing directly
    
    watch: {
      someData (newval) {
        newval.forEach(item => {
          if (!this.holdsEverything.includes(item)){
            this.holdsEverything.push(item)
          }
        })
        this.holdsEverything.sort()
      }
    }