Как я могу предотвратить вмешательство Vuex в мой экземпляр класса?

Я пытаюсь сохранить экземпляр класса в Vuex (EditorState из ProseMirror). Этот класс более или менее неизменен извне, что означает, что всякий раз, когда я хочу внести в него изменения, я просто помещу новый экземпляр класса в Vuex.

Поэтому мне не нужно отслеживать изменения Vue здесь, и на самом деле, похоже, что это на самом деле мешает внутренней работе ProseMirror, поэтому мне было интересно, можно ли как-то изолировать мой объект от Vue, чтобы он обрабатывался атомарно,

1 ответ

Решение

Я исправил это, взяв предложение от главного ответа на этот вопрос и заморозив мой экземпляр класса перед тем, как передать его Vuex.

const store = new Store<AppState>({
    state: {
        editor: Object.freeze(editorState), // freeze because Vue reactivity messes it up
        filename: null,
        metadata: {}
    },
    mutations: {
        updateDocument(context, transaction: Transaction) {
            console.log("updateDocument called");

            // freeze again
            context.editor = Object.freeze(context.editor.apply(transaction));
        }
    },
    strict: process.env.NODE_ENV === "development"
});

поскольку Object.freeze не является рекурсивным, это не оказывает никакого влияния на внутреннюю работу ProseMirror, но отговаривает Vue от попыток изменить объект.

Другие вопросы по тегам