ReactJS | OnSubmit не является функцией Formik

У меня есть простая форма Form с React. Я использую formik для проверки формы на frontEnd. Вот моя составляющая:

class GroupDetailsForm extends React.Component {
  handleSubmit = values => {
    const { onSubmit } = this.props;
    onSubmit(values);
  };

  render() {
    const { group } = this.props;

    return (
      <Formik
        initialValues = {{ ...group }}
        onSubmit = {this.handleSubmit}
        validationSchema = {validationSchema}
        render = {({ values, touched, errors, handleChangeEvent, handleBlur, handleSubmit }) => (
          <form onSubmit = {handleSubmit}>
            <div className = "row">
              <div className = "col-md-3">
                <div className = "form-group">
                  <label htmlFor = "groupName">
                    Group name <span className = "text-danger">*</span>
                  </label>
                  <input
                    type = "text"
                    onChange = {handleChangeEvent}
                    onBlur = {handleBlur}
                    value = {values.name}
                    name = "name"
                    className = {classNames('form-control', {
                      'is-invalid': errors.name && touched.name
                    })}
                    id = "groupName"
                    placeholder = "PaymentsTeam"
                  />
                  {!!errors.name && touched.name && (
                    <div className = "text-danger">{errors.name}</div>
                  )}
                </div>
                <div className = "form-group">
                  <label htmlFor = "groupDescription">Description</label>
                  <textarea
                    onChange = {handleChangeEvent}
                    onBlur = {handleBlur}
                    value = {values.description}
                    name = "description"
                    className = {classNames('form-control', {
                      'is-invalid': errors.description && touched.description
                    })}
                    id = "groupDescription"
                    rows = "3"
                    placeholder = ""
                  />
                  {!!errors.description && touched.description && (
                    <div className = "text-danger">{errors.description}</div>
                  )}
                </div>
                <button type = "submit">Submit</button>
              </div>
            </div>
          </form>
        )}
      />
    );
  }
}

Когда я нажимаю «Отправить», я получаю такую ​​ошибку:

Uncaught (in promise) TypeError: onSubmit is not a function at Object.GroupDetailsForm.values [as onSubmit] (index.jsx:18)

Не уверен, в чем проблема. Может кто поможет? Код мне кажется нормальным. Я пытался поиграть с ним, обращаясь к OnSubmit в разных частях компонента, а не в самой форме, но безуспешно.

Ошибка, наверное, банальная, но я ее не вижу. Может кто поможет ???

Внизу вы можете увидеть Компонент I, реализующий GroupDetailsForm. Это целый компонент, чтобы было проще.

import React, { Component } from 'react';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';

import GroupDetailsForm from '../../components/GroupDetailsForm';
import { Actions } from '../../actions';

// Importing Styles
import './styles.scss';

export class GroupsCreateScreen extends Component {
  static propTypes = {
    listGroups: PropTypes.func.isRequired
  };

  static defaultProps = {
    securityMode: ''
  };

  componentDidMount() {
    const { listGroups } = this.props;
    listGroups();
  }

  render() {
    const group = {
      name: '',
      description: ''
    };

    return (
      <div className = "container mt-5 bg-white p-5">
        <div className = "card">
          <div className = "card-header">
            <h4>Step 1</h4>
          </div>
          <div className = "card-body">
            <GroupDetailsForm group = {group} />
          </div>
        </div>
        <div className = "card">
          <div className = "card-header">
            <h4>Step 2</h4>
          </div>
        </div>
        <div className = "card">
          <div className = "card-header">
            <h4>Step 3</h4>
          </div>
        </div>
        <div className = "card">
          <div className = "card-header">
            <h4>Step 4</h4>
          </div>
        </div>
      </div>
    );
  }
}

const mapStateToProps = state => ({
  ...state // todo to be refined
});

const mapDispatchToProps = {
  ...Actions
};

export default connect(
  mapStateToProps,
  mapDispatchToProps
)(GroupsCreateScreen);

Я только что попытался удалить onSubmit = {handleSubmit} из начального тега Form, и теперь я не получаю сообщения об ошибке. Я должен его туда положить, видимо, потому что где-нибудь еще, Он даже не работает с onSubmit.

user10104341 21.12.2018 13:02

Можете ли вы показать код, в котором вы реализуете GroupDetailsForm со всеми его атрибутами?

AnonymousSB 21.12.2018 13:04

Я только что обновил описание. Пожалуйста, проверьте...

user10104341 21.12.2018 13:06
Поведение ключевого слова "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) для оценки ваших знаний,...
1
3
6 049
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы не передаете onSubmit в качестве опоры для GroupDetailsForm, но вы пытаетесь получить к нему доступ из this.props в своей функции handleSubmit.

Вы можете попробовать это, и он больше не должен жаловаться на not a function, хотя, очевидно, вам нужно передать свою настоящую функцию.

<GroupDetailsForm group = {group} onSubmit = {values => console.info(values)} />

Спасибо, отлично сработало. Не могли бы вы немного это объяснить? Не думаю, что у меня это получилось. Что вы имеете в виду под моей настоящей функцией ??

user10104341 21.12.2018 13:17
GroupDetailsForm ожидает, что вы передадите функцию onSubmit от любого вызывающего ее компонента, поэтому где-то внутри GroupsCreateScreen вам нужно создать эту функцию и передать ее. Если вы хотите, чтобы GroupDetailsForm просто использовал внутреннюю функцию, просто делайте все внутри handleSubmit и не требуйте, чтобы функция передавалась через this.props.
AnonymousSB 21.12.2018 13:19

Хорошо понял. Спасибо за объяснение.

user10104341 21.12.2018 13:20

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