简体   繁体   English

根据用户选择隐藏和显示表格列

[英]Hide and show table column based on user selection

I am trying to hide and show a table column based on user selection.我正在尝试根据用户选择隐藏和显示表格列。 But it is not working as expected.但它没有按预期工作。 Here is the link to the codepen file.这是 codepen 文件的链接。

https://codepen.io/nigel1995/pen/XWKbqoe?editors=1111 https://codepen.io/nigel1995/pen/XWKbqoe?editors=1111

<div id="app">
  <div v-for="item in columnHeaders">
    <label>
      <input type='checkbox' :value='item.value' v-model="selectedType"> {{ item.text }}
    </label>
  </div>

  <table class="selection-div">
    <tr>
      <template v-for="item in columnHeaders">
        <th v-if="showHeader(item)">{{ item.text }}</th>
      </template>
    </tr>
     <tr v-for="desert in deserts">
        <td v-if="!hideCol(desert)">{{ desert.name }}</td>
       <td v-if="!hideCol(desert)">{{ desert.fat }}</td>
    </tr>
  </table>
</div>
new Vue({
  el: '#app',
  data: {
    selectedType: [],
     columnHeaders: [
        { text: 'Name', value: 'name', show: true },
        { text: 'Fat (g)', value: 'fat', show:true },
      ],
      deserts: [
        {
          name: 'Frozen Yogurt',
          fat: 6.0,
        },
        {
           name: 'Golden Yogurt',
           fat: 6.0,
        },
        {
           name: 'Tasty Yogurt',
           fat: 6.0,
        }
      ]
  },
  
  
  methods: {
    hideCol(row){
      const t = Object.keys(row)[0];
      return this.selectedType.includes(t);
    },
    
    showHeader(val){
     return (val.show && !this.selectedType.includes(val.value));       
    } 
  },
});

What I want to do is making the display of table columns dynamic and not check it in each column as table headers will be dynamic in the future.我想要做的是使表格列的显示动态化,而不是在每列中检查它,因为将来表格标题将是动态的。 Any direction would be appreciated.任何方向将不胜感激。

By using a computed method, we can automatically create the visibleColumns data element.通过使用computed方法,我们可以自动创建visibleColumns数据元素。 It defaults to all columns when there's no selected column, otherwise it returns only the selected columns.当没有选定的列时,它默认为所有列,否则只返回选定的列。

The vue template then checks if the column is in visibleColumns .然后 vue 模板检查该列是否在visibleColumns It also automatically creates data columns based on visibleColumns .它还根据visibleColumns自动创建数据列。

<div id="app">
  <div v-for="item in columnHeaders">
    <label>
      <input type='checkbox' :value='item.value' v-model="selectedType"> {{ item.text }}
    </label>
  </div>

  <table class="selection-div">
    <tr>
      <th 
        v-for="item in columnHeaders"
        v-if="visibleColumns.includes(item.value)">
        {{ item.text }}
      </th>
    </tr>
     <tr v-for="desert in deserts">
       <td v-for="column in visibleColumns">{{ desert[column] }}</td>
    </tr>
  </table>
</div>
new Vue({
  el: '#app',
  data: {
     selectedType: [],
     columnHeaders: [
        { text: 'Name', value: 'name' },
        { text: 'Fat (g)', value: 'fat' },
      ],
      deserts: [
        {
          name: 'Frozen Yogurt',
          fat: 6.0,
        },
        {
           name: 'Golden Yogurt',
           fat: 6.0,
        },
        {
           name: 'Tasty Yogurt',
           fat: 6.0,
        }
      ]
  },
  
  computed: {
    visibleColumns() {
      if(this.selectedType.length === 0) {
        return this.columnHeaders.map(c => c.value);
      }
      
      return this.selectedType;
    }
  },

});

View Codepen查看代码笔

You need to pass the object key you want to hide:您需要传递要隐藏的对象键:

 <tr v-for="desert in deserts">
    <td v-if="!hideCol('name')">{{ desert.name }}</td>
   <td v-if="!hideCol('fat')">{{ desert.fat }}</td>
</tr>

then check if that key should be visible or not:然后检查该键是否应该可见:

hideCol(key){
  return this.selectedType.includes(key);
},

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM