Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Vuex状态不会被通用函数突变,而专用函数会对其进行突变_Javascript_Vue.js_Vuejs2_Vuex_Lokijs - Fatal编程技术网

Javascript Vuex状态不会被通用函数突变,而专用函数会对其进行突变

Javascript Vuex状态不会被通用函数突变,而专用函数会对其进行突变,javascript,vue.js,vuejs2,vuex,lokijs,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

我有一个由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()
函数不接受参数并将其硬编码,不会相应地更改
状态。ads

我编写一个通用函数到updateArray的方法的根本问题是什么?有办法吗



下面是这种行为的一个例子。

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

您的突变应该如下所示:

const mutations = {
  updateArray(state, to) {
      state.ads = to
    }
}
function setupHandler() {
  setupCollection('ads')
  db.getCollection('ads').insert({dummy: "Dummmy!"})

  store.commit('updateArray', db.getCollection('ads').data)
}
您的setupHandler函数应该如下所示:

const mutations = {
  updateArray(state, to) {
      state.ads = to
    }
}
function setupHandler() {
  setupCollection('ads')
  db.getCollection('ads').insert({dummy: "Dummmy!"})

  store.commit('updateArray', db.getCollection('ads').data)
}
突变是接受状态作为第一个参数的函数,以及包含参数作为第二个参数的对象参数。应使用存储的
commit
方法提交突变


这是您的。

您不能像在
updateArray
中那样直接替换状态,其中
from
实际上就是
状态。如果要替换完整状态,需要使用store实例的
replaceState
方法。此外,您并没有真正按照预期使用Vuex。突变旨在接收状态对象,突变应通过存储提交。@Bert:但我不想替换整个状态。我在这个州有很多数组(只是为了简化它而精简了它),我只需要更新非常特定的数组。有办法吗?@Bert:我正在使用它,就像你在组件中描述的那样,但是,我需要先从LokiJS数据库加载数据。有没有一种惯用的方法可以做到这一点?正如我在下面展示的那样,您可以在存储上调用方法,而无需使用
this.$store
,您只需要对存储对象进行引用。因此,在组件外部,您将以与组件内部相同的方式进行操作,这只是如何到达存储的问题。通常,您导出存储对象,然后在需要的地方导入它。