为动态创建的组件分离 vuex 存储

2023-12-29

这个问题让我有点卡住了。不幸的是,我在这里找不到答案(问也没有帮助)。因此,在做了一些研究并到处询问之后,似乎我找到了这个问题的解决方案。

如果您有一个已经知道答案的问题,并且您 希望公开记录这些知识,以便其他人 (包括你自己)稍后可以找到它。

当然,我的答案可能不是理想的,而且我知道不是,这就是我发帖的重点——改进它。

请注意,我在示例中没有使用操作。这个想法是一样的。

让我们从陈述问题:

想象一下我们有App.vue它动态生成名为的本地组件Hello.

<template>
  <div id="app">
    <div>
      <hello v-for="i in jobs" :key="i" :id="i"></hello>
      <button @click="addJob">New</button>
    </div>
  </div>
</template>   

<script>
import Hello from './components/Hello'

export default {
  components: {
    Hello
  }...

store.js

export const store = new Vuex.Store({
  state: {
    jobs: []
  }
})

我们正在使用v-for通过迭代数组来生成组件的指令jobs. Our store截至目前仅包含state与一个空数组。 按钮New应该做两件事:

1)创建新组件Hello,换句话说,将元素添加到jobs(让它成为数字),它们将被分配为key and id of <hello>,并传递给本地组件props.

2)生成本地商店 -modules- 将任何数据保留在新创建的组件范围内。

Hello.vue

<template>
  <div>
    <input type="number" :value="count">
    <button @click="updateCountPlus">+1</button>
  </div>
</template>

export default {
  props: ['id']
}

简单组件 - 使用按钮加 1 进行输入。

Our goal is to design something like this: Vuex local stores


