【问题标题】:Vue.js/vuex ajax update components with ajax stateVue.js/vuex ajax 用 ajax 状态更新组件
【发布时间】:2017-04-04 10:05:39
【问题描述】:

我正在使用带有 vuex 的 vue webpack 模板,我基本上遇到了组件不随状态更新的问题。

我有一家商店

const state = {
  userData: {},
}

在我的应用中我有一个方法

methods: {

    addUserData: function() {
        const that = this;
        axios.get('URL').then(function (response) { 

            let obj = response.data;
            that.$store.commit('addUserData', {obj});

        }); 
    },

我在安装时调用它

mounted () {

    this.addUserData();

},

使用突变进行更新

const mutations = {
addUserData(state, {obj}) {
    state.userData = obj;
},}

到目前为止一切都很好,数据正在进入存储区。但是我有一个不工作的组件,因为它没有等待 ajax 完成加载,也没有以任何方式绑定。我很可能在这里做错了,但基本上在我的组件中我有

data () {
    return {
        weekData : {
            weekDataList: []....

methods: {

    tester: function(a) {

        // Sorting the userdata using lowdash
        this.weekData.weekDataList = _.values(this.$store.state.userData);

    },

},

我的调用方式和以前一样

mounted () {

    this.tester();

},

问题是 this.weekData.weekDataList 总是返回一个空数组,因为商店中的 userData 还没有完成。我有几十种方法执行各种计算,都基于这个数组,所以如果一个失败,它们都会失败。

也许我的方法是错误的,但理想情况下,我希望在商店更新后更新数据属性?我尝试使用计算属性执行此操作,并且使用 {{ 不管 }} 可以正常工作,但不确定如何更新组件数据。

【问题讨论】:

    标签: javascript vue.js vuex


    【解决方案1】:

    你在正确的道路上。计算属性绝对是这里的方法。 在您当前的情况下,您的组件以任何反应方式对商店一无所知。您只有一个函数可以尝试在任何给定点读取数据,并且可能存在或不存在正确的数据。

    所以首先,如果组件嵌套在父组件下,就像this.$store 将指向同一个商店。然后,您应该尝试使用所需的值作为属性,因此它是响应式的。

    computed: {
      userData: function () {
         return this.$store.state.userData
      }
    }
    

    当您使用它时,还将 weekdata 放入计算属性中:

    computed: {
      userData: function () {
         return this.$store.state.userData
      },
      weekData: function () {
        return {
          weekDataList: _.values(this.userData)
        }
      }
    }
    

    通过这样做,所有数据都将是反应性的,weekData 将相应地更新。

    希望这会有所帮助,一般来说,当你已经在使用 Webpack 时,我会考虑开始使用 ES6 语法,因为它使事情更具可读性并且某些部分更简洁:)

    【讨论】:

    • 感谢@codebryo 是的,它工作得很好,但我认为 userData 只能通过在输出上使用 {{userData}} 来访问。我可以在 this.userData 之类的组件中的某个地方使用它吗,也许是另一种方法或其他方式。一旦使用 ajax 更新了范围,我需要更新本地数据,因为其他方法又依赖于这一位数据。
    • 您可以像使用任何数据属性或方法一样使用userData,因为 Vue 会为其创建 getter 和 setter。此外,根据计算,它们将自动更新。 this.$store 是被动的,因此一旦发生更改,userData 将被重新评估,并且 weekData 也将再次自动更新。所以如果一切都异步发生就好了。
    • 这很有意义,现在可以在其他计算函数中使用。假设我想获取第一个 userData 元素,{{ userData[0] }} 似乎不起作用,也没有在 userData 计算属性上返回以下内容。 var arr = weekDataList: _.values(this.userData) return arr[0]
    • 在这方面我好像错了。我想我完全错误地思考了 Vue 和计算方法的整个概念,并使用了像传统 JS 这样的方法而不是计算属性。你帮了大忙,谢谢!
    • @webknit 如果这解决了你的问题,你应该投票并接受它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 2019-03-20
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    相关资源
    最近更新 更多