Проверка ввода - отправка формы реакции без каких-либо значений

У меня проблема с проверкой ввода, которая позволяет отправить форму без добавления каких-либо selectorValues. Моя проверка, похоже, проверяет только ввод внутри textarea, но не учитывает нажатие кнопки «Добавить».

Вот песочница, воспроизводящий проблему.

Я использую Semantic-ui-react, поэтому мой <Form.Field /> выглядит так:

<Form.Field required>
  <label>Selector Values:</label>
  <TextArea
    type = "text"
    placeholder = "Enter selector values 1-by-1 or as a comma seperated list."
    value = {this.state.selectorValue}
    onChange = {this.handleSelectorValueChange}
    required = {!this.state.selectorValues.length}
  />
  <Button positive fluid onClick = {this.addSelectorValue}>
    Add
  </Button>
  <ul>
    {this.state.selectorValues.map((value, index) => {
      return (
        <Card>
          <Card.Content>
            {value}
            <Button
              size = "mini"
              compact
              floated = "right"
              basic
              color = "red"
              onClick = {this.removeSelectorValue.bind(this, index)}
            >
              X
            </Button>
          </Card.Content>
        </Card>
      );
    })}
  </ul>
</Form.Field>

Итак, в приведенном выше <TextArea> есть необходимая опора: !this.state.selectorValues.length. Это только проверка ввода внутри textarea, он должен проверить, было ли добавлено значение, нажав кнопку Add, прежде чем разрешить отправку формы.

Вы хотите предотвратить добавление пустых значений в selectorValues? или есть что-то еще?

Asaf Aviv 24.04.2019 23:48

Да, я также хочу предотвратить это

DJ2 24.04.2019 23:50

Мой ответ предотвратит добавление пустых значений, но я не уверен, что понимаю, в чем еще проблема, можете ли вы объяснить, что еще нужно исправить?

Asaf Aviv 24.04.2019 23:51

Если вы начнете вводить значение в текстовое поле и нажмете «Отправить», это позволит отправить форму без фактического добавления значения с помощью кнопки.

DJ2 24.04.2019 23:54
Поведение ключевого слова "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) для оценки ваших знаний,...
0
4
560
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

В вашем addSelectorValue добавьте проверку, чтобы убедиться, что this.state.selectorValue он не пустой, если он просто возвращается, это предотвратит добавление пустых значений в selectorValues

addSelectorValue = e => {
    e.stopPropagation();
    e.preventDefault();

    if (!this.state.selectorValue) return;
    //continue if this.state.selectorValue has a value
};

Перед отправкой добавьте проверку, чтобы убедиться, что this.selectorValues пусто, если это так, сосредоточьтесь на текстовой области.

Чтобы сфокусироваться, нам нужно сначала создать ссылку на нашу текстовую область.

Создайте ссылка, который будет прикреплен к элементу dom

textareaRef = React.createRef();

// will use our ref to focus the element
focusTextarea = () => {
  this.textareaRef.current.focus();
}

handleSubmit = () => {
  const { selectorValues } = this.state;
  if (!selectorValues.length) {
    // call our focusTextarea function when selectorValues is empty
    this.focusTextarea();
    return;
  }
  this.setState({ submittedSelectorValues: selectorValues });
};

// attach our ref to Textarea
<Textarea ref = {this.textareaRef} />

Это работает. Есть ли способ сделать его предупреждением, ориентированным на рассматриваемый ввод, а не на предупреждение браузера? Для этого мне, вероятно, понадобится проверка схемы, например yup.

DJ2 25.04.2019 00:00

Я отредактировал свой ответ, чтобы сосредоточить внимание на Textarea при проверке.

Asaf Aviv 25.04.2019 00:07

После некоторого поиска ... required prop предназначен только для декоративных целей - добавление звездочки к метке поля.

Ему нечего формировать валидацию. Для этого вам нужно отдельное решение - попробуйте формик или установите какое-то условие в обработчике отправки.

Formik пьесыприятно со схемой проверки yup — подходит для более сложных динамических требований.

<Form> из семантического пользовательского интерфейса реагирует на данные так же, как ванильный реагирует <form />. Таким образом, использование required реквизита внутри <TextArea> имеет цель. <Form.Field /> необходимый реквизит действительно является декоративным в том смысле, который вы описали.
DJ2 24.04.2019 23:57

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