用vue js隐藏表格列

Posted

技术标签:

【中文标题】用vue js隐藏表格列【英文标题】:Hide table column with vue js 【发布时间】:2017-11-02 17:11:14 【问题描述】:

Hello我需要隐藏或显示我的DataTable的列,我不知道这样做的好的做法,当检查列复选上的时间将显示,如果它没有检查,则将隐藏列? 我正在使用 vuetify https://codepen.io/anon/pen/rmXwYG?editors=1010

这是我的脚本:

new Vue(
    el: '#app',
    data() 
      return 
        search: '',
        totalItems: 0,
        items: [],
        loading: true,
        pagination: ,
        columns: [],
        headers: [
                text: 'Dessert (100g serving)',
                left: true,
                sortable: false,
                value: 'name'
            ,
            
                text: 'Calories',
                value: 'calories'
            ,
            
                text: 'Fat (g)',
                value: 'fat'
            ,
            
                text: 'Carbs (g)',
                value: 'carbs'
            ,
            
                text: 'Protein (g)',
                value: 'protein'
            ,
            
                text: 'Sodium (mg)',
                value: 'sodium'
            ,
            
                text: 'Calcium (%)',
                value: 'calcium'
            ,
            
                text: 'Iron (%)',
                value: 'iron'
            
        ]
    
    ,
    watch: 
        pagination: 
            handler() 
                this.getDataFromApi()
                    .then(data => 
                        this.items = data.items
                        this.totalItems = data.total
                    )
            ,
            deep: true
        
    ,
    mounted() 
        this.getDataFromApi()
            .then(data => 
                this.items = data.items
                this.totalItems = data.total
            )
    ,
    methods: 
        getDataFromApi() 
            this.loading = true
            return new Promise((resolve, reject) => 
                const 
                    sortBy,
                    descending,
                    page,
                    rowsPerPage
                 = this.pagination

                let items = this.getUsers()
                const total = items.length

                if (this.pagination.sortBy) 
                    items = items.sort((a, b) => 
                        const sortA = a[sortBy]
                        const sortB = b[sortBy]

                        if (descending) 
                            if (sortA < sortB) return 1
                            if (sortA > sortB) return -1
                            return 0
                         else 
                            if (sortA < sortB) return -1
                            if (sortA > sortB) return 1
                            return 0
                        
                    )
                

                if (rowsPerPage > 0) 
                    items = items.slice((page - 1) * rowsPerPage, page * rowsPerPage)
                

                setTimeout(() => 
                    this.loading = false
                    resolve(
                        items,
                        total
                    )
                , 1000)
            )
        ,
        getUsers() 
            return [
                    value: false,
                    name: 'Frozen Yogurt',
                    calories: 159,
                    fat: 6.0,
                    carbs: 24,
                    protein: 4.0,
                    sodium: 87,
                    calcium: '14%',
                    iron: '1%'
                ,
                
                    value: false,
                    name: 'Ice cream sandwich',
                    calories: 237,
                    fat: 9.0,
                    carbs: 37,
                    protein: 4.3,
                    sodium: 129,
                    calcium: '8%',
                    iron: '1%'
                ,
                
                    value: false,
                    name: 'Eclair',
                    calories: 262,
                    fat: 16.0,
                    carbs: 23,
                    protein: 6.0,
                    sodium: 337,
                    calcium: '6%',
                    iron: '7%'
                ,
                
                    value: false,
                    name: 'Cupcake',
                    calories: 305,
                    fat: 3.7,
                    carbs: 67,
                    protein: 4.3,
                    sodium: 413,
                    calcium: '3%',
                    iron: '8%'
                ,
                
                    value: false,
                    name: 'Gingerbread',
                    calories: 356,
                    fat: 16.0,
                    carbs: 49,
                    protein: 3.9,
                    sodium: 327,
                    calcium: '7%',
                    iron: '16%'
                ,
                
                    value: false,
                    name: 'Jelly bean',
                    calories: 375,
                    fat: 0.0,
                    carbs: 94,
                    protein: 0.0,
                    sodium: 50,
                    calcium: '0%',
                    iron: '0%'
                ,
                
                    value: false,
                    name: 'Lollipop',
                    calories: 392,
                    fat: 0.2,
                    carbs: 98,
                    protein: 0,
                    sodium: 38,
                    calcium: '0%',
                    iron: '2%'
                ,
                
                    value: false,
                    name: 'Honeycomb',
                    calories: 408,
                    fat: 3.2,
                    carbs: 87,
                    protein: 6.5,
                    sodium: 562,
                    calcium: '0%',
                    iron: '45%'
                ,
                
                    value: false,
                    name: 'Donut',
                    calories: 452,
                    fat: 25.0,
                    carbs: 51,
                    protein: 4.9,
                    sodium: 326,
                    calcium: '2%',
                    iron: '22%'
                ,
                
                    value: false,
                    name: 'KitKat',
                    calories: 518,
                    fat: 26.0,
                    carbs: 65,
                    protein: 7,
                    sodium: 54,
                    calcium: '12%',
                    iron: '6%'
                
            ]
        
    
)

