未在实例上定义但在渲染期间引用的属性或方法 I Vuex

Posted

技术标签:

【中文标题】未在实例上定义但在渲染期间引用的属性或方法 I Vuex【英文标题】:Property or method not defined on the instance but referenced during render I Vuex 【发布时间】:2017-04-14 03:54:15 【问题描述】:

我收到以下错误。

[Vue 警告]:属性或方法“updateData”未在实例上定义,但在渲染期间被引用。确保在 data 选项中声明响应式数据属性。

据我所知,该方法就在那里,所以由于我对 Vuex 的无知,我被困在了一些我想念的东西上。我用谷歌搜索了这件事并得到了很多答案,但没有一个让我更明智地做什么。我感觉这似乎是有范围的东西。

我也收到以下错误,但我怀疑两者的根本原因相同,因此解决一个将解决另一个。

[Vue 警告]:事件“点击”的无效处理程序:未定义 (在...的组件中找到)

标记如下。我已经检查了路径是否到达了正确的位置。目前我完全不确定如何开始对其进行故障排除。任何提示将不胜感激。

<template>
  <div id="nav-bar">
    <ul>
      <li @click="updateData">Update</li>
      <li @click="resetData">Reset</li>
    </ul>
  </div>
</template>

<script>
  import  updateData, resetData  from "../vuex_app/actions";

  export default 
    vuex: 
      getters:  activeDataRow: state => state.activeDataRow ,
      actions:  updateData, resetData 
    
  
</script>

编辑

输入后,我改进了导出以包含 methods 属性,如下所示。 (但仍然存在相同的错误。)

export default 
  vuex: 
    getters:  activeDataRow: state => state.activeDataRow , 
    actions:  updateData, resetData , 
    methods: 
      updateData: () => this.$store.dispatch("updateData"), 
      resetData: () => this.$store.dispatch("resetData")
    
  

我必须在商店里做一些额外的事情吗?看起来像这样。

import Vue from "vue";
import Vuex from "vuex";
Vue.use(Vuex);

const state =  dataRows: [], activeDataRow:  ;
const mutations = 
    UPDATE_DATA(state, data)  state.dataRows = data; state.activeDataRow = ; ,
    RESET_DATA(state)  state.dataRows = []; state.activeDataRow = ; 
;

export default new Vuex.Store( state, mutations );

【问题讨论】:

【参考方案1】:

你必须在 Vue 组件的方法中添加导入的函数,如下所示。您可以按照documentation 中的说明向mapActions 寻求帮助。这是将this.updateDate 映射到this.$store.dispatch('updateDate') 所必需的。

<script>
  import  updateData, resetData  from "../vuex_app/actions";
  import  mapActions  from 'vuex'

   export default 
    vuex: 
      getters:  activeDataRow: state => state.activeDataRow ,
      actions:  updateData, resetData 
    ,
    methods: 
       ...mapActions(['updateData', 'resetData'])
    
  
</script>

已编辑

如果你不想使用mapActions,你可以像在你的例子中那样使用this.$store.dispatch,但是你需要有vue组件级别的方法(documentation)而不是insise vuex,如下:

export default 
  vuex: 
    getters:  activeDataRow: state => state.activeDataRow , 
    actions:  updateData, resetData 
  , 
  methods: 
    updateData: () => this.$store.dispatch("updateData"), 
    resetData: () => this.$store.dispatch("resetData")
  

【讨论】:

$store 的部分来自哪里?它是 Vue 的内部实用领域吗?我不认识其他上下文中的名称,在我看来它就像一个 jQuery 样式变量(几乎)... @KonradViltersten this.$store 是这个 vue 组件的 vuex 存储,使用它你可以访问 vuex 存储或触发突变或调度操作。你可以看到它的例子使用了here。 我找到了,谢谢。问题是三个点(“...”)不起作用。我已经阅读了它,但目前,它有点松散的部分让我感觉不方便。我怎样才能重写方法:......与旧风格的 JS 分开?希望以后我会尝试弄清楚如何配置 webpack 以使用扩展运算符。 我解决了传播运营商问题,但原来的问题仍然存在。请随时查看编辑。 @KonradViltersten:在您的版本中,您已将 methods 嵌套在您的 vuex 对象中 - 它需要更高一层,就像在 saurabh 的示例中一样。

以上是关于未在实例上定义但在渲染期间引用的属性或方法 I Vuex的主要内容,如果未能解决你的问题,请参考以下文章

“属性或方法未在实例上定义,但在渲染期间引用”

属性或方法...未在实例上定义,但在渲染期间引用

错误:vue.js:634 [Vue 警告]:属性或方法“项目”未在实例上定义,但在渲染期间被引用

Vue属性或方法未在实例上定义但在渲染期间引用?

属性或方法“sendResetMail”未在实例上定义,但在渲染期间引用

Vue警告:属性或方法“item”未在实例上定义,但在渲染期间被引用