VueJS определяет, была ли нажата кнопка в методе наблюдения

#javascript #vue.js #vuejs2

#javascript #vue.js #vuejs2

Вопрос:

Я создаю функцию отмены / повтора в VueJS. Я watch изменяю настройки и добавляю новый элемент в массив изменений при изменении настроек. У меня также есть метод отмены при нажатии кнопки отмены.

Однако, когда кнопка нажата и последняя настройка отменяется, настройки изменяются, и просмотр запускается снова.

Как я могу предотвратить добавление нового элемента в массив изменений, если настройки изменились, но это произошло из-за нажатия кнопки отмены?

 (function () {

var Admin = {};
Admin.init = function () {

};

var appData = {
    settings: {
        has_border: true,
        leave_reviews: true,
        has_questions: true
    },
    mutations: [],
    mutationIndex: null,
    undoDisabled: true,
    redoDisabled: true
};

var app = new Vue({
    el: '#app',
    data: appData,
    methods: {
        undo: function() {
            if (this.mutations[this.mutationIndex - 1]) {
                let settings = JSON.parse(this.mutations[this.mutationIndex - 1]);
            
                this.settings = settings;
                this.mutationIndex = this.mutations.length - 1;
                
                console.log (settings);
            }
        },
        redo: function() {
            
        }
    },
    computed: {
        border_class: {
            get: function () {
                return this.settings.has_border ? ' rp-pwb' : ''
            }
        },
        undo_class: {
            get: function () {
                return this.undoDisabled ? ' disabled' : ''
            }
        },
        redo_class: {
            get: function () {
                return this.redoDisabled ? ' disabled' : ''
            }
        }
    },
    watch: {
        undoDisabled: function () {
            return this.mutations.length;
        },
        redoDisabled: function () {
            return this.mutations.length;
        },
        settings: {
            handler: function () {

                let mutation = JSON.stringify(this.settings),
                    prevMutation = JSON.stringify(this.mutations[this.mutations.length-1]);

                if (mutation !== prevMutation) {
                    this.mutations.push(mutation);
                    this.mutationIndex = this.mutations.length - 1;
                    this.undoDisabled = false;
                }
            },
            deep: true
        }
    }
});

Admin.init();
})();
  

Ответ №1:

Поскольку вы вносите изменения нажатием кнопки, вы можете создать метод для достижения своей цели вместо использования наблюдателей.

 methods: {
   settings() {
      // call this method from undo and redo methods if the conditions are met.
      // move the watcher code here.
   }
}
  

КСТАТИ,
Если вы не используете сеттер в вычисляемых свойствах, вам не нужны геттеры, так что этого достаточно:

 border_class() {
    return this.settings.has_border ? ' rp-pwb' : ''
},
  

Эти коды наблюдателей выглядят как принадлежащие вычисленным:

 undoDisabled() {
    return this.mutations.length;
},
redoDisabled() {
    return this.mutations.length;
},
  

Комментарии:

1. Если я перемещаю настройки в методы, я получаю сообщение об ошибке vue.js:634 [Vue warn]: Method "settings" has already been defined as a data property.

2. Объект настроек имеет некоторые свойства по умолчанию, и при изменении этих настроек он должен создать новую мутацию в массиве

3. Измените имя метода и соответствующим образом упорядочьте свой код.

4. Но тогда что будет привязывать объект настроек к методу?

5. Не существует такой вещи, как привязка объекта к методу. Просто измените значения объекта в своем методе, если это необходимо.