【问题讨论】:

***.com/questions/5440657/… 【参考方案1】:

简短的回答是使用计算属性来决定将包含哪些列。

您的数据表包含标题列表和项目列表(行)。我已向您的 Vue 添加了几个计算属性,以返回 包含在数据表结果中的列列表。

computed:
  filteredHeaders()
    return this.headers.filter(h => h.selected)
  ,
  filteredItems()
    return this.items.map(item => 
      let filtered = Object.assign(, item)
      this.headers.forEach(header => 
        if (!header.selected) delete filtered[header.value]
      )
      return filtered
    )
  
,

请注意,这些计算值正在使用名为 selected 的标头属性。我将该属性添加到您的标题列表中,以允许您选择将包含在输出中的标题。


  text: 'Fat (g)',
  value: 'fat',
  selected: true
,

接下来,您的复选框需要使用该属性作为它们的模型。

<v-checkbox v-bind:label="header.text" v-model="header.selected" :value="header.selected" ></v-checkbox>

最后,每行都有一个模板。我对其进行了修改以检查是否启用了每一列。

<template slot="items" scope="props">
  <td v-if="showColumn('name')"> props.item.name </td>
  <td v-if="showColumn('calories')"  class="text-xs-right"> props.item.calories </td>
  <td v-if="showColumn('fat')"  class="text-xs-right"> props.item.fat </td>
  <td v-if="showColumn('carbs')"  class="text-xs-right"> props.item.carbs </td>
  <td v-if="showColumn('protein')"  class="text-xs-right"> props.item.protein </td>
  <td v-if="showColumn('sodium')"  class="text-xs-right"> props.item.sodium </td>
  <td v-if="showColumn('calcium')"  class="text-xs-right"> props.item.calcium </td>
  <td v-if="showColumn('iron')"  class="text-xs-right"> props.item.iron </td>
</template>

这是该模板中使用的showColumn 方法。

showColumn(col)
  return this.headers.find(h => h.value === col).selected
,

最后,这是working example。

显然,这没有经过调整或任何其他调整,它只是一个初始的“让它工作”的版本。但它应该能让你继续前进。

【讨论】:

@codinga 这回答了你的问题吗? 是的,非常感谢你,我承认你总是帮助我【参考方案2】:

只需设置 fields 属性以仅定义您希望显示的列。

【讨论】:

【参考方案3】:

也循环所有字段

示例: &lt;b-table striped hover :items="items" :fields="fields"&gt;&lt;/b-table&gt;

享受吧。

【讨论】:

以上是关于用vue js隐藏表格列的主要内容,如果未能解决你的问题,请参考以下文章

vue表格多选、vue动态显示隐藏表格列、vue动态多列排序

若依vue实现动态表格,可动态查询条件,控制列的显示隐藏及操作权限

若依vue实现动态表格,可动态查询条件,控制列的显示隐藏及操作权限

若依vue实现动态表格,可动态查询条件,控制列的显示隐藏及操作权限

若依vue实现动态表格,可动态控制列的显示隐藏及操作权限

隐藏列时如何保留表格列的宽度?