Автор оригинала: FreeCodeCamp Community Member.
Гоша Аринич
Управляемые входы Включить простые вещи, как Отключение кнопки отправки Когда некоторые поля отсутствуют или неверны.
Но мы не останавливаем там, конечно.
Хотя кнопка отключения приятно, пользователь может не знать, почему они не могут нажать эту кнопку. Они могут не знать, какую ошибку они сделали это отключено, или даже какое поле вызывает это.
И это не красиво. Мы абсолютно должны исправить это.
Основы контролируемых входов
Использование управляемых входов подразумевает, что мы храним все входные значения в нашем состоянии. Затем мы можем оценить определенное условие с каждым изменением стоимости и сделать что-то на основе этого. Ранее все, что нам делали, было отключить кнопку.
Мы использовали простое выражение, чтобы вычислить, следует ли отключить кнопку (например, когда поле электронного письма или пароля было пустым):
const { email, password } = this.state;const isEnabled = email.length > 0 && password.length > 0;
Это сделала работу. Теперь, чтобы пометить плохие входы, нам нужно спросить себя пару вопросов.
Как будут показаны ошибки?
Это важный вопрос, чтобы спросить себя, поскольку разные требования могут оказывать разрешение на разные ошибки.
Есть много способов показать ошибки ввода. Например, вы могли бы:
- Отображать ❌
- Отметьте входы красные, которые содержат плохие данные
- Отображать ошибки прямо рядом с соответствующими входами
- Отображение списка ошибок в верхней части формы
- Любая комбинация вышеперечисленного или чего-то еще!
Какой из них вы должны использовать? Ну, это все о том, что вы хотите предоставить. Выберите то, что вы хотите.
С целью этого поста я собираюсь использовать простейшую – маркировку плохих входов красных, без чего-либо еще.
Как будут представлены ошибки?
То, как вы хотите отобразить ошибки, влияет на то, как вы можете их представлять.
Чтобы указать, является ли конкретный вход, без какой-либо дополнительной информации о Почему Это может быть недействительным, что-то подобное будет достаточно:
errors: { name: false, email: true,}
ложь
означает отсутствие ошибок или полностью действительных; правда
означает поле недействительным.
В будущем, если мы решим, что нам нужно хранить причину, что что-то было недействительным, мы можем заменить True/false со строкой, содержащей сообщение об ошибке.
Но как этот объект ошибки создан?
Теперь, когда мы знаем, как мы хотим отображать ошибки и знать, как их представлять, есть что-то важное значение.
Как на самом деле создать ошибки.
Или поставить другой способ: как мы предпринимаем существующие входы, проверяйте их и получите нужны объект ошибок?
Нам нужно понадобиться Функция проверки для этого. Это
Мы продолжим при примере формы регистрации. Напомним, что у нас было это:
const { email, password } = this.state;const isEnabled = email.length > 0 && password.length > 0;
На самом деле, мы можем превратить этот кусок логики в функцию проверки, которая будет:
- Есть
Электронная почта: правда
Если электронная почта пуста, и - Есть
Пароль: правда
Если пароль пуст
function validate(email, password) { // true means invalid, so our conditions got reversed return { email: email.length === 0, password: password.length === 0, };}
Оставшийся кусок
Осталась одна часть головоломки.
У нас есть функция проверки, и мы знаем, как мы хотим показать ошибки. У нас также есть форма.
Теперь пришло время подключить точки.
Шаг 1: Запустите валидатор в оказывать
Отказ
Это не использует иметь проверить
Функция, если мы никогда не будем называть это. Мы хотим подтвердить входы каждый раз (да, каждый раз) образуется повторно визуализации – возможно, на входе есть новый символ.
const errors = validate(this.state.email, this.state.password);
Шаг 2: Отключить кнопку.
Это простой. Кнопка должна быть отключена, если есть какие-либо ошибки (то есть, если какие-либо из ошибок Значения
True ).
const isEnabled = !Object.keys(errors).some(x => errors[x]);
Шаг 3: Отметьте входы как ошибочные.
Это может быть что угодно. В нашем случае добавляя Ошибка
. Урок к плохим входам достаточно.
Мы также можем добавить простое правило CSS:
.error { border: 1px solid red; }
Еще кое-что
Если вы посмотрите на корзину JS выше, вы можете заметить что-то странное. Поля отмечены красным по умолчанию, поскольку пустые поля недействительны.
Но мы даже никогда не давали пользователю возможность напечатать первым! Кроме того, поля красные, если в первый раз сосредоточены в первый раз.
Это не здорово для UX.
Мы собираемся исправить это, добавив Ошибка
. Класс, если поле было в фокусе хотя бы один раз, но с тех пор было размыто. Это гарантирует, что в первый раз пользователь фокусируется на поле, ошибка не появится прямо сейчас. Вместо этого он только появится, когда поле будет размытым. Однако на последующем фокусировке появится ошибка.
Это легко достижимо, используя ньюрур
Событие и состояние, чтобы отслеживать то, что было размыто.
class SignUpForm extends React.Component { constructor() { super(); this.state = { email: '', password: '', touched: { email: false, password: false, }, }; }
// ...
handleBlur = (field) => (evt) => { this.setState({ touched: { ...this.state.touched, [field]: true }, }); }
render() const shouldMarkError = (field) => { const hasError = errors[field]; const shouldShow = this.state.touched[field];
return hasError ? shouldShow : false; };
// ...
type="text" placeholder="Enter email" value={this.state.email} onChange={this.handleEmailChange} /> }}
Не так сложно, верно?
Последние штрихи
Обратите внимание, что ДЕКЛАМЕРОРОР
только влияет на полевую презентацию. Состояние кнопки отправки все равно зависит только от проверки Ошибки
Отказ
Хотите добавить хорошее окончательное прикосновение? Вы можете принудительно отображать ошибки во всех полях, независимо от того, были ли они в фокусе, когда пользователь охватывает или щелкает кнопку отключенного отправки. Теперь посмотрите на себя.
Я изначально опубликовал это в моем блоге на GOSHAKKKK.NAME.
Если вы копаете это, дайте мне хлопы и проверьте Моя серия по обработке форм с реагированием Отказ Вы также можете Подписаться Чтобы получить новые посты прямо в вашем почтовом ящике.