Рубрики
Без рубрики

Реализация динамических форм валидаторов в ReactJS

Узнайте, как реализовать валидаторы динамической формы в ReactJS – вдохновленные Angularjs.

Автор оригинала: Orion.

Вступление

В качестве веб-разработчика, приходящего из фона Angularjs, я взял на себя как должное встроенную поддержку присутствующей в форме формы и насколько легко выходить, добавив наши собственные собственные правила проверки, пока не стараюсь делать то же самое в Reactjs. Я искал для подходящих способов сделать это в Reactjs и придумал интересное решение, концепции заимствования от Angularjs.

Angulars образуют валидаторы 101

В Angularjs валидатор работает по информации о входном поле, который связан с ним, проверяя значение поля против определенного ограничения. Каждое поле ввода имеет список валидаторов, которые хранятся как $ валидаторы (для синхронной проверки) и $ Asyncvalidators (для асинхронной проверки). Когда связанные изменения входного поля изменяются, AngularJS запускает список валидалей, связанных с этим входным полем. Окончательная достоверность поля ввода зависит от всех валидаторов, возвращающих правда для действительности или любого из них возвращается ложь Для недействительных – имеет смысл? Кроме того, angularjs также позволяет нам отображать уникальное сообщение об ошибке (для правила валидатора, которое возвращает false) под полем ввода, связанного с этим валидатором, точно так же:

Скриншот-localhost 8001-2017-03-26-15-24-02.png

Сделать подобную логику в реагировании

Для этого примера мы собираемся создать форму входа в систему, которую вы видели выше в 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}
        
); } return result; } // This method checks to see if the validity of all validators are true isFormValid() { let status = true; Object.keys(this.validators).forEach((field) => { if (!this.validators[field].valid) { status = false; } }); return status; } // Renders the template render() { return (

Sign into your account

person this.handleInputChange(event, ‘username’)} />
{ this.displayValidationErrors(‘username’) }
lock this.handleInputChange(event, ‘password’)} />
{ this.displayValidationErrors(‘password’) }
); } }

Когда все это сказано и сделано

Valid.png.png

Заключение

По большей части, то есть все, что вам нужно для реализации настраиваемой динамической проверки формы в ReactJS.

Области возможных улучшений могут включать

  • Создание многоразового компонента для ваших входных элементов, где пропускаются валидаторы для каждого входа.

  • Создание многоразового компонента формы, которая принимает схему Validator в качестве реквизита и генерирует функционирующую форму.

Рекомендации

Вот несколько ссылок, которые вы можете найти полезными!

  • Пользовательские валидаторы в AngularjsВключает в себя больше идей на тему того, как Angularjs обрабатывает валидацию формы
  • Новичок React Video Course – Узнайте о RECTJS в вашем собственном темпе
  • RectjsБиблиотека JavaScript для построения пользовательских интерфейсов
  • Материал дизайнСовременная адаптивная фраундельная структура на основе дизайна материала

Мы всегда доступны, чтобы ответить на любые вопросы, которые вы можете иметь в write@codentementor.io!