【问题标题】:Vuetify Data tables render nested dataVuetify 数据表呈现嵌套数据
【发布时间】:2020-08-08 21:20:31
【问题描述】:

我有以下 JSON 数据:

[
  {
    "amount": 75,
    "date": "2020-04-22",
    "entradas": [
      {
        "date": "2020-04-22",
        "amount": "100.00",
        "title": "test 1"
      },
      {
        "date": "2020-04-22",
        "amount": "-25.00",
        "title": "test 2"
      }
    ]
  },
  {
    "amount": 10,
    "date": "2020-04-30",
    "entradas": [
      {
        "date": "2020-04-30",
        "amount": "10.00",
        "title": "test 3"
      }
    ]
  }
]

我想要实现的是将所有这些“entradas”记录一起呈现,因此在这种情况下,它应该在数据表中呈现 3 行,每个“entradas”对应一个。

我有以下通过axios加载json的基本方法:

    methods: {
        loadData () {
            axios.get('dataapi')
                    .then(response => this.dataItems = response.data)
        },
    }

    data () {
        return {
            headers: [
                {
                    text: 'Data',
                    align: 'start',
                    sortable: false,
                    value: 'date',
                },
                { text: 'Title', value: 'title', sortable: false },
                { text: 'Amount', value: 'amount', sortable: false },
            ],
            dataItems: []
        }
    },
<template>
    <v-app id="testdatatable">
        <v-data-table
        :headers="headers"
        :items="dataItems.entradas"
        class="elevation-1"
        ></v-data-table>
    </v-app>
</template>

问题是当我使用:items="dataItems.entradas" 时,它不会渲染任何东西。如果我只使用:items="dataItems" 并且在标题处使用value: 'entradas.title' 之类的东西,也会出现同样的问题

我已经尝试了一些使用 .map 函数的解决方法,因为我似乎有一些类似的例子,但我不知道在这种情况下这有什么帮助......

【问题讨论】:

    标签: vue.js vuejs2 datatables vuetify.js


    【解决方案1】:

    您应该只需要一个简单的reduce 来展平嵌套项数组。

      methods: {
            loadData () {
                axios.get('dataapi')
                      .then((response) => {
                          this.dataItems = response.data.reduce(function(acc, v) {
                                 return [...acc, ...v.entradas]
                          },[])
                      })
            },
        }
    
      <v-data-table
        :headers="headers"
        :items="dataItems"
        class="elevation-1"
      ></v-data-table>
    

    Demo (see flatItems() computed)

    【讨论】:

      【解决方案2】:

      试试这个

      ...
      data () {
          return {
              headers: [
                  {
                      text: 'Data',
                      align: 'start',
                      sortable: false,
                      value: 'date',
                  },
                  { text: 'Title', value: 'title', sortable: false },
                  { text: 'Amount', value: 'amount', sortable: false },
              ],
              dataItems: [],
          }
      },
      methods: {
          loadData () {
              axios
                  .get('dataapi')
                  .then(response => {
                      this.dataItems = response.data.map(dataItem => {
                          const { amount, date, entradas } = dataItem
      
                          entradas.map(entrada => {
                              return {
                                  amount, 
                                  date,
                                  ...entrada
                              }
                          })
                      })
                  })
          },
      }
      ...
      <template>
          <v-app id="testdatatable">
              <v-data-table
                  :headers="headers"
                  :items="dataItems"
                  class="elevation-1"
              ></v-data-table>
          </v-app>
      </template>
      

      【讨论】:

      • dataItems 产生了 2 条未知记录
      猜你喜欢
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2019-11-13
      • 2021-03-18
      • 2018-09-02
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多