javascript - 在 Vuex 中存储 Fabric.js Canvas 引用 - [vuex] 不要在突变处理程序之外改变 vuex 存储状态

标签 javascript vue.js canvas vuex fabricjs

我正在创建一个使用 Fabric.js 来管理 Canvas 的 Vue 应用程序。

我想使用 Vuex 管理 Canvas 状态。 为此,我将 fabric canvas 实例设置为 vuex 状态变量。

突变

setCanvas(state, canv) {
    state.canvas = canv
  }

在 Vue 组件中

const canvas = new fabric.Canvas('main-canvas')
this.setCanvas(canvas) //commit the mutation

在另一个变化中,我必须向 Canvas 添加一个对象:

addLayer(state, layer) {
    state.canvas.add(layer)
 }

运行这个突变时我得到以下错误:

[vuex] do not mutate Vuex store state outside mutation handlers.

我认为原因是fabric js实例本身在编辑 Prop 。而 vuex 似乎并不喜欢这样。

对于这个问题,存储结构对象的最佳方法是什么?或者有更好的解决方法吗?

最佳答案

将它存储在 vuex 中并不理想,我知道你为什么要这样做。可能是因为您的应用程序周围的多个组件想要调用 Canvas 方法。

它似乎将它的副本存储在已触发的事件上并更改对象,这在技术上是突变处理程序之外的突变。

尝试在一个组件中处理与 Canvas 初始化有关的所有事情(在“mounted”方法中),然后您可以使用 Vuex 状态的监视来检测诸如何时按下添加圆圈的按钮,然后您可以在该组件中对其使用react。至少我是这样处理类似案件的。如果我找到更好的方法,会更新这个。

此外,如果您找到更好的方法,请分享。

关于javascript - 在 Vuex 中存储 Fabric.js Canvas 引用 - [vuex] 不要在突变处理程序之外改变 vuex 存储状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62214504/

相关文章:

javascript - Google map 在世界 50% 以上的区域绘制矩形

c# - 将 z-index 添加到窗口

javascript - 我正在制作 Atari Breakout 克隆版,我想知道如何判断球是否击中了方 block 的某一侧

javascript - 使用 HTML 5 Canvas 自动滚动

javascript - 受污染的 Canvas ,由于 CORS 和 SVG?

javascript - 滚动背景动画

javascript - 异步函数将现有数组返回为未定义

cordova - 如何将 cordova 包裹在现有的 nuxt.js 项目中?

vue.js - 如何在 v-select 中的选定选项中使用自定义标签模板?

vue.js - Vue 警告 : 'Unknown custom element' with re-exported component