带有 2 个 v-for 的 vuejs 搜索过滤器

vuejs search filter with 2 v-for

我计算了以下过滤器

<script>
    export default {
        data() {
        return {
           columns:{},
           search:"",
           trovato:{},
        };
        },
        
        
        computed: {

       
           searchit() {

              const sear =this.search.toLowerCase().trim();
              if(!sear) return this.columns;
              Array.from(this.columns).forEach(element => {
                 element.filter((item) => {
    
 
                    if(item.toLowerCase().includes(sear)){
                     
                       this.trovato = item;
                       console.log(this.trovato);
                       return this.trovato;
                    }
                 
                })
             })
           }
    }
</script>

效果很好,console.log(this.trovato) 打印与我搜索的名称相匹配的正确列。

问题是我无法在 v-list 中打印它,一开始它显示了 var 列的所有值{},但在我键入内容后它不显示任何内容,它是全部空白。这是我正在使用的代码:

<v-list-item>
   <v-text-field append-icon="search" v-model="search" label="Cerca" ></v-text-field>
</v-list-item>
<v-list v-for="(item,index) in searchit" :key="index">
     <v-list-item v-for="ved in item" :key="ved.id">
         <v-list-item-content>
                                    
               <v-list-item-title >{{ved}}</v-list-item-title>
                                   
                                   
         </v-list-item-content>
     </v-list-item>
</v-list>

Array.prototype.filter return 是一个新数组,不会改变原始数组。 (参见 documentation

所以在这里,您过滤了它们,但没有将新过滤的数组分配给任何东西,所以它进入了空白。

此外,从计算的组件 data 改变组件确实是一种不好的做法。您假设 return 一个从该数据派生的新对象/数组。

searchit() {
  const sear =this.search.toLowerCase().trim();

  if(!sear) { return this.columns; }

  const newColumns = this.columns.map(col => {
     return col.filter((item) => {
        if(item.toLowerCase().includes(sear)){
           this.trovato = item; // If possible, avoid setting data from a computed
           return this.trovato;
        }
      })
  })
  return newColumns;
}