繁体   English   中英

无法在 function 中访问 vuex state

[英]Cannot access vuex state inside a function

我正在开发一个 Laravel+Vue 应用程序。 我正在使用 Vuex 进行 state 管理。 我正在尝试验证我的表格。 一切进展顺利,但我遇到了一个问题。问题是当我第一次尝试提交表单时, validationError state 返回null (默认 Z9ED39E2EA931586B6A985A6942EF573E 未更新)。 当我再次提交表单(检查验证)时,它会在控制台中记录validationError object。 任何知道为什么第一次提交时validationErrors state 是null。

注意:当我尝试访问模板内的validationErrors state 时,它工作正常

store.js

import Vue from "vue";
import Vuex from "vuex";
import categories from "./modules/categories";

Vue.use(Vuex);

export default new Vuex.Store({
    modules: {
        categories
    }
});

类别.js

import axios from "axios";

const state = {
    categories: [],
    validation_errors: null
};

const getters = {
    allCategories: state => state.categories,
    validationErrors: state => state.validation_errors
};

const actions = {
    async fetchCategories({ commit }) {
        const response = await axios.get("/api/categories");
        commit("setCategories", response.data);
    },

    async addCategory({ commit }, { name, sku, unit, image, details }) {
        try {
            const formData = new FormData();
            formData.append("name", name);
            formData.append("sku", sku);
            formData.append("unit", unit);
            formData.append("image", image);
            formData.append("details", details);

            const res = await axios.post("/api/categories/add", formData);

            commit("newCategory", res.data);
        } catch (err) {
            const errors = err.response.data.errors;
            commit("formErrors", errors);
        }
    }
};

const mutations = {
    setCategories: (state, categories) => (state.categories = categories),
    newCategory: (state, category) => state.categories.unshift(category),
    formErrors: (state, errors) => (state.validation_errors = errors)
};

export default {
    state,
    getters,
    actions,
    mutations
};

AddCategoryForm.vue

<template>
  <form role="form" v-on:submit.prevent="handleSubmit">
        <label for="name">Category Name</label>
        <input
          type="text"
          class="form-control"
          name="name"
          id="name"
          placeholder="Category Name"
          v-model="category.name"
        />

       <button type="submit" class="btn btn-primary">Add Category</button>


    <!-- NOTE: I can access 'validationErrors' state here in the template -->


  </form>
</template>

<script>
import { mapActions, mapGetters } from "vuex";

export default {

  data() {
    return {

      category: {
        name: ""
      }
    };
  },
  computed: {
    ...mapGetters(["validationErrors"])
  },
  methods: {
    ...mapActions(["addCategory"]),

    handleSubmit() {
      this.addCategory(this.category);

      console.log(this.validationErrors); // returns `null` on first submit
    }
  }
};
</script>

操作addCategory是异步的,因此您应该在检查this.validationErrors之前等待它

 async handleSubmit() {
      await this.addCategory(this.category);

      console.log(this.validationErrors); // returns `null` on first submit
    }

或者

 handleSubmit() {
      this.addCategory(this.category),then(() => {
         console.log(this.validationErrors); // returns `null` on first submit
      });
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM