Vuejs: как отправлять только определенные атрибуты формы из объекта хранилища vuex

#vue.js #vuejs2

#vue.js #vuejs2

Вопрос:

Мне трудно выбраться из бесконечного круга получения / настройки данных. Я уверен, что есть очень очевидное решение, которое я по какой-то причине полностью игнорирую.

Когда пользователь входит в систему, я получаю / настраиваю их организацию на хранилище vuex. Все работает отлично.

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

Вот одно поле из моей формы, чтобы показать, что я делаю:

Пример HTML:

 <input type="text" id="postalCode" placeholder="45321" 
    :class="{'border-red-500': !$v.organization.zip.required}"
    v-model="organization.zip"
    v-mask="'#####'"
/>
  

Вот мой <script> блок, показывающий, как я получаю данные своей организации.

 computed: {
    organization() {
      return this.$store.getters["organization/organization"];
    },
    ...
},
data: () => ({
    errors: false,
}),
validations: {
    organization: {
        name: { required },
        email: { required, email },
        phone: { required },
        streetAddress1: { required },
        city: { required },
        state: { required },
        zip: { required, minLength: minLength(5) },
      },
},
methods: {
    async handleSaveOrganization() {
        this.$v.$touch();

        if (this.$v.$invalid) {
            this.errors = true;
        } else {
            try {
                await this.$store.dispatch("organization/updateOrganization", this.organization)
                .then((response) => {
                    if (response.status === 200) {
                    console.log("organization was updated!");
                }
            });
        } catch (error) {
          console.log('Error!');
        }
      }
    },
},

  

Я использую vuelidate в качестве библиотеки проверки. Поля в моем validations объекте — это поля в моей форме. Проверка также работает. Проблема, с которой я сталкиваюсь, заключается в отправке данных. Я хочу отправлять только поля формы, а не весь объект, как сейчас.

Когда я извлекаю организацию из хранилища, она содержит все атрибуты id , включая uuid , createdAt и т.д. Я не хочу включать их в свои данные формы.

Я использую NestJS для своего бэкэнда, и в моих правилах проверки я не разрешаю uuid отправку на сервер. Все работает отлично — я неправильно отправляю данные.

Вместо этого:

 {
   id: 122,
   name: "Example",
   email: "example@email.com",
   uuid: 123-44566-3454
} 
  

Я хочу отправлять только те поля, которые перечислены в моем объекте проверки.
Например:

 {
   name: "Example Updated!",
   email: "example@email.com"
} 
  

Я пробовал различные способы уничтожения или удаления атрибутов. Каждый из них кажется действительно отрывочным.

Как я могу надежно отправить свою форму без необходимости делать с ней кучу, казалось бы, хакерских вещей? Спасибо за любые предложения!

ТЕКУЩЕЕ РЕШЕНИЕ

Спасибо, gijoe за ваше предложение. Вот что я придумал для всех, кто может столкнуться с этим.

Когда я отправляю (делаю PATCH запрос) на обновление своей организации, я отправляю событие отправки в хранилище vuex моей организации.

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

 updateOrganization(organization) {
    const token = Cookie.get("accessToken");
    const {
      name,
      streetAddress1,
      streetAddress2,
      city,
      state,
      zip,
      email,
      phone,
    } = organization;
    const obj = {};

    obj.name = name;
    obj.streetAddress1 = streetAddress1;
    obj.streetAddress2 = streetAddress2;
    obj.city = city;
    obj.state = state;
    obj.zip = zip;
    obj.email = email;
    obj.phone = phone;

    return client
      .patch(`/v1/organizations/${organization.id}`, obj, {
        headers: { Authorization: `Bearer ${token}` },
      })
      .then((response) => {
        return response;
      })
      .catch(function (error) {
        console.log("OrganizationService.updateOrganization error: ", error);

        return Promise.reject(error);
      });
  },
  

organization Аргумент, который передается (из хранилища vuex), по-прежнему имеет все свойства (включая id, uuid и т. Д.). Мне нужно было иметь возможность получить идентификатор, чтобы сделать правильный PATCH запрос. Оттуда я создаю временный объект и отправляю его. Надеюсь, это поможет кому-то еще!

Ответ №1:

Один из вариантов — выполнить следующее: объявить объект без атрибутов, например.x.

 let org = {};
  

а затем массив со всеми атрибутами, которые вы хотите скопировать
, например.

  var that = this;
 ['name','email'].forEach(prop=>org[prop]=that.organization[prop]);
  

а затем отправьте объект «org» вместо this.organization

второй вариант — уничтожить атрибуты, например.x.

 let {name, address} = this.organization;
  

а затем инициализировать из них новый объект

  let org = {name,address}
  

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

1. Спасибо за предложение! Это помогло мне двигаться в направлении, которое, я думаю, я смогу поддерживать во всем приложении. Я обновил свой вопрос тем, что придумал. Спасибо!