javascript - 更新: Mutation recieve the store,不是状态

标签 javascript vue.js vuejs2 vuex quasar

这篇文章有更新,请参阅第一个答案

所以,首先,我确实搜索了类似的问题(并找到了一些线程),但没有解决我的问题。我第一次尝试使用 quasar 框架,也许我在命名空间或其他地方迷路了。

首先,一些信息: +使用 ESLint 编译时没有任何错误
+我的 javascript 控制台在运行时没有任何错误
我的问题是:
+我的操作和突变确实在商店中保存了一些东西,但没有保存在应该保存的地方(请参阅帖子末尾的屏幕截图)
+我的getter似乎不起作用,在vue开发工具中显示为“未定义”

我的商店是这样组织的:

+store [folder]  
+ index.js  
+ app-utils [folder]  
--+ index.js  
--+ getters.js  
--+ actions.js  
--+ mutations.js  
--+ state.js  

根index.js的代码:
从“vue”导入 Vue 从 'vuex' 导入 Vuex

import appUtils from './app-utils'

Vue.use(Vuex)

const store = new Vuex.Store({
  modules: {
    appUtils
  }
})

export default store

然后,在“app-utils”文件夹中: index.js 代码:

import state from './state'
import * as getters from './getters'
import * as mutations from './mutations'
import * as actions from './actions'

export default {
  namespaced: true,
  state,
  getters,
  mutations,
  actions
}

state.js 代码:

export default {
  state: {
    currentPageTitle: 'Hello'
  }
}

getters.js 代码:

export const getPageTitle = (state) => {
  console.log('GET TITLE: ' + state.currentPageTitle)
  return state.currentPageTitle
}

mutations.js 代码:

export const setPageTitle = (state, newPageTitle) => {
  console.log('MUTATION SET TITLE: ' + newPageTitle)
  state.currentPageTitle = newPageTitle
}

export const deletePageTitle = (state) => {
  console.log('MUTATION DELETE TITLE')
  state.currentPageTitle = ''
}

actions.js 代码:

export const setPageTitle = (context, newPageTitle) => {
  console.log('ACTION SET TITLE: ' + newPageTitle)
  context.commit('setPageTitle', newPageTitle)
}

export const deletePageTitle = (context) => {
  console.log('ACTION DELETE TITLE')
  context.commit('deletePageTitle')
}

我尝试访问它的代码(int getPageTitle 计算字段):

<template>
  <q-page>
    <q-resize-observable @resize="onResize" /> TITLE : {{getPageTitle}}
    <div class="row">
    </div>
  </q-page>
</template>


import { mapGetters, mapActions } from 'vuex'

export default {
  data: () => ({
    pageSize: {
      height: 0,
      width: 0
    }
  }),
  mounted () {
    this.setPageTitle('Template manager')
  },
  destroyed () {
    this.deletePageTitle()
  },
  computed: {
    ...mapGetters('appUtils', [
      'getPageTitle'
    ])
  },
  methods: {
    ...mapActions('appUtils', [
      'setPageTitle',
      'deletePageTitle'
    ]),
    onResize (size) {
      this.pageSize = size
    }
  }
}
</script>

<style>
</style>

最后,vue插件的截图,你可以看到触发mounted()钩子(Hook)时已经设置了值,但不是在'state'中,并且getter是未定义的。

Screenshot from the vue dev plugin

最佳答案

您的状态对象如下所示:

export default {
  state: {
    currentPageTitle: 'Hello'
  }
}

整个事情都被传递给你的 getter 状态参数。整个导出的对象是您的状态,而不是其中的“状态”属性。所以你有两个选择:

选项一:更新 getter 以访问状态中的嵌套“state”属性:

export const getPageTitle = (state) => {
  console.log('GET TITLE: ' + state.state.currentPageTitle)
  return state.state.currentPageTitle
}

选项二(可能是您真正想要做的):将状态对象更改为不具有“state”属性。

export default {
  currentPageTitle: 'Hello'
}

关于javascript - 更新: Mutation recieve the store,不是状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50144872/

相关文章:

javascript - 如何从setState中的数组中选择特定对象?

javascript - 选择元素的选项属性在 vue.js 2.0 中不起作用

unit-testing - 未找到转换选项中的模块 <rootDir>/node_modules/vue-jest

javascript - 使下拉列表依赖于 PHP 中的另一个列表

计算器中的 Javascript 乘法问题

javascript - 为什么后面更新数据时v-if不受影响?

javascript - 如何通过vue中该对象的另一个数组中的id号查找数组中的对象

vue.js - Vue 模块组件检测 Vue.js 版本?

javascript - 如何在值输入文本上显示选择选项的值? (vue.js 2)

Javascript - 通过 Action 获取表单