vue.js - 按显示文本(而非模型)对 Vuetify 表进行排序

标签 vue.js vuetify.js

Vuetify.js 数据表组件具有内置排序功能,但它根据模型中的数据而不是显示给客户端的文本进行排序。

在下面的示例中,“年龄”的原始值(例如“EIGHTEEN_TO_TWENTY”)被转换为更易读的格式(例如“18-20”)。但由于 Vuetify 按模型排序,它按 EIGHTEEN < FIFTEEN < TWENTYONE 排序,而不是 15 < 18 < 21。有没有办法按计算/显示的值排序?

Vue.use(Vuetify);
vue = new Vue({
    el: '#main',
    data: {
        members: [{name: 'Bob', age: 'FIFTEEN_TO_SEVENTEEN', id: 1},
          {name: 'Sue', age: 'EIGHTEEN_TO_TWENTY', id: 2},
          {name: 'Bill', age: 'TWENTYONE_TO_TWENTYFOUR', id: 3}],
        ageLabels: {FIFTEEN_TO_SEVENTEEN : '15-17',
          EIGHTEEN_TO_TWENTY : '18-20',
          TWENTYONE_TO_TWENTYFOUR : '21-24'},
        tableFields: [{value: 'name', text: 'Name'},
            {value: 'age', text: 'Age'},
            {value: 'id', text: 'ID'}]
    }
});
<!DOCTYPE html>
<html lang="en">
<head>
    <link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons" rel="stylesheet">
    <link href="https://cdn.jsdelivr.net/npm/vuetify/dist/vuetify.min.css" rel="stylesheet">
</head>
<body>
    <div id=main>
    <v-data-table :headers="tableFields" :items="members" data-app>
        <template v-slot:items="props">
            <td>{{ props.item.name }}</td>
            <td>{{ ageLabels[props.item.age] }}</td>
            <td>{{ props.item.id }}</td>
        </template>
    </v-data-table>
    </div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.8/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vuetify/dist/vuetify.js"></script>
</body>

最佳答案

您可以使用 Vue 的计算属性功能根据您的需要更改默认数据模型。

为此,模板的更改为:

<div id="main">
  <v-data-table :headers="tableFields" :items="formatMembers" disable-initial-sort data-app>
    <template v-slot:items="props">
      <td>{{ props.item.name }}</td>
      <td>{{ props.item.age }}</td>
      <td>{{ props.item.id }}</td>
    </template>
  </v-data-table>
</div>

在这里,我将 :items 绑定(bind)到计算属性“formatMembers”,而不是数据中的原始“成员”。我添加了一个新的“disable-initial-sort”属性来禁用 vuetify 的默认初始排序,该排序按第一列对表进行排序(在您的情况下,它是名称列)。

然后在脚本中使用计算属性,如下所示:

<script>
  Vue.use(Vuetify);
  let vue = new Vue({
    el: "#main",
    data: {
      members: [{
        name: "Bob",
        age: "FIFTEEN_TO_SEVENTEEN",
        id: 1
      }, {
        name: "Sue",
        age: "EIGHTEEN_TO_TWENTY",
        id: 2
      }, {
        name: "Bill",
        age: "TWENTYONE_TO_TWENTYFOUR",
        id: 3
      }],
      ageLabels: {
        FIFTEEN_TO_SEVENTEEN: "15-17",
        EIGHTEEN_TO_TWENTY: "18-20",
        TWENTYONE_TO_TWENTYFOUR: "21-24"
      },
      tableFields: [{
        value: "name",
        text: "Name"
      }, {
        value: "age",
        text: "Age"
      }, {
        value: "id",
        text: "ID"
      }]
    },
    computed: {
      formatMembers() {
        let newMembers = this.members.slice();
        newMembers.map((el, id) => (el.age = this.ageLabels[el.age]));
        return newMembers;
      }
    }
  });
</script>

这是工作 codesandbox链接

关于vue.js - 按显示文本(而非模型)对 Vuetify 表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55231188/

相关文章:

javascript - 如何使用vue组件和laravel Controller 上传文件[Axios]

javascript - 如何使用 Vue Cli 3 添加对 PDF 文件的支持?

vue.js - Vuetify 自动完成 - 如何传递默认值?

vue.js - 如何仅在移动设备上将所有 <v-col> 设置为一个下一个?

vue.js - 设置加载覆盖层的不透明度

symfony - Vuetify 在 symfony 项目中

javascript - 如何在路由器 View 转换中添加 Logo ?

javascript - 更新 VueJS 数据对象时 DOM 没有更新

html - 如果使用 Javascript 输入和选择框为空,如何检查页面加载

vue.js - v-switch vuetify 按钮上的图标