Вступление
В качестве веб-разработчика, приходящего из фона Angularjs, я взял на себя как должное встроенную поддержку присутствующей в форме формы и насколько легко выходить, добавив наши собственные собственные правила проверки, пока не стараюсь делать то же самое в Reactjs. Я искал для подходящих способов сделать это в Reactjs и придумал интересное решение, концепции заимствования от Angularjs.
Angulars образуют валидаторы 101
В Angularjs валидатор работает по информации о входном поле, который связан с ним, проверяя значение поля против определенного ограничения. Каждое поле ввода имеет список валидаторов, которые хранятся как $ валидаторы
(для синхронной проверки) и $ Asyncvalidators
(для асинхронной проверки). Когда связанные изменения входного поля изменяются, AngularJS запускает список валидалей, связанных с этим входным полем. Окончательная достоверность поля ввода зависит от всех валидаторов, возвращающих правда
для действительности или любого из них возвращается ложь
Для недействительных – имеет смысл? Кроме того, angularjs также позволяет нам отображать уникальное сообщение об ошибке (для правила валидатора, которое возвращает false) под полем ввода, связанного с этим валидатором, точно так же:
Сделать подобную логику в реагировании
Для этого примера мы собираемся создать форму входа в систему, которую вы видели выше в ReactJS. Форма имеет два поля ввода – один для имени пользователя, а другой для пароля – и кнопка, которая отключена, если только форма не будет действительной.
Наша схема или объект валидатора
Для имени пользователя действует, есть два ограничения, которые должны быть правдой
- Имя пользователя должно быть длиннее 2 символов
- Имя пользователя должно содержать только буквенные символы.
Для пароля, который должен быть действительным, есть только одно ограничение
- Пароль не должен быть короче 6 символов
Теперь давайте создадим нашу схему Validator (что просто простой объект JavaScript) из описания выше, и сохранить его как /validators.js
Отказ
const validator = { username: { rules: [ { test: /^[a-z0-9_]+$/, message: 'Username must contain only alphabets-numeric lowercase characters', }, { test: (value) => { return value.length > 2; }, message: 'Username must be longer than two characters', }, ], errors: [], valid: false, state: '', }, password: { rules: [ { test: (value) => { return value.length >= 6; }, message: 'Password must not be shorter than 6 characters', }, ], errors: [], valid: false, state: '' }, }; export default validator;
Рассекать объект валидатора
Из вышеуказанного фрагмента вы заметите, что объект Validator имеет две клавиши, которые соответствуют количеству входов, которые есть наша форма. Каждый из клавиш имеет следующие свойства:
Правила: Это определяет массив ограничений, что данный вход должен быть проверен против
Ошибки: Это массив, который в конечном итоге содержит сообщения об ошибках, возвращаемых, запустив правила к текущему состоянию ввода.
Действительно: Это представляет состояние поля ввода после применения правил, связанных с ним.
Государство: Это содержит текущее значение или состояние входного поля.
Создание нашей формы INVEDJS.
Создать новый файл, /signin.jsx
Отказ
import React, { Component } from 'react'; import validators from './validators'; export default class Signin extends Component { constructor() { super(); this.state = { userInfo: { username: '', password: '', } }; // Set of validators for signin form this.validators = validators; // This resets our form when navigating between views this.resetValidators(); // Correctly Bind class methods to reacts class instance this.handleInputChange = this.handleInputChange.bind(this); this.displayValidationErrors = this.displayValidationErrors.bind(this); this.updateValidators = this.updateValidators.bind(this); this.resetValidators = this.resetValidators.bind(this); this.handleSubmit = this.handleSubmit.bind(this); this.isFormValid = this.isFormValid.bind(this); } /** * This function is called whenever a form input is changed * Which in turn updates the state of this component and validators */ handleInputChange(event, inputPropName) { const newState = Object.assign({}, this.state); newState.userInfo[inputPropName] = event.target.value; this.setState(newState); this.updateValidators(inputPropName, event.target.value); } /** * This function handles the logic when submiting the form. * @TODO make an API request to authenticate the user */ handleSubmit(e) { console.log(this.state.userInfo); console.log('Yepee! form submitted'); e.preventDefault(); } /** * This function updates the state of the validator for the specified validator */ updateValidators(fieldName, value) { this.validators[fieldName].errors = []; this.validators[fieldName].state = value; this.validators[fieldName].valid = true; this.validators[fieldName].rules.forEach((rule) => { if (rule.test instanceof RegExp) { if (!rule.test.test(value)) { this.validators[fieldName].errors.push(rule.message); this.validators[fieldName].valid = false; } } else if (typeof rule.test === 'function') { if (!rule.test(value)) { this.validators[fieldName].errors.push(rule.message); this.validators[fieldName].valid = false; } } }); } // This function resets all validators for this form to the default state resetValidators() { Object.keys(this.validators).forEach((fieldName) => { this.validators[fieldName].errors = []; this.validators[fieldName].state = ''; this.validators[fieldName].valid = false; }); } // This function displays the validation errors for a given input field displayValidationErrors(fieldName) { const validator = this.validators[fieldName]; const result = ''; if (validator && !validator.valid) { const errors = validator.errors.map((info, index) => { return {errors}
Когда все это сказано и сделано
Заключение
По большей части, то есть все, что вам нужно для реализации настраиваемой динамической проверки формы в ReactJS.
Области возможных улучшений могут включать
Создание многоразового компонента для ваших входных элементов, где пропускаются валидаторы для каждого входа.
Создание многоразового компонента формы, которая принимает схему Validator в качестве реквизита и генерирует функционирующую форму.
Рекомендации
Вот несколько ссылок, которые вы можете найти полезными!
- Пользовательские валидаторы в Angularjs – Включает в себя больше идей на тему того, как Angularjs обрабатывает валидацию формы
- Новичок React Video Course – Узнайте о RECTJS в вашем собственном темпе
- Rectjs – Библиотека JavaScript для построения пользовательских интерфейсов
- Материал дизайн – Современная адаптивная фраундельная структура на основе дизайна материала
Мы всегда доступны, чтобы ответить на любые вопросы, которые вы можете иметь в write@codentementor.io!