- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我发现 Vuex getter 中的 JSON 有一些奇怪的行为:它似乎导致了引用传递类型的问题。对于上下文——我正在开发一个音乐应用程序,它将有多个“场景”,每个场景都包含“轨道”集合(类似于 Ableton Live)。
这是我的 setter/getter :
newTrack: state => {
let newTrack = JSON.parse(JSON.stringify(state.newTrackDefaults))
return newTrack
},
这是它引用的对象:
newTrackDefaults: {
tune: [],
// and other properties
},
然后它被一个 Action 调用:
setUpNewScene: context => {
let newScene = JSON.parse(JSON.stringify(context.state.newSceneDefaults))
let newTrack = context.getters.newTrack
console.log(newTrack) // this reveals that the problem is from the getter
newScene.tracks.push(newTrack)
context.commit('addNewScene', newScene)
}
所以这段代码的问题是,当我将项目(音高引用)添加到第一个场景的轨道,然后添加一个新场景时,新场景自动接收与第一个场景。这反射(reflect)在 Vuex 状态(根据 DevTool),而不仅仅是渲染。此外,当用户更新第一个场景上的轨迹时,新场景上的轨迹也会相应改变。所以本能地,这感觉像是一种传递引用类型的错误。
通过各种 console.log
实验,我发现 getter 正在返回“已填充”轨道。它可以通过跳过 getter 并将操作编写为来修复:
setUpNewScene: context => {
let newScene = JSON.parse(JSON.stringify(context.state.newSceneDefaults))
let newTrack = JSON.parse(JSON.stringify(context.state.newTrackDefaults))
console.log(newTrack) // this works fine
newScene.tracks.push(newTrack)
context.commit('addNewScene', newScene)
}
...所以虽然我有一个修复程序,但我对原始行为感到困惑。 getter 会干扰 JSON
函数吗?或者还有什么可能会导致这种情况?
最佳答案
Vuex getters 被缓存。
https://vuex.vuejs.org/en/getters.html
Like computed properties, a getter's result is cached based on its dependencies, and will only re-evaluate when some of its dependencies have changed.
如果它们的依赖关系没有改变,则 getter 返回它们最后返回的值。据推测,您不会改变 newTrackDefaults
。这意味着 getter newTrack
永远不会更新。这意味着 context.getters.newTrack
每次都返回相同的对象。因此,您认为正在创建的所有"new"轨道实际上都是相同的轨道。
在处理默认值时,我喜欢创建一个返回默认值的函数。然后我可以随时随地调用该函数,不涉及时髦的缓存业务。
function newTrackDefaults() {
return {
tune:[],
// and other properties
}
}
setUpNewScene: context => {
let newScene = JSON.parse(JSON.stringify(context.state.newSceneDefaults))
let newTrack = newTrackDefaults()
newScene.tracks.push(newTrack)
context.commit('addNewScene', newScene)
}
有趣的事实:getter 可以返回函数,所以你也可以这样修复它。
newTrack: state => () => {
let newTrack = JSON.parse(JSON.stringify(state.newTrackDefaults))
return newTrack
},
现在你需要调用 getter,因为它现在是一个函数。
let newTrack = context.getters.newTrack()
关于javascript - Vuex getter 中的 JSON 对象复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50070900/
我刚刚开始使用 Vuex,但遇到了问题(这可能是我的一些无能为力的语法错误)。我有一个用户喜欢 like_items 并且有一个网络调用,它与一个项目不同。 mutations: { SET_TOGG
我刚开始在这里学习 Vuex。到目前为止,我一直将共享数据存储在 store.js 中。文件和导入store在每个模块中,但这越来越烦人,我担心会发生变异。 我正在努力解决的是如何使用 Vuex 从
我正在创建一个使用 Fabric.js 来管理 Canvas 的 Vue 应用程序。 我想使用 Vuex 管理 Canvas 状态。为此,我将 fabric canvas 实例设置为 vuex 状态变
我正在构建一个 Nuxt 应用程序,我正在从我在本地主机上运行的节点后端获取一些数据。 我有一个插件 getApps.js export default ({ store }) => { st
我想安装 Vuex 但出现错误。 // error npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree
我使用 vuex-persistedstate 包( https://github.com/robinvdvleuten/vuex-persistedstate )在浏览器上保持数据状态。 我使用 A
假设我有一个简单的 Vuex 状态来保存食谱: const state = { recipe: { id: '', name: "", ingr
目前,我有一个具有 2 个状态属性的商店 - 版本和冠军 + 2 个发出 GET 请求然后提交到状态的操作。第二个 GET 请求 URL 需要包含我从第一个 GET 请求获取的版本,如下所示: axi
我有一个基于 Vue 和 Vuex 的小应用程序。它只是一个包含类似项目的表格 {{ item.name }} Edit Items 数组是使用 getter 从
我有一个 Vuex getter,我从应用程序中的各个组件调用它。但是,我发现在调用 getter 之前需要稍微复杂一些的逻辑,所以我使用了 Vuex Action。如何使用操作中的参数调用 gett
为什么会出现此错误: Error [vuex] Do not mutate vuex store state outside mutation handlers. 这是什么意思? 当我尝试输入编辑输入
在 Nuxt 文档(here)中,它说“您可以选择将模块文件分解为单独的文件:state.js、actions.js、mutations.js 和 getters.js。” 我似乎找不到任何示例来说明
我正在使用 TypeScript 构建一个简单的 vue 项目。我在我的 vue 项目中编写了 vuex 商店,该商店有一个名为“计算”的子模块。但是一旦创建了包含子模块的主存储,就会发生奇怪的错误(
我完全熟悉 Vuex,但我对 Vue 组合 API 一无所知。这到底是怎么回事,它和Vuex有什么区别?它涵盖了 Vuex 中的哪些差距,以及何时何地使用它们更好? 感谢您的帮助。 最佳答案 首先,
简短的问题:是否可以通过 Nuxt Auth 模块手动更新 Vuex 中的用户数据? 为什么我有这个问题:我的问题是这个。我在用户文档中的 MongoDB 中保存了一些 Likes/Follows。我
尝试将带有 vuex-module-decorators 的存储模块加载到初始化程序中时出现此错误: vuex.esm.js?2f62:261 Uncaught TypeError: Cannot r
我有一个 VueX 商店,有两个模块,user.js 和merchant.js,顶层是index.js。 user.js 中的 getter 是: 重构 const getters = { s
我在我的代码库中偶然发现了这个错误,并试图看看是否有人可以修复它。 以下是我的 listings/actions.js export const fetchFeaturedListings = ({
我正在尝试将 Vuex 与 Vue 3 一起使用。这是我在 main.js 中的代码: import { createApp } from 'vue'; import App from './App.
我在我的代码库中偶然发现了这个错误,并试图看看是否有人可以修复它。 以下是我的 listings/actions.js export const fetchFeaturedListings = ({
我是一名优秀的程序员,十分优秀!