Vue-tables-2(vuex)反应性不起作用

时间:2018-04-20 11:05:39

标签: vue.js vuex vue-tables-2

我使用vue-tables-2创建了几个组件,但在更改路径之前,其中一个组件没有更新表。

组件

    <template>
//..
    <div class="table-responsive" >
       <v-client-table ref="table" name="vCardTable" 
          :data="vCardTableData.data" 
          :columns="vCardTableData.headers" 
          :options="vCardTableData.options"/>
    </div> 
//..
    </template>
<script>
import { mapState } from "vuex";
import { mapGetters } from "vuex";

export default {
  name: "VCard",
  computed: {
    ...mapState("commons", ["user"]),
    ...mapGetters({ vCardTableData: "vCard/vCardTableData" })
  },
  mounted() {
    var self = this;
    self.$nextTick(() => {
      self.$store.dispatch("vCard/getVCards"); <-- GET TABLE DATA
    });
  }
};
</script>

商品

const state = {
    vCardTableData: {
        data: [],
        headers: [
           //..
        ],
        options: {
            filterable: false,
            preserveState: false,
            headings: {
                //..
            },
            texts: {
                //..
            },
            pagination: {
                dropdown: true,
            },
            templates: {
                //..
            },
        },
    }
}

const getters = {
    vCardTableData: state => state.vCardTableData
}

const actions = {
    getVCards({commit, dispatch}) {
            return api.request("get", "getvcards").then(response => {
                setTimeout(() => {  
                    commit("setVCardTableData", response.data.vcards);
                }, 300);
            }).catch(error => {
                console.log(error);
            });
    }
}

const mutations = {
    clearTableData: (state) => {
        if (state.vCardTableData.data) {
            state.vCardTableData.data = [];
        }
    },
    setVCardTableData : (state, vCardTableData) => state.vCardTableData.data = vCardTableData   
}

正如您在此图片中所见,该表包含数据:

enter image description here 但是当路线改变时,视图会刷新:

enter image description here

  

2018年2月5日

现在我已经看到,如果我直接在组件中使用promises修改状态:

this.$store.dispatch("vCard/getVCards", []).then((responseData)=>{
       this.$store.state.vCard.vCardTableData.data = responseData;
  }); 

有谁知道为什么? 谢谢

4 个答案:

答案 0 :(得分:2)

我的上一个答案是错误的,我不记得我已将表的vuex参数更改为false。我不知道为什么,但推动它有效:

setVCardTableData : (state, vCardTableData) => {
    vCardTableData.forEach(tableData => {
            state.vCardTableData.data.push(tableData);   
    });
} 

答案 1 :(得分:1)

这可能是一个反应性问题。 (有关详细说明,请参阅https://vuejs.org/v2/guide/reactivity.html#Change-Detection-Caveats。)

更改将突变中的对象值设置为此值的方法应解决问题

setVCardTableData: (state, vCardTableData) => state.vCardTableData = {
    ...state.vCardTableData,
    data: vCardTableData
}

基本上,这会创建一个新对象,以便Vue知道对象已更新。在Javasript中,对象通过引用传递,这意味着vCardTableData不存储对象,它存储对象的引用。您可以将其视为指向内存中对象的指针/地址。当您更改对象中的子属性时,引用保持不变,因此Vue不知道该对象已更新。创建新对象可确保更新对象引用。

Mutations Follow Vue的反应性规则中也对此进行了解释  在https://vuex.vuejs.org/en/mutations.html

答案 2 :(得分:0)

由于它是一个深层对象,你需要在变异中使用Object.assign

setVCardTableData: (state, vCardTableData) => Object.assign(state.vCardTableData.data, vCardTableData)

答案 3 :(得分:0)

我遇到过类似的问题。像其他人已经提到的那样,它可能是一个反应性问题。您可以使用Vue.set()确保在设置状态值时您的属性处于被动状态。

setVCardTableData: (state, vCardTableData) => {
    Vue.set(state.vCardTableData, 'data', vCardTableData);
}

检查official documentation此方法。