如何格式化Vuetify数据表日期列?

IT技术 javascript vue.js vuejs2 vuetify.js nuxt.js
2021-02-23 19:24:17

我有一个使用Vuetify数据表的简单数据表。其中一列是createdOn(日期时间),我想对其进行格式化。我该怎么做 ?

这就是我现在得到的:

这就是我现在得到的

<template>
   <v-layout>
      <v-data-table :headers="headers" :items="logs">
      </v-data-table>
   <v-layout>
</template>
<script>
      headers: [
        { text: "Time", value: "createdOn", dataType: "Date" },
        { text: "Event Source", value: "eventSourceName" },
        { text: "Event Details", value: "eventDetails" },
        { text: "User", value: "user" }
      ],
      items: [],
</script>
5个回答

你应该使用一个custom row cell

<v-data-table :headers="headers" :items="logs">
  <template v-slot:item.createdOn="{ item }">
    <span>{{ new Date(item.createdOn).toLocaleString() }}</span>
  </template>
</v-data-table>
我不知道我能做到这一点。非常感谢@Boussadjra Brahim
2021-04-20 19:24:17
你可能有一个错字,我需要使用单数 item.createdOn 作为 v-slot 属性,复数 items.createdOn 不起作用。
2021-04-23 19:24:17
对我来说有一个问题:如果我通过“2020-07-01”,它会被渲染为“1.7.2020, 02:00:00”,这通常不是你想要的。Javascript 将给定的值作为 UTC 并与用户的偏移量一起显示。
2021-04-28 19:24:17
可以更新此答案,通过更改<template v-slot:item.createdOn="{ item }"><template v-slot:[`item.createdOn`]="{ item }">. 请参阅“v-slot”指令不支持任何修饰符
2021-05-03 19:24:17
@MathiasF 我认为问题出在您的语言环境中,我用给定的输入回答了问题,2019-09-14T17...我建议提出一个包含更多详细信息的新问题
2021-05-13 19:24:17

我找到了一种使用动态插槽名称和标头对象中的函数来格式化单元格值的方法:

<v-data-table>我做的:

<template v-for="header in headers.filter((header) => header.hasOwnProperty('formatter'))" v-slot:[`item.${header.value}`]="{ header, value }">
    {{ header.formatter(value) }}
</template>

在 vuedata属性中我做了:

headers: [
    ...
    { text: 'Value for example', value: '10000', formatter: formatCurrency },
    ...
]

最后在methodsprops中我做了:

formatCurrency (value) {
    return '$' + value / 100
},

这是一个沙箱,可以查看它的运行情况:https : //codesandbox.io/s/vuetify-datatable-value-formatter-jdtxj

编辑:在这种特定情况下,您可以使用momentjs或 javascript 的Date()

是的 - 很棒的工作@SneakyLenny!为我节省了 2 小时。让它适用于更通用的“自定义每列”方法:` <template v-for="header in headers" v-slot:[ item.${header.value}]="{ header, value }" > {{ formatCell(value) }} </模板> `
2021-04-25 19:24:17
@niko 排序基于给定的数据,否则您可以事先格式化数据。示例:如果数据是 4 - 2 - 1 - 3 并且格式化程序会向格式添加随机字母,则显示排序为 y1 - x2 - u3 - a4。如果这是有道理的。
2021-04-28 19:24:17
无论之后选择何种格式,仍然可以对日期列使用排序/过滤器吗?即,此后该表是否使用基础日期或新格式化的字符串作为其内部排序/过滤算法?
2021-04-30 19:24:17

我还使用了带有 v-slot 的全局过滤器:

<v-data-table :headers="headers" :items="logs">
  <template v-slot:item.createdOn="{ item }">
    <span>{{ item.createdOn | myGlobalDateFilter }}</span>
  </template>
</v-data-table>

在数据表组件 Datatable.vue 中

<template v-for="slot in slots" v-slot:[`item.${slot.slotName}`]="{ item }">
  <slot :name="slot.slotName" :variable="item"></slot>
</template>

export default {
props:
slots:{
  type:Array,
  default:null
},

和父组件

<Datatable
 :headers="headers"
  :items="stokhareketleri"
  :title="title"
  :slots="slots">
<template v-slot:column_name="{ variable }">
  <v-chip
        color="green"
        dark
      >
      {{variable.column_name}}
      </v-chip>
</template>
  </Datatable>


data () {
      return {
        slots:[{ 
          Id: 1, slotName: 'column_name'
          }],

如果你想要一个更简单的解决方案,或者至少一个你可以格式化其他列的解决方案:

<v-data-table :headers="headers" :items="logs">
  <template v-slot:body="{ items }">
    <tbody>
      <tr v-for="item in items" :key="logs.id">
        <td> {{ new Date(item.createdOn).toLocaleString() }} </td>
        ...
      </tr>
    </tbody>
  </template>
</v-data-table>

诀窍是使用body的时隙v-data-table更多信息在这里