Vuejs2 如何在函数中使用vuex操作

Vuejs2 如何在函数中使用vuex操作,vuejs2,vuex,Vuejs2,Vuex,我是Vue的新手,所以我可能误解了什么。我想在App.vue中的本地函数内调用vuex操作,如下所示: <template> <div id="app"> <button @click="runFunction(1)">Test</button> </div> </template> <script> import { mapActions } from 'vuex' export defau

我是Vue的新手,所以我可能误解了什么。我想在
App.vue
中的本地函数内调用vuex操作,如下所示:

<template>
  <div id="app">
    <button @click="runFunction(1)">Test</button>
  </div>
</template>

<script>
import { mapActions } from 'vuex'

export default{
  data() { return { } },
  methods: {
      ...mapActions(['doAction']),
      buttonClicked: (input) => { runFunction(input) }
  }
}

function runFunction(input){
  doAction({ ID: input });
}
</script>
我还有一个main.js来设置vue:

import Vue from 'vue'
import App from './App.vue'
import store from './store'

new Vue({
  el: '#app',
  store,
  render: h => h(App)
})
我得到的错误是:

ReferenceError: doAction is not defined
  at runFunction

如何在函数中调用映射动作?版本是Vue 2.6.10

当然,它不是在您的实例之外定义的。。。。您必须从函数组件上的
store.js
导入导出的
store


从“vuex”导入{mapActions}
从“store.js”导入存储
导出默认值{
data(){return{}},
方法:{
…映射操作(['doAction']),
按钮点击:(输入)=>{runFunction(输入)}
}
}
函数runFunction(输入){
提交({ID:input});
}

运行函数定义为“本地函数”有几个问题:

函数runFunction(输入){
doAction({ID:input});
}
首先,这只是一个普通的JavaScript函数,通常适用范围规则
doAction
需要在该函数可以看到它的地方定义。此函数与
App.vue
中定义的组件之间没有神奇的联系。组件中的代码可以访问该功能,如单击的
按钮
,但不能反过来访问

下一个问题是它在模板中不可用。在模板中编写
runTemplate(1)
时,将查找
this.runTemplate(1)
,尝试在当前实例上解析它。您的函数不在当前实例上。鉴于您的模板包含
@click=“runFunction(1)”
我有点惊讶,您没有看到控制台错误警告,提示单击处理程序未定义

mapActions
使用
this.$store
中保存的引用访问存储。将
存储添加到
新Vue({store})
时,将创建该引用。商店可能看起来很神奇,但实际上只是
this.$store
,其中
this
是当前组件

现在还不清楚为什么要在组件之外编写这个函数。最简单的解决方案是将其添加到
方法中。然后它将可用于模板,您可以访问
doAction
作为
this.doAction


要将其作为一个单独的功能保留,您需要给它一些访问存储的权限。在不知道为什么要将其分离的情况下,首先不清楚如何最好地实现这一点。

我在OP中没有提到这一点,但是在
新Vue({el:'#app',store,render:h=>h(app)})中存储什么呢
main.js
do then?@DavidStarkey中,vue实例的
导出
block@DavidStarkey新的Vue({el:'#app',store,render:h=>h(app)})这只是将导出的存储设置为实例存储,因此
这个。$store=store
@DavidStarkey您是否尝试过该代码,但它不起作用?如果您打算直接使用该存储,我只是不确定执行操作和使用
mapActions
的意义何在。为什么不在这一点上执行
store.state.IDs.push
呢?实际上,它没有理由成为一个单独的函数,除非在实践中它会有点长。我尝试将其更改为
按钮单击:(输入)=>{this.doAction({ID:input});}
并得到
TypeError:_this.doAction不是一个函数
@davidstrarkey这是因为您使用的是箭头函数。它应该是
按钮点击(输入){this.doAction({ID:input})}
,就是这样。我开始明白了。
ReferenceError: doAction is not defined
  at runFunction