У меня есть небольшое приложение с компонентом 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>
);
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы не хотите перемещать свои компоненты, вы можете убрать обработчик состояния из 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
Я попытался добавить его в качестве аргумента, такого как `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}
Внутри infoForm.js после добавления реквизита в качестве аргумента вы объявили такие значения, как «const { values, handleChangeEventForm } = props»? Также внутри app.js не забудьте отправить реквизиты в тег формы. <Form values = {values} handleChangeEventForm = {handleChangeEventForm}/> вы можете использовать console.info(props) внутри infoForms.js для просмотра того, что получает
Прежде всего, я просто хочу сказать большое спасибо. Он работает отлично. Проблема заключалась в том, что я поместил код в тег формы в InfoForm, а не в тег формы в App.js. Во-вторых, я вижу, что вы работаете в Softtek в Монтеррее. Раньше я работал в Sterling Talent Solutions в Атланте, и у меня была возможность поработать с некоторыми из ваших ребят. Они были такими умными и полезными, как ты. Спасибо, друзья!
как вы используете эту кнопку?