我正在创建一个使用 Fabric.js 来管理画布的 Vue 应用程序。
我想使用 Vuex 管理画布状态。 为此,我将结构画布实例设置为 vuex 状态变量。
突变
setCanvas(state, canv) {
state.canvas = canv
}
在 Vue 组件中
const canvas = new fabric.Canvas('main-canvas')
this.setCanvas(canvas) //commit the mutation
在另一个突变中,我必须将一个对象添加到画布:
addLayer(state, layer) {
state.canvas.add(layer)
}
运行此突变时,出现以下错误:
[vuex] do not mutate Vuex store state outside mutation handlers.
我认为原因是织物 js 实例本身就是在编辑道具。而 vuex 似乎不喜欢这样。
存储此问题的 fabric 对象的最佳方法是什么?或者有更好的方法来解决这个问题?
将其存储在 vuex 中并不理想,我知道你会想这样做。可能是因为应用周围的多个组件想要调用画布方法。
它似乎将其副本存储在触发的事件上并更改对象,从技术上讲,这是突变处理程序之外的突变。
尝试在一个组件中处理与画布初始化有关的所有事情(在"mounted"方法中(,然后您可以使用 Vuex 状态的手表来检测诸如何时按下添加圆圈的按钮之类的事情,然后您可以在该组件中对其进行反应。至少我是这样处理类似案件的。如果我找到更好的方法,将更新此内容。
另外,如果您找到了更好的方法,请分享。
在 Vue3 中,我将通过使用提供/注入功能来创建全局属性:
所以在主.js文件中:
// src/main.js
import { createApp, reactive } from 'vue'
import App from './App.vue'
const gobalsProperties = {'canvas': null};
const app = createApp(App);
app.provide('gobalsProperties', gobalsProperties)
app.mount('#app');
然后需要将其注入到您将要像这样使用它的所有组件中
export default {
inject: ['gobalsProperties'],
...
并且可以使用this.gobalsProperties
在脚本中访问它。因此,在具有<canvas >
标记的组件中,您可以在挂载函数中启动this.gobalsProperties.canvas
,如下所示:
mounted() {
this.gobalsProperties.canvas = new fabric.Canvas('main-canvas')
...