Vuejs пустая и заполненная форма

164
27 января 2018, 00:23

Делаю одностраничное приложение. На странице есть несколько форм, каждая из которых позволяет добавлять информацию в БД. И формы эти между собой связаны - сначала заполняешь одну, потом вторую и т.п. Одновременно с этим можно загрузить данные из БД в эти формы для редактирования и последующего обновления этих данных в БД.

Каждую форму я вынес в компонент. Для реактивности полям в форме назначил :value="". Если в Хранилище (vuex) есть данные, то они будут загружены в эти поля. Но как быть, когда данных в харнилище нет? Возникает резонная ошибка и компонент не отображается.

Ближе к сущностям. На странице есть форма для регистрации данных человека: ФИО, адрес и др. В хранилище две переменные:

  • person - для данных пользователя, которые получим из БД и которыми нужно будет автоматически заполнить форму + данные человека, которые сюда попадут из формы при нажатии кнопки "добавить" (а затем будут записаны в БД).
  • person_id - переменная для идентификатора человека, данные которого следует загрузить из БД (и заполнить ими форму). Если пусто тут, значит форма пустая.

Код предаставлен ниже:

export const store = new Vuex.Store({
        state: {
            person_id: 120,
            person: {},
        },

Таким образом планирую использовать одну форму и для создания новых записей. И для загрузки\редактирования существующих.

Но как быть с тем, что форма изначально при загрузке страницы пустая? Т.к. она пустая, а в форме проставлены :value="person.surname" и т.д., то возникает ошибка. И компонент (форма) вовсе не отображается.

Неужели единственное решение - вручную прописывать пустой объект по умолчанию в хранилище? Или есть другие варианты?

Answer 1

Как сказано в документации:

Vue не может отследить добавление или удаление свойства объекта. Чтобы поле стало реактивным, Vue превращает его в пару геттер/сеттер в ходе инициализации экземпляра.

Чтобы динамически добавить реактивное свойство, вам необходимо использовать метод:

Vue.set(this.object, key, value)

или

this.$set(this.object, key, value)

Иногда нужно добавить несколько свойств в существующий объект, например, с помощью Object.assign() или _.extend()

В данном случае документация советует использовать следующий метод:

this.object = Object.assign({}, this.object, { key1: value1, key2: value2 })

Поскольку

Vuex — это реактивная переменная Vue

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

Подробнее прочитайте в разделе документации Vue "Подробно о реактивности" и в разделе документации Vuex "Мутации"

READ ALSO
Как вставить текст с jQuery (AJAX) в HTML?

Как вставить текст с jQuery (AJAX) в HTML?

Подскажите, у меня вот такой HTML (CSS потом вынесу):

166
Просмотр пароля элемента input с типом password

Просмотр пароля элемента input с типом password

Допустим, у нас есть форма, и в ней есть текстовое поле с вводом пароля:

150
Разработка сайта на WordPress и git (github)?

Разработка сайта на WordPress и git (github)?

Есть хостинг, планируется туда загружать сайты для заказчиков на вордпресс(те

250
Логика RESTfull API

Логика RESTfull API

Интересует общепринятый принцип построения RESTful APIВ качестве бекэнда использовать планирую yii2 standart

157