【问题标题】:Dynamic table header and value using vuetify data-table使用 vuetify 数据表的动态表头和值
【发布时间】:2020-11-18 14:20:58
【问题描述】:

vuetify数据表如何使用数组对象实现“动态表头列”?是否可以像以下示例一样执行此任务:

    ----------------------------------------------
    | Employee Id | Time in | Time Out | Time In |
    ----------------------------------------------
    | E0001       | 8:00 am | 5:00 pm  | 8:30 am |
    ----------------------------------------------
    | E0002       | 8:00 am | 5:00 pm  |         |
    ----------------------------------------------
    | E0003       |         | 5:00 pm  | 8:00 am |
    ----------------------------------------------

标题栏时间在|超时 | Time In 是“类型”。示例表上用作标题列的日志来自具有最高数量的员工数组对象,然后来自其他员工的以下一些时间日志将遵循表上每个列上显示的特定类型。

我在岩石上迈出了第一步!是从对象中获取具有最高数组编号的员工,即“dtr”数组。通过比较它们的长度并同时获取值,将其用作表格列的标题。

主要问题是,如何使用 Vuetify 数据表来显示它?

[
  {
     employee_id:E0001,   <--- an employee with the highest array of logs 
     dtr:[
           { 
              type:"timein", time:"8:00 am" 
           },
           { 
              type:"timeout", time:"5:00 pm" 
           },
           { 
              type:"timein", time:"8:30 am" 
           }
      ]
  },
  {
     employee_id:E0002,
     dtr:[
           { 
              type:"timein", time:"8:00 am" 
           },
           { 
              type:"timeout", time:"5:00 pm" 
           },
      ]
   },
   {
     employee_id:E0003,
     dtr:[
           { 
              type:"timeout", time:"5:00 pm" 
           },
           { 
              type:"timein", time:"8:00 am" 
           },
      ]
   } 
]

