Vue 为每个计算属性

Mat*_*ell 4 vue.js computed-properties vuetify.js

这个问题可能有一个非常简单的解决方法,但我似乎无法让它正常工作。我正在使用 Vuetify 数据表来循环并显示我的所有属性,但是当我使用计算属性时它似乎无法正常工作。我正在尝试将一些道具(街道、城市、州、邮编)组合到一个计算地址道具中。因此,当我单独使用每个道具时,它可以像这样正常工作:

<td class="text-xs-center">{{ props.item.street }}</td>
<td class="text-xs-center">{{ props.item.city }}</td>
<td class="text-xs-center">{{ props.item.state }}</td>
<td class="text-xs-center">{{ props.item.zip }}</td>
Run Code Online (Sandbox Code Playgroud)

但是,如果在我的 Vue 模板的脚本部分,我创建了一个计算属性“fullAddress”,如:

computed: {
  fullAddress () {
    return this.street & '\n' & this.city & ', ' & this.state & ' ' & this.zip
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在上面的模板中使用它,例如:

<td class="text-xs-center">{{ props.item.fullAddress() }}</td>
Run Code Online (Sandbox Code Playgroud)

它根本不起作用。我也尝试了许多其他方法来写出来,但没有任何效果。我是 Vue 的新手以及它如何使用计算属性,所以我确信我只是不了解它是如何正常工作的。

编辑:我正在使用 Vuetify 数据表来循环我的数据。我正在使用他们的文档来显示表格。就像我说的,我是 Vue 的新手,所以我想弄清楚这一切。我相信 :items="items" 是所有道具的 v-bind(类似于 v-for 循环?)。下面是一个更完整的例子,展示了 Vuetify 对一个非常简单的数据表的作用:

<template>
  <v-data-table
    :headers="headers"
    :items="items"
    hide-actions
    class="elevation-1"
  >
    <template slot="items" slot-scope="props">
      <td>{{ props.item.name }}</td>
      <td class="text-xs-right">{{ props.item.street }}</td>
      <td class="text-xs-right">{{ props.item.city }}</td>
      <td class="text-xs-right">{{ props.item.state }}</td>
      <td class="text-xs-right">{{ props.item.zip }}</td>
    </template>
  </v-data-table>
</template>

<script>
  export default {
    data () {
      return {
        headers: [
          {
            text: 'Name',
            sortable: false,
            value: 'name'
          },
          { text: 'Street', value: 'street' },
          { text: 'City', value: 'city' },
          { text: 'State', value: 'state' },
          { text: 'Zip Code', value: 'zip' }
        ],
        items: [
          {
            name: 'Braums',
            street: '159 W Elm St',
            city: 'St. Louis',
            state: 'MO',
            zip: 83607
          },
          {
            name: 'McDonalds',
            street: '237 N Cup Way',
            city: 'Dallas',
            state: 'TX',
            zip: 47621
          }
        ]
      }
    }
  }
</script>
Run Code Online (Sandbox Code Playgroud)

Roy*_*y J 6

感谢您扩展您的问题。

你不能做什么:你不能有一个计算数组,因为计算不与数据项相关联,它们与组件相关联。您建议编写它的方式,计算必须this对每个item. 但它this是组件。

您可以创建一个基于items返回每个值的计算,并items增加fullAddress您为该项目计算的值。请注意,您应该小心不要修改您的原始文件item;我Object.assign用来创建一个新副本。

然后你将计算出的数组传递给你的 v-table 而不是传递 items.

我只是用新变量代替 street 来表明它有效。

Vue.use(Vuetify);

new Vue({
  el: '#app',
  data() {
    return {
      headers: [{
          text: 'Name',
          sortable: false,
          value: 'name'
        },
        {
          text: 'Street',
          value: 'street'
        },
        {
          text: 'City',
          value: 'city'
        },
        {
          text: 'State',
          value: 'state'
        },
        {
          text: 'Zip Code',
          value: 'zip'
        }
      ],
      items: [{
          name: 'Braums',
          street: '159 W Elm St',
          city: 'St. Louis',
          state: 'MO',
          zip: 83607
        },
        {
          name: 'McDonalds',
          street: '237 N Cup Way',
          city: 'Dallas',
          state: 'TX',
          zip: 47621
        }
      ]
    }
  },
  computed: {
    itemsWithFullAddress() {
      // This creates a new empty object, copies the item into it,
      // then calculates `fullAddress` and copies that entry into it
      return this.items.map((obj) => Object.assign({}, obj, {
        fullAddress: `${obj.street}\n${obj.city}, ${obj.state} ${obj.zip}`
      }));
    }
  }
});
Run Code Online (Sandbox Code Playgroud)
<link href="//unpkg.com/vuetify/dist/vuetify.min.css" rel="stylesheet" />
<script src="//unpkg.com/vue@latest/dist/vue.js"></script>
<script src="//unpkg.com/vuetify/dist/vuetify.min.js"></script>
<div id="app">
  <v-data-table :headers="headers" :items="itemsWithFullAddress" hide-actions class="elevation-1">
    <template slot="items" slot-scope="props">
      <td>{{ props.item.name }}</td>
      <td class="text-xs-right">{{ props.item.fullAddress }}</td>
      <td class="text-xs-right">{{ props.item.city }}</td>
      <td class="text-xs-right">{{ props.item.state }}</td>
      <td class="text-xs-right">{{ props.item.zip }}</td>
    </template>
  </v-data-table>
</div>
Run Code Online (Sandbox Code Playgroud)