对于第一次操作NEW按钮 -生成组件- 我们增加mutation to our store.js

 mutations: {
    addJob (state) {
      state.jobs.push(state.jobs.length + 1)
...
}

Second, 创建本地模块。这里我们要使用reusableModule生成模块的多个实例。为了方便起见,我们将该模块保存在单独的文件中。还,注意使用函数来声明模块状态.

const state = () => {
  return {
    count: 0
  }
}

const getters = {
  count: (state) => state.count
}

const mutations = {
  updateCountPlus (state) {
    state.count++
  }
}

export default {
  state,
  getters,
  mutations
}

To use reusableModule我们导入它并应用动态模块注册。

store.js

import module from './reusableModule'

const {state: stateModule, getters, mutations} = module

export const store = new Vuex.Store({
  state: {
    jobs: []
  },
  mutations: {
    addJob (state) {
      state.jobs.push(state.jobs.length + 1)
      store.registerModule(`module${state.jobs.length}`, {
        state: stateModule,
        getters,
        mutations,
        namespaced: true // making our module reusable
      })
    }
  }
})

之后,我们将链接Hello.vue及其存储。我们可能需要state, getters, mutations, actions from vuex。要访问存储,我们需要创建我们的getters。与相同mutations.

Home.vue

<script>

export default {
  props: ['id'],
  computed: {
     count () {
        return this.$store.getters[`module${this.id}/count`]
     }
  },
  methods: {
    updateCountPlus () {
        this.$store.commit(`module${this.id}/updateCountPlus`)
     } 
  }
}
</script>

想象一下我们有很多getters, mutations and actions。为什么不使用{mapGetters} or {mapMutations}?当我们有多个模块并且我们知道所需模块的路径时,我们就可以做到这一点。不幸的是,我们无权访问模块名称。

该代码在执行组件的模块时运行(当您的应用程序 正在启动),而不是在创建组件时。所以这些助手可以 仅当您提前知道模块名称时才使用。

这里几乎没有帮助。我们可以分开我们的getters and mutations然后将它们作为对象导入并保持干净。

<script>
import computed from '../store/moduleGetters'
import methods from '../store/moduleMutations'

export default {
  props: ['id'],
  computed,
  methods
}
</script>

回到App成分。我们必须承诺我们的mutation让我们创建一些getter for App。展示我们如何访问位于模块中的数据。

store.js

export const store = new Vuex.Store({
  state: {
    jobs: []
  },
  getters: {
    jobs: state => state.jobs,
    sumAll (state, getters) {
      let s = 0
      for (let i = 1; i <= state.jobs.length; i++) {
        s += getters[`module${i}/count`]
      }
      return s
    }
  } 
...

完成代码在App成分

<script>
import Hello from './components/Hello'
import {mapMutations, mapGetters} from 'vuex'

    export default {
      components: {
        Hello
      },
      computed: {
        ...mapGetters([
          'jobs',
          'sumAll'
        ])
      },
      methods: {
        ...mapMutations([
          'addJob'
        ])
      }
    }
    </script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为动态创建的组件分离 vuex 存储 的相关文章

随机推荐

  • sql中*是什么意思?

    例如 我知道什么SELECT FROM example table 方法 然而 不知道代码的每一部分的含义 我感到不舒服 SQL 查询的第二部分是您要为所获取的每条记录检索的列的名称 显然 您可以为每个记录检索多个列 并且 仅当您想检索al
  • AngularJS 对许多输入进行数据绑定的方式是什么?

    我正在学习 angularjs 我希望能够让用户输入许多输入 当这些输入被输入list数组元素应该相应改变 我想尝试使用 ngRepeat 指令 但我读到 因为它创建了一个新范围 所以我无法进行数据绑定 div div
  • 如何获取backgroundSession NSURLSessionUploadTask响应

    我已经实现了一个在后台运行的 NSURLSession 因此即使应用程序暂停 它也可以使用系统守护进程继续执行任务 问题是 void URLSession NSURLSession session dataTask NSURLSession
  • 如何以编程方式启用 LAN 唤醒

    有没有办法以编程方式进入 BIOS 并为支持 LAN 唤醒功能的计算机打开该功能 理想情况下 解决方案应该是跨 BIOS 的 但使用单独的解决方案来打击每个主要供应商也是可以的 BIOS 配置是操作系统有意限制的内容 以避免病毒问题 以前有
  • 通过外部“C”链接解决重载问题

    在混合 C C 项目中 我们需要从 C 调用 C 函数 要调用的函数被重载为三个单独的函数 但我们可以从 C 端忽略这一点 我们只需选择最合适的一个并坚持使用该函数 有两种方法可以做到这一点 1 编写一个带有 extern C 函数的小型
  • 升级到 2.4.0 后,Spring Cloud 配置客户端无法从配置服务器获取/加载配置文件

    弹簧云配置客户端无法从中读取配置文件弹簧云配置服务器升级到后2 4 0使用 spring cloud 版本2020 0 0 M6 从 spring boot 2 4 0 版本开始 默认不启用 bootstrapping 需要在你的应用程序中
  • 在 Mac 10.9.2 上安装 WordNet

    我正在尝试在 Mac 操作系统 10 9 2 上安装 WordNet 我尝试过以下方法 配置 make 但期间make我遇到了一些错误 然后我安装了XQuartz 2 7 5 我仍然遇到一些错误make 接下来 我安装了 Xcode 但这仍
  • VHDL-读取HEX文件

    In VHDL 从 HEX 文件初始化 std logic vector 数组 https stackoverflow com questions 20164216 vhdl init std logic vector array from
  • 为什么我们不应该在java中使用受保护的静态

    我正在经历这个问题Java中有没有办法覆盖类变量 https stackoverflow com questions 685300 is there a way to override class variables in java 首先c
  • ListView 项目上的删除按钮

    我开始为 UWP 进行开发 我正在尝试创建一个ListView填充有x bind 现在我想在所有单个项目上创建一个按钮来删除它们 类似于 Windows 10 邮件 我已经创建了
  • 使用字符串值作为变量名[重复]

    这个问题在这里已经有答案了 是否可以使用 String 作为变量名 就像这个例子一样 String musicPlaying music2 Music music1 new Music blaalla Music music2 new Mu
  • 在 Firebase 中构建关系

    我的 Firebase 中有两项 providers and services 我正在尝试找出使用 Firebase 推荐的扁平化架构方法构建和建立关系的最佳方法 我的数据看起来像这样 services hip replacement ti
  • 在java 8中是否可以做一个懒惰的groupby,返回一个流?

    我有一些较大的文本文件 我想通过对其行进行分组来处理它们 我尝试使用新的流媒体功能 例如 return FileUtils readLines parallelStream map collect groupingBy pair gt pa
  • 如何使用 exoplayer 横向全屏播放视频

    我正在使用 exoplayer 在我的 Android 应用程序中播放来自 url 的视频 在纵向中 一切都按预期工作 在活动中使用视图页面 片段和选项卡 我的目标是当用户处于横向状态时全屏播放视频 这意味着只有视频将以横向方式播放 所有其
  • 如何在解决方案中的所有项目之间共享 LocalDB 实例?

    我有一个 VS 2012 解决方案设置如下 EF 模型项目 EF模型测试项目 ASP NET MVC 4 应用程序 WCF数据服务项目 在开发过程中 我想使用 LocalDB 作为 EF 的后备数据库 MVC 和 WCF 项目都使用 EF
  • 将图像存储在 MySQL 数据库中

    我想知道如何在 MySQL 数据库中存储图像和文件 我想获得这样的图像和文件www example rsrc php example image jpg Facebook 上的示例 facebook example com rsrc php
  • 在 DataGridViewComboboxColumn 上设置所选项目

    我有一个带有 DataGridViewComboboxColumn 列的 datagridview 其中包含 3 个值 小号中号大号 我恢复了用户默认值 在本例中为 中 我想在 datagridview 中显示一个下拉单元格 但默认值为 中
  • spring.jmx.enabled 的确切目的是什么?

    对于 Spring Boot v2 4 2 在通过 JMX 进行监控和管理 https docs spring io spring boot docs current reference html production ready feat
  • 在 PSQL 脚本中使用环境变量

    是否可以在 sql 文件中使用 Linux 环境变量 我正在使用复制 选择查询写入输出文件 并且我想将该目录放入变量中 所以我想做一些类似的事情 COPY SELECT FROM a TO outputdir a csv Outputdir
  • 为动态创建的组件分离 vuex 存储

    这个问题让我有点卡住了 不幸的是 我在这里找不到答案 问也没有帮助 因此 在做了一些研究并到处询问之后 似乎我找到了这个问题的解决方案 如果您有一个已经知道答案的问题 并且您 希望公开记录这些知识 以便其他人 包括你自己 稍后可以找到它 当