Vuetify 克隆和过滤 v-select

Posted

技术标签:

【中文标题】Vuetify 克隆和过滤 v-select【英文标题】:Vuetify clone and filter v-select 【发布时间】:2020-02-15 15:26:39 【问题描述】:

我使用 vuetify v-select。 我想使用第一个 v-select 中的数组选项克隆 v-select,并禁用(或删除)另一个 v-select 中的选定值。 它可以被克隆多次,我希望如果选择了例如 4 v-select 选项 X,那么这个 X 选项将在所有其他 v-select 中被禁用(也在第一个和反向中)。

例如选项数组:

[
     title: 'title 1', id: '1', status: '0' ,
     title: 'title 2', id: '2', status: '0' ,
     title: 'title 3', id: '3', status: '0' ,
     title: 'title 4', id: '4', status: '0' 
]

示例

【问题讨论】:

【参考方案1】:

您可以使用 vuetify v-select 将值克隆到多个选择框中,并从其余选择框中删除已选择的值

这里是工作代码笔:https://codepen.io/chansv/pen/wvvzbLX?editors=1010

你可以有任意数量的选择框,只需循环遍历并将索引分配为选择框的键

找到下面的代码

    <div id="app">
  <v-app id="inspire">
    <v-container fluid>
      <v-btn @click="addSelectBox(true)">add select box</v-btn>
        <div v-for="id in Object.keys(selectItems)" :key="id">
            <v-select
              v-model="selectItems[id].selected"
              :items="selectItems[id].available"
              label="Standard"
              item-key="id"
              item-value="id"
              multiple
              chips
              deletable-chips
              clearable
              @change="modifyOthers"
            ></v-select>
          <v-btn @click="deleteSelectBox(id)">delete select box</btn>
        </div>
    </v-container>
  </v-app>
</div>

new Vue(
  el: '#app',
  vuetify: new Vuetify(),
  data: () => (
    selectItems: ,
    numberOfSelectBoxes: 4,
    itemsBucket: [
       title: 'title 1', id: '1', status: '0' ,
       title: 'title 2', id: '2', status: '0' ,
       title: 'title 3', id: '3', status: '0' ,
       title: 'title 4', id: '4', status: '0' 
    ],
    allSelected: [],
    allUnSelected: [],
  ),
  methods: 
    modifyOthers(val, id) 
      this.updateAllSelected();
      this.updateAllUnselected();
      this.updateAllAvailable();
    ,
    updateAllSelected() 
      this.allSelected = [];
      var self = this;
      Object.keys(self.selectItems).forEach(x => 
        self.allSelected = self.allSelected.concat(self.selectItems[x].selected);
      );
    ,
    updateAllUnselected() 
      this.allUnSelected = [];
      var self = this;
      this.allUnSelected = self.itemsBucket.map(x => x.id).filter(x => !self.allSelected.includes(x));
    ,
    updateAllAvailable() 
      var self = this;
      Object.keys(self.selectItems).forEach(key => 
        self.selectItems[key].available = self.itemsBucket.map(x => x.id).filter(x => 
          return self.selectItems[key].selected.includes(x) || self.allUnSelected.includes(x);
        );
      );
    ,
    addSelectBox(fromUI) 
      var self = this;
      if (fromUI) 
        var currentLast = +Object.keys(self.selectItems)[Object.keys(self.selectItems).length -1];
        var newIndex = currentLast + 1;
        self.$set(self.selectItems, newIndex, selected: '', available: []);
        self.selectItems[newIndex].available = self.allUnSelected;
       else 
        for (var i = 1; i <= this.numberOfSelectBoxes; i++) 
          self.$set(self.selectItems, i, selected: '', available: []);
          self.selectItems[i].available = self.itemsBucket.map(y => y.id);
        
      
    ,
    deleteSelectBox(id) 
      delete this.selectItems[id];
      this.modifyOthers();
    
  ,
  created() 
    this.addSelectBox(false);
    this.updateAllUnselected();
  
)

【讨论】:

谢谢!它的工作很棒!但是..我需要动态添加行的选项(如图片中根据需要动态添加和删除行,而不是从一开始就设置它)..当我使用数组执行此操作时,出于某种原因将其清除所有数据..你知道为什么吗?天呐!!! @chans 是的,可以添加和删除行,只需将创建的钩子中的逻辑包装到函数中 我试过了。但是由于某种原因,一旦我推送所有内容,就会重置..(在这种情况下) 代码更新支持动态添加和删除选择框codepen.io/chansv/pen/wvvzbLX?editors=1010 你是冠军!太感谢了! ?

以上是关于Vuetify 克隆和过滤 v-select的主要内容,如果未能解决你的问题,请参考以下文章

如何在两个属性上使用 Vue/Vuetify 自动完成过滤器?

Vuetify - 如何使用数据表搜索功能按动态计算的字段值进行过滤?

Vue js:Vuetify 服务器端数据表搜索过滤器不起作用

Vuetify 数据表:如何应用标题过滤器功能

Vuetify:如何过滤 v-data-table 中的数据?

如何在 vuetify 的数据表中使用“自定义过滤器”道具?或如何创建自定义过滤器以按标题过滤?