-Поиск по дневнику

Поиск сообщений в rss_rss_hh_new

 -Подписка по e-mail

 

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 17.03.2011
Записей:
Комментариев:
Написано: 51


Валидация React компонентов с помощью Livr.js

Воскресенье, 10 Сентября 2017 г. 14:10 + в цитатник
one_more сегодня в 14:10 Разработка

Валидация React компонентов с помощью Livr.js

    Пару лет назад я увидел на хабре статью про LIVR и с тех пор использую библиотеку на всех проектах. С переходом на React я адаптировал для валидации ее же, т.к. существующие решения не предлагали гибкости которой мне хотелось. Свое решение я уже использую на двух проектах и решил выложить в npm — может кому-то еще оно покажетсяя удобным.
    Пакет называется react-livr-validation.

    Пример базового использвания
    import React from 'react';
    import Validation, {DisabledOnErrors, ValidationInput} from 'react-livr-validation';
    
    const schema = {
        login: ['required', 'not_empty'],
        password: ['required', 'not_empty']
    };
    
    const data = {
        login: '',
        password: ''
    };
    
    export default function() {
        return (
            
                
    ); }

    Компонент принимает валидационную схему и первоначальные данные(если данные не валидны, кнопка submit сразу будет неактивна), так же можно передать custom rules и aliased rules
    const customRules = {
        alpha_chars: function() {
            return function(value) {
                if (typeof value === 'string') {
                    if (!/[a-z,A-Z]+/.test(value)) {
                        return 'WRONG_FORMAT';
                    }
                }
            };
        }
    };
    const aliasedRules = [
        {
            name: 'strong_password',
            rules: { min_length: 6 },
            error: 'TOO_SHORT'
        }
    ];
    
          // ... form
    
    

    Обертка ValidationInput добавляет в инпут свои обработчики событий, на которые будет происходить валидация. По умолчанию это события change, blur, keyup.
    
            
    
    

    Есть возможность реализовать свою обертку — пакет экпортит HOC, который прокидывает в пропсы api
    // @flow
    
    import React, {Component} from 'react'
    import {ValidationComponent} from 'react-livr-validation'
    import get from 'lodash/get'
    import noop from 'lodash/noop'
    import compose from 'ramda/src/compose'
    import styled from 'styled-components'
    
    type DataChunk = {
        name: string,
        value: any
    }
    
    type State = {
        touched: boolean
    }
    
    type Props = {
        // will be passed by HOC
        setData: (data: DataChunk) => void,
        getError: (name: string) => ?string,
        getErrors: () => Object,
        className: string, // for the error block
        style: Object // for the error block
        errorCodes: Object,
        
        name: string,
        field: string
    }
    
    class NestedError extends Component {
        props: Props;
        
        isTouched() {
            const {children} = this.props;
            return get(children, 'props.value')
        }
        
        state: State = {
            touched: this.isTouched()
        }
        
        setTouched() {
            this.setState({
                touched: true
            })
        }
        
        cloneElement() {
            const {children} = this.props;
            const onBlur = get(children, 'props.onBlur', noop);
            return React.cloneElement(
                children,
                {
                    onBlur: compose(this.setTouched, onBlur)
                }
            )
        }
        
        render() {
            const {touched} = this.state;
            const {
                children, 
                field, 
                name, 
                getError,
                errorCodes,
                style,
                className
            } = this.props;
            const errors = getErrors();
            const error = get(errors, `${field}`.${name});
            return (
                
    {touched ? children : this.cloneElement()} {error && {errorCodes[error] || error} }
    ); } } const Error = styled.div` color: red; `; export default ValidationComponent(NestedError)
    Original source: habrahabr.ru (comments, light).

    https://habrahabr.ru/post/337582/

    Метки:  

     

    Добавить комментарий:
    Текст комментария: смайлики

    Проверка орфографии: (найти ошибки)

    Прикрепить картинку:

     Переводить URL в ссылку
     Подписаться на комментарии
     Подписать картинку