【问题讨论】:

    标签: vue.js vuetify.js


    【解决方案1】:

    是的,可以在Vue 和使用Vuetify 中实现这一点。您只需要使用计算属性来转换标题和实际行。

    如果您查看 vuetify 的数据表文档,它会将标头作为 textvalue 对的数组。所以这意味着,我们需要以 vuetify 可以理解的方式转换我们的数据。

    首先,只需将记录分配给数据部分中名为日志的变量。

    new Vue({
      el: "#app",
      vuetify: new Vuetify(),
      data() {
        return {
          logs: []
        };
      },
    

    在mounted或created hooks中,我们可以通过一些可能来自API请求的实际数据来初始化数据。

    new Vue({
      el: "#app",
      vuetify: new Vuetify(),
      data() {
        return {
          logs: []
        };
      },
      computed: {
        //will see how to implement this
      },
      methods: {
        getLogs() {
          return [
            {
              employee_id: "E0001",
              dtr: [
                {
                  type: "timein",
                  time: "8:00 am"
                },
                {
                  type: "timeout",
                  time: "5:00 pm"
                },
                {
                  type: "timein",
                  time: "8:30 pm"
                },
                {
                  type: "timeout",
                  time: "8:45 pm"
                },
                {
                  type: "timein",
                  time: "10:45 pm"
                }
              ]
            },
            {
              employee_id: "E0002",
              dtr: [
                {
                  type: "timein",
                  time: "8:00 am"
                },
                {
                  type: "timeout",
                  time: "5:00 pm"
                }
              ]
            },
            {
              employee_id: "E0003",
              dtr: [
                {
                  type: "timeout",
                  time: "5:00 pm"
                },
                {
                  type: "timein",
                  time: "8:00 am"
                }
              ]
            }
          ];
        },
        initLogs() {
          this.logs = this.getLogs();
        }
      },
      created() {
        //init log can be use fetch data API with a little bit of change
        this.initLogs();
      }
    });
    

    现在最重要的部分是计算属性,它将构造数据表所需的实际数据。我们需要一个用于 headersitems 的计算属性。 这是返回 employee_idtimeintimeout 标题行的 logHeader 计算属性。

    logHeaders() {
          // tranforms the logs to find out which is the longest row
          let logRecords = this.logs.map((log) => {
            let dtrTypes = [];
            log.dtr.forEach((d) => dtrTypes.push(d.type));
            return {
              employee_id: log.employee_id,
              dtrLength: log.dtr.length,
              dtrTypes: dtrTypes
            };
          });
    
          let records = _.sortBy(logRecords, ["dtrLength"]);
          // find the longest record
          let longestRecord = records[records.length - 1];
          let headers = [];
    
          console.log("records: ", records[records.length - 1]);
          //construct the header row
          headers.push({
            text: "employee_id",
            value: "employee_id"
          });
    
          // inside object we can only store unique keys!!
          //index plays a crucial role in this as it changes
          // timein to be timein1. timein2 so on
    
          longestRecord.dtrTypes.forEach((type, index) =>
            headers.push({ text: type, value: type + "" + index })
          );
          console.log("headers", headers);
          return headers;
        },
    

    这会给我们一个对象数组,如下所示

    [ 
      { name: 'employee_id', value: 'employee_id' },
      { name: 'timein', value: 'timein' },
      { name: 'timeout', value: 'timeout' }
    ]
    

    注意:由于对象不能有重复的键,如果有另一个 timein 条目这会产生问题,所以我们只需要为标题值添加索引,以便我们可以添加更多 timeintimeout具有不同的值,例如 timin1timeout1

    所以上面的函数使用索引来添加相同的键文本但具有不同的值。

    [
      { name: "employee_id", value: "employee_id" },
      { name: "timein", value: "timein0" },
      { name: "timeout", value: "timeout1" },
      { name: "timein", value: "timein2"  } // here
    ];
    

    最后,logRows 计算属性将 logs 数组转换为我们的数据表所需的数据类型。

    logRows() {
          let logR = this.logs.map((log) => {
            let dtrRecord = {};
            // construct the rows accroding to headers
            log.dtr.forEach(
              // index is also crucial here
              (d, index) => (dtrRecord[d.type + "" + index] = d.time)
            );
            return Object.assign(
              {},
              { employee_id: log.employee_id, ...dtrRecord }
            );
          });
          return logR;
        }
    

    在视图中,我们只需要使用这个headersrows 作为数据表的输入。

      <div>
        <v-data-table :headers="logHeaders" :items="logRows"></v-data-table>
      </div>
    

    如果你把所有的点点滴滴连接在一起,它看起来像下面这样。

    new Vue({
      el: "#app",
      vuetify: new Vuetify(),
      data() {
        return {
          logs: []
        };
      },
      computed: {
        logHeaders() {
          // tranforms the logs to find out which is the longest
          // row
          let logRecords = this.logs.map((log) => {
            let dtrTypes = [];
            log.dtr.forEach((d) => dtrTypes.push(d.type));
            return {
              employee_id: log.employee_id,
              dtrLength: log.dtr.length,
              dtrTypes: dtrTypes
            };
          });
    
          let records = _.sortBy(logRecords, ["dtrLength"]);
          // find the longest record
          let longestRecord = records[records.length - 1];
          let headers = [];
    
          console.log("records: ", records[records.length - 1]);
          //construct the header row
          headers.push({
            text: "employee_id",
            value: "employee_id"
          });
    
          // inside object we can only store unique keys!!
          //index plays a crucial role in this as it changes
          // timein to be timein1. timein2 so on
    
          longestRecord.dtrTypes.forEach((type, index) =>
            headers.push({ text: type, value: type + "" + index })
          );
          console.log("headers", headers);
          return headers;
        },
        logRows() {
          let logR = this.logs.map((log) => {
            let dtrRecord = {};
            // construct the row accroding to headers
            // checkour
            log.dtr.forEach(
              (d, index) => (dtrRecord[d.type + "" + index] = d.time)
            );
            return Object.assign(
              {},
              { employee_id: log.employee_id, ...dtrRecord }
            );
          });
          return logR;
        }
      },
      methods: {
        getLogs() {
          return [
            {
              employee_id: "E0001",
              dtr: [
                {
                  type: "timein",
                  time: "8:00 am"
                },
                {
                  type: "timeout",
                  time: "5:00 pm"
                },
                {
                  type: "timein",
                  time: "8:30 pm"
                },
                {
                  type: "timeout",
                  time: "8:45 pm"
                },
                {
                  type: "timein",
                  time: "10:45 pm"
                }
              ]
            },
            {
              employee_id: "E0002",
              dtr: [
                {
                  type: "timein",
                  time: "8:00 am"
                },
                {
                  type: "timeout",
                  time: "5:00 pm"
                }
              ]
            },
            {
              employee_id: "E0003",
              dtr: [
                {
                  type: "timein",
                  time: "8:00 am"
                },
                {
                  type: "timeout",
                  time: "5:00 pm"
                }
              ]
            }
          ];
        },
        initLogs() {
          this.logs = this.getLogs();
        }
      },
      created() {
        this.initLogs();
      }
    });
    

    这是一个有效的codepen,可以看到这个实现的实际效果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 2022-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多