javascript - 如何在 Vuex 中设计一个商店来处理嵌套自定义组件中的点击?

标签 javascript vue.js vuex

我正在尝试设计一个商店来管理我的 Vuex 应用程序的事件。到目前为止,我有以下内容。

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 = {}; },
};

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

我将有许多列表项,单击这些列表项应该会更改存储中数据的值。根组件App和菜单栏Navigation的设计如下(最后会有一堆 Action 所以我把它们收集在文件< em>actions.js)。

<template>
  <div id="app">
    <navigation></navigation>
  </div>
</template>
<script>
import navigation from "./navigation.vue"
export default { components: { navigation } }
</script>

<template>
  <div id="nav-bar">
    <ul>
      <li onclick="console.log('Clickaroo... ');">Plain JS</li>
      <li @click="updateData">Action Vuex</li>
    </ul>
  </div>
</template>
<script>
  import { updateData } from "../vuex_app/actions";
  export default {
    vuex: {
      getters: { activeDataRow: state => state.activeDataRow }, 
      actions: { updateData }
    }
  }
</script>

单击第一个列表项会在控制台中显示输出。然而,当单击第二个时,没有任何反应,所以我很确定该事件根本没有被调度。渲染页面时我还看到以下错误:

Property or method "updateData" is not defined on the instance but referenced during render. Make sure to declare reactive data properties in the data option.

我对 Vuex 很陌生,所以我只是猜测。我是否需要在存储中引用 updateData 操作以及状态突变?我怎么做?错误消息谈到的“数据选项”是什么/在哪里?这不是我的组件状态及其属性吗?

最佳答案

为什么会出错

您收到错误,因为当您有<li @click="updateData">时在模板中,它查找方法 updateData在 vue 组件中它找不到,所以它抛出错误。要解决这个问题,您需要在 vue 组件中添加相应的方法,如下所示:

<script>
  import { updateData } from "../vuex_app/actions";
  export default {
    vuex: {
      getters: { activeDataRow: state => state.activeDataRow }, 
      actions: { updateData }
    }, 
    methods:{ 
      updateData: () => this.$store.dispatch("updateData")    
    }
  }
</script>

什么this.$store.dispatch("updateData")正在做的是调用你的 vuex 操作,如记录的 here .

“数据选项”是什么/在哪里

您没有定义任何数据属性,如果您只想在该组件中使用该数据属性,则可以使用 vue 组件的数据属性。如果您有需要跨多个组件访问的数据,可以使用vuex state正如我相信你正在做的那样。

以下是获取data properties的方法对于 vue 组件:

<script>
  import { updateData } from "../vuex_app/actions";
  export default {
    date: {
      return {
        data1 : 'data 1',
        data2 : {
            nesteddata: 'data 2' 
          }
      }
    }
    vuex: {
      getters: { activeDataRow: state => state.activeDataRow }, 
      actions: { updateData }
    }, 
    methods:{ 
      updateData: () => this.$store.dispatch("updateData")    
    }
  }
</script>

您可以在 View 中使用这些数据属性,有computed properies基于它,或创建 watchers关于它和许多more .

关于javascript - 如何在 Vuex 中设计一个商店来处理嵌套自定义组件中的点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40888482/

相关文章:

javascript - 登录并登录 Amazon Web Service Cognito 错误消息

javascript - 如何从同级组件访问Vue组件元素属性

vue.js - Vue - 如何识别 [__ob__ : Observer]?

javascript - vuex 中 { dispatch, commit } 的类型是什么?

javascript - 在 VueJS 3 中全局使用 momentJS

javascript - 在 jQuery 或 JS 中通过子元素 id 查找 li 元素

javascript - 使用 JavaScript 显示鼠标 x 和 y 位置

javascript - 使用 goutte 抓取数据属性?

vue.js - Vue 3 使用动态组件和动态导入

javascript - 为什么我不能使用括号符号 + 变量将属性分配给对象?