当我有一个插槽主体的自定义实现时,我不知道如何使用Vuetify v2为我的data-table实现select all选项.

下面是一个小例子:

<template>
  <v-card
    max-width="300"
    class="pa-6"
  >
    <v-data-table
      :items="tasks"
      :headers="headers"
      show-select
      dense
    >
      <template v-slot:body="{ items }">
        <tbody>
          <tr
            v-for="item in items"
            :key="item.id"
          >
            <td>
              <v-checkbox
                v-model="selectedTasks"
                :value="item.id"
                style="margin:0px;padding:0px"
                hide-details
              />
            </td>
            <td>{{ item.text }}</td>
            <td>
              <v-btn
                text
                icon
                x-small
              >
                <v-icon>pageview</v-icon>
              </v-btn>
            </td>
          </tr>
        </tbody>
      </template>
    </v-data-table>
  </v-card>
</template>
<script>
export default {
  data() {
    return {
      headers: [
        { text: 'task', value: 'text' },
        { text: 'actions' }
      ],
      selectedTasks: []
    }
  },
  computed: {
    tasks() {
      return [
        { id: 1, text: 'Collect packets' },
        { id: 2, text: 'Buy bread' }
      ]
    }
  }
}
</script>

这将生成以下数据表:

enter image description here

现在我想实现的是,当选中复选框"all"(如上图所示)时,它会 Select 表中的所有行.

doc说要实现插槽header.data-table-select来定制select all按钮,我可以在下面关于slots的示例中找到数据表的示例.

<template v-slot:header.data-table-select="{ on , props }">
    <v-simple-checkbox
       color="purple"
       v-bind="props"
       v-on="on"
    />
</template>

但是,当我选中此框时,我无法 Select 所有行.我没有找到任何关于如何使用"自定义"表体实现全选的示例.希望有人能帮我.

推荐答案

数据表v-model需要设置为selectedItems,并选中"需要具有项目集合值"复选框.

<!DOCTYPE html>
<html>

<head>
<link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/@mdi/font@3.x/css/materialdesignicons.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui">
</head>

<body>
<div id="app">
    <v-app>
        <v-content>
            <v-container>
                <h2>Data Table</h2>

                <v-data-table v-model="selectedTasks" :headers="headers" :items="tasks" item-key="id" show-select>

                    <template v-slot:body="{ items }">
                        <tbody>
                            <tr v-for="item in items" :key="item.id">
                                <td>
                                    <v-checkbox v-model="selectedTasks" :value="item" style="margin:0px;padding:0px"
                                        hide-details />
                                </td>
                                <td>{{ item.text }}</td>
                                <td>
                                    <v-btn text icon x-small>
                                        Edit
                                    </v-btn>
                                </td>
                            </tr>
                        </tbody>
                    </template>
                </v-data-table>
                <v-btn v-on:click="addTask()">Add Task</v-btn>
            </v-container>
        </v-content>
    </v-app>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>
<script>
    new Vue({
        el: '#app',
        vuetify: new Vuetify(),

        data() {
            return {
                headers: [
                    {
                        text: 'Task',
                        value: 'text'
                    },
                    {
                        text: 'Actions'
                    }
                ],
                tasks: [
                    {
                        id: 1,
                        text: 'Collect packets'
                    },
                    {
                        id: 2,
                        text: 'Buy bread'
                    }
                ],
                selectedTasks: []
            }
        },
        methods: {
            addTask() {
                this.tasks = this.tasks.map(t => ({...t}))
                this.tasks.push({id: this.tasks.length + 1, text: 'New Task'});

                this.selectedTasks = this.selectedTasks.map(t => {
                    return this.tasks.find(e => e.id == t.id) || t;
                })
            }
        }
    })
</script>
</body>

</html>

Vue.js相关问答推荐

Nuxt.js i18n不提供默认区域设置中的页面而不重定向

Vue 和 Nuxt 之间生命周期钩子的不同行为

将初始值设置为可直接在 HTML 中使用的 vue.js 模型

在重复表行中

使用 Laravel 作为后端刷新 Vue.js SPA 的身份验证令牌

无需直接 DOM 操作即可绘制d3-axis

VueJS 插件的如何react式绑定?

Vuelidate 判断true/false

未捕获的错误:[vue-composition-api] 必须在使用任何函数之前调用 Vue.use(plugin)

如何为 Vue 项目设置 lint-staged?

包含 Vue.js v-if 和 v-for 指令的 HTML 标签在加载时flash

Vue @click 不适用于存在 href 的anchor锚标记

如何使用 laravel-mix 将 bootstrap-vue 加载到 Laravel 5 中?

store 的 Vuex Classic 模式已弃用,将在 Nuxt 3 中删除

错误:vue-loader 要求 @vue/compiler-sfc 存在于依赖树中

Vuetify - 根据另一个 Select 选项过滤 Select 数据

如何禁用 nuxt 默认错误重定向

如何使用 JavaScript 按索引删除数组元素?

根据nuxt中的url参数动态加载组件

Vue v-model 不响应 BS4 单选按钮组