Форма Redux: ввод остается с 'touch: false'

Хотел проверить мои данные и изменить CSS в зависимости от взаимодействия с пользователем.

Начиная с требуемого метода проверки, я оборачиваю все свои входные компоненты в <Field> и передаю validate массив func. Пока только required.

Но для всех моих полей значение остается тем же touched: false и error: "Required". Если я прикоснусь или добавлю что-нибудь во вводе, эти значения останутся прежними.

Проверка

export const required = value => (value ? undefined : 'Required')

ИмяВход

import React from 'react';
import { Field } from 'redux-form'
import InputItem from 'Components/InputsUtils/InputItem';
import { required } from 'Components/InputsUtils/Validation';

const NameInput = () => (
  <Field
    name = {item.spec.inputName}
    type = {item.spec.type}
    component = {InputItem}
    validate = {[required]}
    props = {item}
  />
);

export default NameInput;

InputItem

import React from 'react';

const InputItem = ({ spec, meta: { touched, error } }) => {        
  const { type, placeholder } = spec;
  return (
    <input
      className = "input"
      type = {type}
      placeholder = {placeholder}
    />
  );
};

export default InputItem;
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
0
7 115
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

redux-form управляет своими собственными свойствами в вашем элементе <input /> до тех пор, пока вы используете оператор распространения для передачи этих свойств во входные данные.

Например, где вы делаете const InputItem = ({ spec, meta: { touched, error } }) => ...

Попробуйте уничтожить ввод из Компонента: const InputItem = ({ input, spec, meta: { touched, error } }) => ...

А если у вас есть <input ... />, попробуйте сделать следующее:

<input
  {...input}
  className = "input"
  type = {type}
  placeholder = {placeholder}
/>

Редукс-форма фиксирует все события onBlur и onChange и использует свои собственные методы для изменения состояния touched. Вам просто нужно передать их, как показано выше.

Вот что вам нужно: https://redux-form.com/7.1.2/docs/api/field.md/#input-props

Спасибо, я скучаю по этому реквизиту. Теперь у меня другая проблема. Если я теряю фокус без требования (простое значение), я добавляю красный значок галочки. Но если я снова сфокусируюсь, то добавлю что-то, значок не изменится, даже если значение ошибки перейдет в undefined. Смотрите мой EDIT.

Ragnar 21.03.2018 15:04

Это странно, похоже, ваш код должен работать нормально. Вы видите на консоли "---- Undefined -----"?

pkuzhel 23.03.2018 20:12

Есть 2 решения проблемы "тронут всегда ложно".

1) Убедитесь, что в вашем компоненте вызывается input.onBlur.

Для входа:

const { input } = this.props

<input {...input} />

Для пользовательских элементов формы без собственного onBlur:

const { input: { value, onChange, onBlur } } = this.props

const className = 'checkbox' + (value ? ' checked' : '')

<div
  className = {className}
  onClick = {() => {
    onChange(!value)
    onBlur()
  }}
/>

2) Объявите свою форму с помощью touchOnChange

const ReduxFormContainer = reduxForm({
  form: 'myForm',
  touchOnChange: true,
})(MyForm)

Еще один момент, который следует учитывать: Я передал {...props} своему пользовательскому компоненту, однако касание по-прежнему оставалось ложным. Это потому, что, хотя реквизит содержал входной объект, мой компонент не мог выводи на Blur из него. При явном указании <CustomComponent {...this.props} onBlur = {this.props.input.onBlur} он работал, как ожидалось.

Другие вопросы по теме