React: как получить значения из компонентов TextField Material-UI

У меня есть небольшое приложение с компонентом Form, компонентом SubmitButton и моим родительским компонентом (App.js). Когда пользователь нажимает кнопку отправки, я хочу получить значения трех полей в моем компоненте формы и передать их моему компоненту App.js. Я не уверен, как инициировать событие, используя onClick() или что-то подобное, чтобы получить значения поля формы из моей формы, а затем передать их через props в компонент App.js и console.info() их. Может ли кто-нибудь дать некоторые рекомендации, поскольку я очень новичок в React?

App.js

import React from 'react';
import NavBar from './Components/NavBar'
import Form from './Components/InfoForm'
import SubmitButton from './Components/SubmitButton';
import Container from '@material-ui/core/Container';
import Checkbox from './Components/Checkbox';
import './App.css';

function App() {

  const [state, setState] = React.useState({
    checkbox: false,
});

const handleChangeEvent = event => {
  setState({ ...state, [event.target.name]: event.target.checked });
};

  return (
   <div>
     <Container maxWidth = "md">
     <NavBar />             
     <Form />
     <Checkbox name = "checkbox" onChange = {handleChangeEvent} checked = {state.checkbox} />
     <SubmitButton isEnabled = {state.checkbox} onClick = {} /> 
     </Container>     
   </div>
  );
}

export default App;

InfoForm.js

import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import MenuItem from '@material-ui/core/MenuItem';
import TextField from '@material-ui/core/TextField';

function Form() {
  const classes = useStyles();
  const [values, setValues] = React.useState({
    name: '',
    email: '',
    months: ''
  });

  const handleChangeEvent = name => event => {
    setValues({ ...values, [name]: event.target.value });
  };

  return (

    <form className = {classes.container} noValidate autoComplete = "off">
      <TextField
        id = "outlined-name"
        label = "Name"
        className = {classes.textField}
        value = {values.name}
        onChange = {handleChangeEvent('name')}
        margin = "normal"
        variant = "outlined"
      />

      <TextField
        id = "outlined-email-input"
        label = "Email"
        className = {classes.textField}
        value = {values.email}
        type = "email"
        name = "email"
        autoComplete = "email"
        margin = "normal"
        variant = "outlined"
      />      

      <TextField
        id = "outlined-select-months"
        select
        label = "Select"
        className = {classes.textField}
        value = {values.months}
        onChange = {handleChangeEvent('months')}
        SelectProps = {{
          MenuProps: {
            className: classes.menu,
          },
        }}
        helperText = "Month looking to book"
        margin = "normal"
        variant = "outlined"
      >
        {months.map(option => (
          <MenuItem key = {option.value} value = {option.value}>
            {option.label}
          </MenuItem>
        ))}
      </TextField>
    </form>
  );
}

export default Form;

SubmitButton.js

import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import Button from '@material-ui/core/Button';


export default function ContainedButtons(props) {

    return (
      <div>
        <Button variant = "contained" color = "primary" className = {classes.button} disabled = {!props.isEnabled} type = "submit">
          Submit
        </Button>
      </div>
    );
}

как вы используете эту кнопку?

Junius L. 18.06.2019 05:25
Поведение ключевого слова "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) для оценки ваших знаний,...
2
1
10 755
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если вы не хотите перемещать свои компоненты, вы можете убрать обработчик состояния из infoForm.js.

переместите этот код в app.js и измените имя обработчика на «handleChangeEventForm» (необязательное имя)

  const [values, setValues] = React.useState({
    name: '',
    email: '',
    months: ''
  });

  const handleChangeEventForm = name => event => {
    setValues({ ...values, [name]: event.target.value });
  };

затем вы можете использовать обработчик и значения в infoForm как свойства, подобные этому:

 <Form values = {values} handleChangeEventForm = {handleChangeEventForm}/>

также вам нужно отправить компоненту кнопки значения в виде свойств

Внутри компонента формы вы должны деструктурировать реквизит следующим образом:

  const { values, handleChangeEventForm } = props;

  return (
    <form noValidate autoComplete = "off"> .....

Пример события onChange внутри формы

onChange = {handleChangeEventForm("name")}

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

  const onClickBtn = () => {
    console.info(props.values);
  };

при нажатии кнопки

  <Button
        variant = "contained"
        color = "primary"
        disabled = {!props.isEnabled}
        type = "submit"
        onClick = {onClickBtn}
      >
        Submit
      </Button>

Мне очень нравится это решение, но я получаю следующую ошибку: ./src/Components/InfoForm.js Line 191: 'props' is not defined

Dean Friedland 18.06.2019 06:04

Я попытался добавить его в качестве аргумента, такого как `function Form(props)`, но затем я получаю еще одну ошибку: TypeError: Cannot read property 'name' of undefined Form C:/Users/dfriedl/Desktop/impulse-ink/src/Components/InfoForm‌​.js:200 197 | id = "outlined-name" 198 | label = "Name" 199 | className = {classes.textField} > 200 | value = {values.name}

Dean Friedland 18.06.2019 06:08

Внутри infoForm.js после добавления реквизита в качестве аргумента вы объявили такие значения, как «const { values, handleChangeEventForm } = props»? Также внутри app.js не забудьте отправить реквизиты в тег формы. <Form values = {values} handleChangeEventForm = {handleChangeEventForm}/> вы можете использовать console.info(props) внутри infoForms.js для просмотра того, что получает

Rene Mercado 18.06.2019 09:41

Прежде всего, я просто хочу сказать большое спасибо. Он работает отлично. Проблема заключалась в том, что я поместил код в тег формы в InfoForm, а не в тег формы в App.js. Во-вторых, я вижу, что вы работаете в Softtek в Монтеррее. Раньше я работал в Sterling Talent Solutions в Атланте, и у меня была возможность поработать с некоторыми из ваших ребят. Они были такими умными и полезными, как ты. Спасибо, друзья!

Dean Friedland 18.06.2019 16:32

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