Vuex状态不会被一般函数变异,而专用函数会对其进行变异

时间:2018-01-04 15:37:05

标签: javascript vue.js vuejs2 vuex lokijs

我有一个LokiJS提供的存储空间,用于使用autoloadCallback中的突变来更新Vuex状态。

LokIJS存储:

var db = new loki('mydatabase', {
  autoupdate: true,
  autoload: true,
  autoloadCallback: setupHandler
})

Vuex状态和突变:

const state = {
  ads: []
}

const mutations = {
  updateArray(from, to) {
      from = to
  },
  updateAds() {
      state.ads = db.getCollection('ads').data
  }
}

回调本身:

function setupHandler() {
  setupCollection('ads') // Just sets up the collection if it doesn't exist
  db.getCollection('ads').insert({dummy: "Dummmy!"})

  mutations.updateArray(state.ads, db.getCollection('ads').data)
  mutations.updateAds()    
}

这里的问题是,调用updateArray(state.ads, content) 不会state.ads更改为content,而updateAds()函数基本上会将state.ads更改为SkipPolicy同样的事情,只是不接受参数并让它们硬编码,相应地改变了public class MySkipper implements SkipPolicy { @Override public boolean shouldSkip(Throwable exception, int skipCount) throws SkipLimitExceededException { if (exception instanceof XYZException) { //doSomething } ...... }

我将一般函数写入updateArray的方法有什么根本问题?有办法吗?

以下是此行为的JSFiddle MCVE example

1 个答案:

答案 0 :(得分:1)

在不知道loki的细节的情况下,我认为您需要进行以下更改。

你的突变应该是这样的:

const mutations = {
  updateArray(state, to) {
      state.ads = to
    }
}

你的setupHandler函数应如下所示:

function setupHandler() {
  setupCollection('ads')
  db.getCollection('ads').insert({dummy: "Dummmy!"})

  store.commit('updateArray', db.getCollection('ads').data)
}

Mutations是接受状态作为第一个参数的函数,以及包含参数作为第二个参数的object参数。应使用商店的commit方法提交突变

这是您的fiddle updated