使用分派后更新状态

时间:2019-05-15 09:10:44

标签: javascript vue.js vuejs2 vuex

我正在使用vuex,我有一个action

storeExpense(context, params){
    axios.post('api/expenses', params)
    .then( response => {
        console.log("Expense Created");
    })
    .catch( error => {
        console.log(error);
    });
}

并通过以下操作在我的Expense.vue即时通讯上使用

this.$store.dispatch('storeExpense',this.expense)
.then( response => {
   this.modalShow = false
   this.$swal(
   'Success',
   'Expense has been created!',
   'success'
   )
})

我没有错误,但是费用创建后状态没有更新,因此我需要刷新页面以使表获取最新数据。

我有一个名为

的突变
mutateExpenses(state, payload){
 state.expenses = payload
}

但是,当我在响应后使用它时,它会将整个state.expenses对象覆盖为单个对象,因为this.expense是单个对象

我是vuex的新手。

1 个答案:

答案 0 :(得分:1)

您必须使用操作内部调用的突变来更新商店。 我建议您深入研究Vuex documentation,尤其是突变和动作:)

这里是如何使用商店的示例:

进行分发-> 动作-> 变异

// Your store
const store = new Vuex.Store({
  state: {
    posts: [],
    isLoading: false
  },

  mutations: {
    // Must be called by actions AND ONLY by actions
    add(state, post) {
      // Add the given post to the 'posts' array in our state
      Vue.set(state.posts, state.posts.length, post)
    },
    busy(state) {
      Vue.set(state, 'isLoading', true)
    },
    free(state) {
      Vue.set(state, 'isLoading', false)
    }
  },
  actions: {
    create({
      commit
    }, post) {
      commit('busy')
      axios.post('https://jsonplaceholder.typicode.com/posts', post)
        .then(response => {
          // Call the mutation method 'add' to add the newly created post
          commit('add', response.data)
        })
        .catch((reason) => {
          // Handle errors
        })
        .finally(() => {
          commit('free')
        });
    },
  }
})

// Your Vue app
new Vue({
  el: "#app",
  store,
  data: {
    post: {
      title: 'foo',
      body: 'bar',
      userId: 1
    }
  },
  methods: {
    onButtonClicked() {
      this.$store.dispatch('create', this.post)
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vuex/3.1.0/vuex.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.min.js"></script>
<div id="app">
  <button @click="onButtonClicked">Create Post</button>
  <div>Posts : <span v-if="$store.state.isLoading">Requesting</span></div>
  <div v-for="post in $store.state.posts">
    {{post}}
  </div>
</div>