Проверка ReduxForm: вложенные значения - PullRequest
0 голосов
/ 04 октября 2018

У меня есть validatioin в ReduxForm, работающее до тех пор, пока мне не нужно проверить поле, имя которого вложено, например: location.coordinates[0].

Эти данные в Redux Store выглядят так:

"location" : {
    "type" : "Point",
    "coordinates" : [ 
        103.8303, 
        4.2494
    ]
},

При попытке проверить такие поля, используя

Подход 1

if (!values.location.coordinates[0]) {
    errors.location.coordinates[0] = 'Please enter a longtitude';
}

Я получаю ошибку:

TypeError: Невозможно прочитать свойство'координаты' неопределенного

Подход 2

if (values.location !== undefined) {
    errors.location.coordinates[0] = 'Please enter a longtitude';
    errors.location.coordinates[1] = 'Please enter a latitude';
}

Я получаю сообщение об ошибке:

Ошибка типа: Ошибка чтения свойства'координаты' не определены

Вопрос: Как правильно обрабатывать такие поля?

/ src / Containers / Animals / AnimalForm.js

import React, { Component } from 'react';
import { connect } from 'react-redux';
import { reduxForm, Field } from 'redux-form';
import { renderTextField } from './FormHelpers';

class AnimalForm extends Component {
    render() {
        return (
            <div>
                <form onSubmit={ this.props.handleSubmit }                     
                        <Field
                            label="Longitude"
                            name="location.coordinates[0]"
                            component={renderTextField}
                            type="text"
                        />                      
                        <Field
                            label="Latitude"
                            name="location.coordinates[1]"
                            component={renderTextField}
                            type="text"
                        />   
                </form>
            </div>
        )
    }

}

const validate = values => {
    let errors = {}

    if (values.location !== undefined) {
        errors.location.coordinates[0] = 'Please enter a longtitude';
        errors.location.coordinates[1] = 'Please enter a latitude';
    }
    if ((values.location !== undefined) && (values.location.coordinates !== undefined)) {
        errors.location.coordinates[0] = 'Please enter a longtitude';
        errors.location.coordinates[1] = 'Please enter a latitude';
    }

    return errors;
}

function mapStateToProps(state) {
    return { ... }
}

export default connect(mapStateToProps)(reduxForm({
    form: 'animal',
    validate
})(AnimalForm))

/ src / контейнеры / животные / FormHelper.js

import React from 'react';
import { FormGroup, Label, Input, Alert } from 'reactstrap';

export const renderTextField = ({input, type, meta: {touched, error}, ...custom}) => (
    <div>
            <Label>{ label }</Label>
            <Input
                type={type}
                value={input.value}
                onChange={input.onChange}
            />
            {touched && error && <Alert color="warning">{ error }</Alert>}
    </div>
)

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

В методе validate как насчет структурирования исходного объекта ошибок как такового:

let errors = {
  location: {
    coordinates: []
  }
}
0 голосов
/ 04 октября 2018

Приведенное ниже решение будет работать

const validate = values => {
    let errors = values;
    if(values){
        if (values.location) {
           errors.location.coordinates[0] = 'Please enter a longtitude';
           errors.location.coordinates[1] = 'Please enter a latitude';
        }
    }
        return errors;
 }
...