【问题标题】:Vue component does not show updated data even if prop data is changed即使 prop 数据发生变化,Vue 组件也不显示更新的数据
【发布时间】:2020-07-04 00:27:48
【问题描述】:

这是我的父组件abc.vue

<v-card outlined class="mt-4">
        <DetailsTable v-show="toggleClientData" :columnDefs="columnDefs" :rowData="rowData" />
</v-card>
methods:{
aggridData() {
     let self = this;
      this.columnDefs = [
            {
              header:"name",
              field:"name",
              editable: true,
              onCellValueChanged: function(params) {
               self.updateClient();
              }
             }
           ]
      this.rowData = [{name:"abc",age:21},{name:"xyz",age:23}];
    },
 updateClient(){
   this.rowData[0].name = "cat"
 }
}

现在这是我的子组件DetailsTable.vue

<template>
  <ag-grid-vue
    style="width: 100%; height: 600px"
    class="ag-theme-balham"
    id="myGrid"
    :enableRangeSelection="true"
    :defaultColDef="{
              resizable: true,
              sortable: true,
              filter: true,
              width: 100
            }"
    :columnDefs="columnDefs"
    :processCellForClipboard="processCellForClipboard"
    :rowData="newRowData"
    :modules="[...agModule, ...agCModule]"
  ></ag-grid-vue>
</template>

<script>
import { AgGridVue } from "ag-grid-vue";
import "ag-grid-enterprise";
import { LicenseManager } from "ag-grid-enterprise";
import { AllModules } from "ag-grid-enterprise/dist/ag-grid-enterprise";
import { AllCommunityModules } from "ag-grid-community/dist/ag-grid-community";

LicenseManager.setLicenseKey(process.env.VUE_APP_AG_KEY);
import axios from "axios";

export default {
  name: "DetailsTable",
  props: {
    columnDefs: {
      type: Array,
      default() {
        return null;
      }
    },
    rowData: {
      type: Array,
      default() {
        return null;
      }
    }
  },
  components: {
    "ag-grid-vue": AgGridVue
  },
  data() {
    return {
      agModule: AllModules,
      agCModule: AllCommunityModules
    };
  },
  computed: {
    newRowData() {
      return this.rowData;
    }
  },
  beforeMount() {
    this.processCellForClipboard = params => {
      return `${params.value.trim()},`;
    };
  }
};
</script>

<style lang="sass" scoped>
@import "../../../node_modules/ag-grid-community/dist/styles/ag-grid.css"
@import "../../../node_modules/ag-grid-community/dist/styles/ag-theme-balham.css"
</style>

现在,newRowData 在开始时包含调用 updateclient 方法之前的 rowData 的值。一旦从 ag 网格表中更新了值,就会调用更新客户端函数,然后更改名称。 现在,子组件中的 newRowData 显示了更新后的名称,即 cat,但这在表中没有更新。该表仍显示“abc”。在我下次单击 ag 网格单元格后,它会显示更新的值。有没有办法在不再次单击单元格的情况下显示更新的值 我应该如何实现上述反应。

【问题讨论】:

    标签: vue.js vuetify.js ag-grid vue-reactivity vue-props


    【解决方案1】:

    尝试更新整个数组:

      updateClient(){
    //  this.rowData[0].name = "cat"        delete this line
    
        const updatedRow = {...this.rowData[0], name: "cat"}
        this.rowData.splice(0, 1, updatedRow)
      }
    

    【讨论】:

      【解决方案2】:

      您的反应性似乎有问题。 Vue 文档在这里详细讨论了反应性:https://vuejs.org/v2/guide/reactivity.html

      但是 TLDR,您不能像那样更新数组。你需要告诉 Vue 数组发生了变化。试试

      const theRow = this.rowData[0];
      theRow.name = "cat";
      Vue.set(this.rowData, 0, theRow)
      

      您可能还需要使用Vue.set(theRow, 'name', 'cat') 而不是theRow.name = "cat",不过我并不肯定。

      此外,当 Vue 3 推出时,这将变得不那么困难 - 反应系统将需要更少的手动操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-17
        • 2021-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-04
        • 1970-01-01
        • 2016-11-30
        相关资源
        最近更新 更多