I am new to the React world, and usage of components, I have an underlying issue where I have a Login Component that I call from App.js render().
The Login.js is having a fetch() api, which is used to fetch the response of whatever is typed on the form.
Expected Result - One time call to the fetch api, when I click the submit button within the form and then Login.
Actual Result - fetch api is getting called multiple times, when I am filling the form, rite from the point I start typing on the form, The complete result succeeds after I complete typing the username and password and the submit button does not seem to have any affect as such.
Relevant Code About what I am taking about above :
The useform.js that you see below is the hooks that I am using.
App.js
import React, {Component} from 'react' import './App.css' import Header from './components/Header.js' import Login from './components/Login.js' class App extends Component { render() { return ( <div className="container"> <Login /> </div> ); } } export default App; Login.js
import React from "react" import Form from 'react-bootstrap/Form' import Button from 'react-bootstrap/Button' import Col from 'react-bootstrap/Col' import useForm from './useForm.js' // Using hooks instead of a Class and constructor const Login = () => { const { values, handleChange, handleSubmit } = useForm(signup) function signup(){ console.log(values) } var proxyUrl = 'https://cors-anywhere.herokuapp.com/', targetUrl = '...' fetch ( proxyUrl+targetUrl, { method: 'POST', headers: { 'content-Type': 'application/json', 'Accept' : 'application/json', }, body: JSON.stringify(values) }) .then((response) => response.json()) .then((values) => { console.log('Success:', values) }) .catch((error) => { console.error('Error:', error) }) return ( <Form noValidate onSubmit={handleSubmit}> <Form.Row> <Form.Group as={Col} controlId="formGridUserName"> <Form.Label>UserName</Form.Label> <Form.Control autoFocus name={'username'} value={values.username} type='username' placeholder="username" onChange={handleChange} /> </Form.Group> <Form.Group as={Col} controlId="formGridFirstName"> <Form.Label>First Name</Form.Label> <Form.Control autoFocus name={'firstname'} value={values.firstname} type='first name' placeholder="First name" onChange={handleChange} /> </Form.Group> <Form.Group as={Col} controlId="formGridSecondName"> <Form.Label>Last Name</Form.Label> <Form.Control autoFocus name={'lastname'} value={values.lastname} type='last name' placeholder="Last name" onChange={handleChange} /> </Form.Group> </Form.Row> <Form.Group controlId="formBasicEmail"> <Form.Label>Email address</Form.Label> <Form.Control autoFocus type="email" name={'email'} value={values.email} onChange={handleChange} placeholder="Enter email" /> <Form.Text className="text-muted"> We'll never share your email with anyone else. </Form.Text> </Form.Group> <Form.Group controlId="formBasicPassword"> <Form.Label>Password</Form.Label> <Form.Control autoFocus type="password" name={'password'} value={values.password} onChange={handleChange} placeholder="Password" /> </Form.Group> <Form.Group controlId="formBasicCheckbox"> <Form.Check type="checkbox" label="Check me out" /> </Form.Group> <Button variant="primary" type="submit" value="Submit" > Login </Button> </Form> ); } export default Login How do I run the react app, is as simple as npm start from within the src folder, my folder structure if you are curious about some particular file, that you would want to look at
planner-app/ ├── README.md ├── node_modules ├── package-lock.json ├── package.json ├── public └── src planner-app/src ├── App.css ├── App.js ├── components │ ├── Header.js │ ├── Login.css │ ├── Login.js │ ├── MainComponent.js │ └── useForm.js ├── index.css ├── index.js ├── logo.svg ├── serviceWorker.js └── setupTests.js