@pqgg7nwkd4

К в Vue-динамической форме организовать отображение ошибки?

Добрый день.

По дизайну форма имеет поля, имеет динамические поля (те что пользователь можно добавить/убавить). В случае, если пользователь ввел что-то некорректно, ошибка показывается под соответствующим полем.

Рассмотрим пример формы авторизации, где пользователю предлагается ввести логин, пароль и сколько угодно ролей:
<template>
    <FForm @submit="doAuth" ref="authForm">
        <FInputText caption="Имя пользователя" v-autofocus v-model="authForm.login"></FInputText>
        <FInputText caption="Пароль" password v-model="authForm.password"></FInputText>

        <div v-for="(_, index) in authForm.roles">
            <FInputText
                    caption="Роль"
                    v-model="authForm.roles[index].name"
            ></FInputText>
        </div>
        <button @click="addRole">+</button>

        <FButton caption="Войти" submit class="submit-button"></FButton>
    </FForm>
</template>

<script>
    export default {
        name: "Test",
        data() {
            return {
                authForm: {
                    roles: []
                }
            }
        },
        methods: {
            addRole() {
                this.authForm.roles.push({})
            },
            doAuth(e) {
                // ...
            }
        },
    }
</script>

Пользователь ввел неверно логин и вторую роль. Сервер передал следующий ответ:
{
  "errors": {
    "login": "Ошибка в логине",
    "role[1].name": "Ошибка во второй роли"
  }
}

Вопрос, как не усложняя шаблон (template) организовать отображение ошибок?

Усложнять реализацию FForm и FInputText можно сколько угодно.
  • Вопрос задан
  • 247 просмотров
Решения вопроса 1
@pqgg7nwkd4 Автор вопроса
Блин, написал развернутый ответ. Нажал предпросмотр и забыл. А потом вернулся, обновил и... всё стерлось. 21 век, блин.

Сделал, что теперь можно делать так:
<FForm @submit="doAuth" v-model="authForm">
        <FInputText caption="Имя пользователя" v-autofocus f-name="login"></FInputText>
        <FInputText caption="Пароль" password f-name="password"></FInputText>

        <div v-array="roles">
            <FInputText
                    caption="Роль"
                    f-name="name"
            ></FInputText>
        </div>
        <button @click="rolesAdd({})">+</button>

        <FButton caption="Войти" submit class="submit-button"></FButton>
    </FForm>

где f-name и v-array работают интуитивно понятно, а собранный объект складывается в authForm, который определен в теге FForm.

Сделать можно много интересный вещей, которые нельзя сделать в vue из коробки. Копать в сторону модулей компилятора vue. Примеры тут: https://github.com/vuejs/vue/tree/dev/src/platform...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Koteezy
<FInputText
                    caption="Роль"
                    v-model="authForm.roles[index].name"
            ></FInputText>
<template v-if="hasRoleError(index)">
{{ errors.role[index].name }}
</template>


hasRoleError(index) {
  return this.errors.role && this.errors.role[index];
}


Отталкивайтесь от этого.

Возможно, индексы будут не правильные, может где-то потребуется не [index] а [--index]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы