【问题标题】:v-data-table doesn't updates on a new datav-data-table 不会更新新数据
【发布时间】:2018-07-29 03:41:56
【问题描述】:

我在 Vuex 商店中有一个对象 portfoliosData。这个对象有一个属性metrics

  state: {
    portfoliosData: {
      performance: [],
      metrics: []
    },

在执行操作时,我改变了商店中的属性并希望在表格中显示更新。

 <div id="amsample">
  <div id="chartdiv"></div>
   <v-tabs-items  :touchless="true">
      <v-tabs-content :key="0" id="tab-1">
        <v-card flat>
          <v-card-text>
            Return Performance
            <v-data-table
              :headers="headers"
              :items="metrics"
              :custom-sort="sortPercentage"
              hide-actions
              class="elevation-1"
            >
              <template slot="items" scope="props">
                <td>{{ props.item.name }}</td>
                <td class="text-xs-right">{{ props.item.acRet }}</td>
                <td class="text-xs-right">{{ props.item.anRet }}</td>
                <td class="text-xs-right">{{ props.item.anVol }}</td>
                <td class="text-xs-right">{{ props.item.maxDd }}</td>
                <td class="text-xs-right">{{ props.item.sRatio }}</td>
                <td class="text-xs-right">{{ props.item.inRatio }}</td>
              </template>
            </v-data-table>
          </v-card-text>
        </v-card>
      </v-tabs-content>
    </v-tabs-items>
 </div>

在组件表中观察metrics变量。

data() {
      return {

        headers: [
          {text: 'Measure', value: 'name', sortable: false},
          {text: 'Accumulative Return', value: 'acRet'},
          {text: 'Annual Return', value: 'anRet'},
          {text: 'Annual Volatility', value: 'anVol'},
          {text: 'Max Drawdown', value: 'maxDd'},
          {text: 'Sharpe Ratio', value: 'sRatio'},
          {text: 'Information Ratio', value: 'inRatio'},
        ],
        metrics: []
      }
    },

当我在组件中调用操作时,我会从商店获得更新后的 metrics

//Component
  calulateMetrics(event) {
    this.$store.dispatch('performeMetricsCalculation', {dataZoomStart:event.startDate, dataZoomEnd:event.endDate}).then(() => {
      this.metrics = this.$store.getters.getMetrics;
      console.log("Calculated metric", this.metrics)
    })
  },

//actions
performeMetricsCalculation({dispatch, commit, getters}, {dataZoomStart, dataZoomEnd}) {
  //console.log("performeMetricsCalculation", dataZoomStart, dataZoomEnd)

  return new Promise((resolve, reject) => {
    dispatch('performSetRangeTime', {dataZoomStart: dataZoomStart, dataZoomEnd: dataZoomEnd}).then(() => {
      dispatch('performMetrcisUpdating').then(() => {
        commit('resetUpdateStatus')
      })
    })
    resolve()
  })
},

performMetrcisUpdating({commit}) {
  return new Promise((resolve, reject) => {
    commit('calculateMetrics')
    resolve()
  })
},

在调试过程中,我打印了metrics 变量,我发现数据与初始数据不同。但是表格没有更新。

mutations我使用如下逻辑

calculateMetrics({portfoliosData, period, status}) {
  let updatedMetrics = []

  for (let s in portfoliosData.performance) {
    if (portfoliosData.performance.hasOwnProperty(s)) {
      //console.log("Calculate metrics", period.startDateIdx, period.endDateIdx)
      let port = {...portfoliosData.performance[s]}

      updatedMetrics.push({
        name: port.name,
        maxDd: maxDrawdown(port.data, period.startDateIdx, period.endDateIdx),
        acRet: accumulativeReturn(port.data, period.startDateIdx, period.endDateIdx),
        anRet: annualReturn(port.data, period.startDateIdx, period.endDateIdx),
        anVol: annualVolatility(port.data, period.startDateIdx, period.endDateIdx),
        sRatio: sharpeRatio(port.data, period.startDateIdx, period.endDateIdx),
        inRatio: informationRatio(port.data, period.startDateIdx, period.endDateIdx)
      })

      if (!status.isUpdated) {
        portfoliosData.metrics = updatedMetrics
      } else {
        Vue.set(portfoliosData, 'metrics', updatedMetrics)
      }
    }
  }
}

当我在不执行操作的情况下获取数据时,更新表没有问题。但是,当我想更新表格时,新数据不会呈现,尽管 metrics 变量会发生变化。这看起来很奇怪。

我只在这种特定情况下观察到这个问题。我也尝试将:items="metrics" 更改为:items=$store.getters.getMetrics,但它也没有帮助我。

【问题讨论】:

  • 您提到调度到performeMetricsCalculation,但您的突变被命名为calculateMetrics,其参数与您调度的参数不同。这些是错别字吗?如果不是,请说明performeMetricsCalculation 的定义以及calculateMetrics 突变是如何相关的。此外,提供一个 codepen/codesandbox 来重现问题会很有帮助。
  • @tony19 不,这不是错字,我编辑了我的问题并添加了两个调用 calculateMetricsmutation 的操作方法
  • @tony19 我试图用人工数据重现错误但失败了。它工作正常。 codesandbox.io/s/9jz98r2x3o 但我想API部分应该没有问题

标签: javascript vue.js vuetify.js


【解决方案1】:

我觉得你可以把mutations改成

calculateMetrics(state) {
  let {portfoliosData, period, status} = state // ES6 syntax
  let updatedMetrics = []

  for (let s in portfoliosData.performance) {
    if (portfoliosData.performance.hasOwnProperty(s)) {
      //console.log("Calculate metrics", period.startDateIdx, period.endDateIdx)
      let port = {...portfoliosData.performance[s]}

      updatedMetrics.push({
        name: port.name,
        maxDd: maxDrawdown(port.data, period.startDateIdx, period.endDateIdx),
        acRet: accumulativeReturn(port.data, period.startDateIdx, period.endDateIdx),
        anRet: annualReturn(port.data, period.startDateIdx, period.endDateIdx),
        anVol: annualVolatility(port.data, period.startDateIdx, period.endDateIdx),
        sRatio: sharpeRatio(port.data, period.startDateIdx, period.endDateIdx),
        inRatio: informationRatio(port.data, period.startDateIdx, period.endDateIdx)
      })


    }
  }
   portfoliosData.metrics = updatedMetrics
   state.portfoliosData = JSON.parse(JSON.stringify(portfoliosData)) // assign to new object
}

我们需要创建新对象(我使用了 JSON.parse(JSON.stringify()) 技术)以使vuex 了解数据已更改。

【讨论】:

  • 感谢您的回复。稍后我会检查你的解决方案,但乍一看我无法理解这些好处。 Vuex 更新我的数据(我在突变后记录了状态)。同样根据文档(vuejs.org/v2/guide/list.html#Caveats)进行更新,建议使用Vue.set 方法。为什么你认为划分创建属性和更新的逻辑是一个坏主意。
  • 这些警告是在 Vue 组件中使用,而不是在 vuex 商店中使用。请尝试一下,让我知道它是否有效。
  • 我试过了,但问题依然存在。它仍在更新状态,但表不会对此更新做出反应。
猜你喜欢
  • 1970-01-01
  • 2020-10-07
  • 2019-08-28
  • 2020-03-26
  • 2019-09-19
  • 2018-06-26
  • 2021-07-08
  • 2020-03-11
  • 2020-06-10
相关资源
最近更新 更多