I'm presented with a rather silly problem. I am in the process of creating my first React application and I have encountered a little issue, where I am not able to clear my input value, after I submit a form. A tried googling this problem, found some similar threads here, but I was not able to resolve this. I do NOT want to change the state of my component/application, just to change the value of the input to an empty string. I tried clearing the value of the input in my onHandleSubmit() function, but I got an error:

"Cannot set property 'value' of undefined".

My SearchBar Component:

import React, { Component } from "react"; class SearchBar extends Component { constructor(props) { super(props); this.state = { city: "" }; this.onHandleChange = this.onHandleChange.bind(this); this.onHandleSubmit = this.onHandleSubmit.bind(this); } render() { return ( <form> <input onChange={this.onHandleChange} placeholder="Get current weather..." value={this.state.city} type="text" /> <button onClick={this.onHandleSubmit} type="submit"> Search! </button> </form> ); } onHandleChange(e) { this.setState({ city: e.target.value }); } onHandleSubmit(e) { e.preventDefault(); const city = this.state.city; this.props.onSearchTermChange(city); this.mainInput.value = ""; } } export default SearchBar; 
1

9 Answers

You are having a controlled component where input value is determined by this.state.city. So once you submit you have to clear your state which will clear your input automatically.

onHandleSubmit(e) { e.preventDefault(); const city = this.state.city; this.props.onSearchTermChange(city); this.setState({ city: '' }); } 

Since you input field is a controlled element, you cannot directly change the input field value without modifying the state.

Also in

onHandleSubmit(e) { e.preventDefault(); const city = this.state.city; this.props.onSearchTermChange(city); this.mainInput.value = ""; } 

this.mainInput doesn't refer the input since mainInput is an id, you need to specify a ref to the input

<input ref={(ref) => this.mainInput= ref} onChange={this.onHandleChange} placeholder="Get current weather..." value={this.state.city} type="text" /> 

In you current state the best way is to clear the state to clear the input value

onHandleSubmit(e) { e.preventDefault(); const city = this.state.city; this.props.onSearchTermChange(city); this.setState({city: ""}); } 

However if you still for some reason want to keep the value in state even if the form is submitted, you would rather make the input uncontrolled

<input onChange={this.onHandleChange} placeholder="Get current weather..." type="text" /> 

and update the value in state onChange and onSubmit clear the input using ref

 onHandleChange(e) { this.setState({ city: e.target.value }); } onHandleSubmit(e) { e.preventDefault(); const city = this.state.city; this.props.onSearchTermChange(city); this.mainInput.value = ""; } 

Having Said that, I don't see any point in keeping the state unchanged, so the first option should be the way to go.

2

this.mainInput doesn't actually point to anything. Since you are using a controlled component (i.e. the value of the input is obtained from state) you can set this.state.city to null:

onHandleSubmit(e) { e.preventDefault(); const city = this.state.city; this.props.onSearchTermChange(city); this.setState({ city: '' }); } 

In your onHandleSubmit function, set your state to {city: ''} again like this :

this.setState({ city: '' }); 

Simple

import React, { useState } from "react"; export default function Login() { const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); function handleSubmit(e) { e.preventDefault(); console.log(email, password); // clearing the values setEmail(""); setPassword(""); } return ( <form> <input type="email" placeholder="Email" value={email} onChange={(e) => setEmail(e.target.value)} /> <input type="password" placeholder="Password" value={password} onChange={(e) => setPassword(e.target.value)} /> <button type="submit" onClick={handleSubmit}> Login </button> </form> ); } 

if you want to clear the fields of a form and you are using component function not Class component you can do that it's easy let's say we have three inputs inside a form title, price, and date and we want after we get those values from the user we want clear the fields

import React, { useState } from "react"; function ClearForm() { // our initial states const [enteredTitle, setEnteredTitle] = useState(""); const [enteredPrice, setEnteredPrice] = useState(""); const [enteredDate, setEnteredDate] = useState(""); // this function for get our title value from the user. function titleChangeHandler(event) { setEnteredTitle(event.target.value); } // this function for get our price value from the user. // price that we will get is string we have to convert it to number simply add + in front of the event.target.value like this +event.target.value function priceChangeHandler(event) { setEnteredPrice(+event.target.value); } // this function for get our date value from the user. // don't forget we we will get it as string . function dateChangeHandler(event) { setEnteredDate(event.target.value); } // here we will gather our data title, price, and date let expensesData = { title: enteredTitle, price: enteredPrice, date: new Date(enteredDate), // we have to convert our date form string to date }; // this function will clear our fields // we will call it inside submitFormHandler // after submit form we we will call submitFormHandler function and we will pass event as parameter to clearFields function clearFields(event) { // we have to convert event.target to array // we use from method to convert event.target to array // after that we will use forEach function to go through every input to clear it Array.from(event.target).forEach((e) => (e.value = "")); } // this function to submit form function submitFormHandler(event) { // we don't want our page to refresh event.preventDefault(); // print expenses data console.log(expensesData) // clear the fields clearFields(event); //update our states // why we should update our states to empty string // if we have not done it we clears the fields but we still have the data in our states // if the user submit the form without any data but our states still has the previous data //update title setEnteredTitle(""); //update title setEnteredPrice(""); //update title setEnteredDate(""); } return ( // our form <form onSubmit={submitFormHandler}> <label>Title</label> <input type="text" onChange={titleChangeHandler} /> <label>Price</label> <input type="number" onChange={priceChangeHandler} /> <label>Date</label> <input type="date" onChange={dateChangeHandler} /> <button type="submit">submit</button> </form> ); } export default ClearForm; 

The answers above are incorrect, they will all run weather or not the submission is successful... You need to write an error component that will receive any errors then check if there are errors in state, if there are not then clear the form....

use .then()

example:

 const onSubmit = e => { e.preventDefault(); const fd = new FormData(); fd.append("ticketType", ticketType); fd.append("ticketSubject", ticketSubject); fd.append("ticketDescription", ticketDescription); fd.append("itHelpType", itHelpType); fd.append("ticketPriority", ticketPriority); fd.append("ticketAttachments", ticketAttachments); newTicketITTicket(fd).then(()=>{ setTicketData({ ticketType: "IT", ticketSubject: "", ticketDescription: "", itHelpType: "", ticketPriority: "" }) }) 

};

This is the value that i want to clear and create it in state 1st STEP

state={ TemplateCode:"", } 

craete submitHandler function for Button or what you want 3rd STEP

submitHandler=()=>{ this.clear();//this is function i made } 

This is clear function Final STEP

clear = () =>{ this.setState({ TemplateCode: ""//simply you can clear Templatecode }); } 

when click button Templatecode is clear 2nd STEP

<div align="right"> <button type="submit" onClick{this.submitHandler}> Save </button> </div> 

clear fields using useState hook

 function clearForm() { // our initial states const [enteredTitle, setEnteredTitle] = useState(""); const [enteredAmount, setEnteredAmount] = useState(""); const [enteredDate, setEnteredDate] = useState(""); // this function for get our title value from the user. function titleChangeHandler(event) { setEnteredTitle(event.target.value); } // this function for get our amount value from the user. // amount that we will get is string we have to convert it to number simply add + in front of the event.target.value like this +event.target.value function amountChangeHandler(event) { setEnteredAmount(+event.target.value); } // this function for get our date value from the user. // don't forget we we will get it as string . function dateChangeHandler(event) { setEnteredDate(event.target.value); } // here we will gother our data title, price, and date let expensesData = { title: enteredTitle, amount: enteredAmount, date: new Date(enteredDate), // we have to convert our date form string to date }; // this function to submit form function submitFormHandler(event) { // we don't want our page to refresh event.preventDefault(); // princt expensesData console.log( expensesData) //update our states //update title setEnteredTitle("");//enteredTitle=""; //update title setEnteredAmount("");//enteredAmount=""; //update title setEnteredDate("");//enteredDate=""; } return ( // our form <form onSubmit={submitFormHandler}> <label>Title</label> <input type="text" // after submit our form we will clier our title field automatically value={enteredTitle}//enteredTitle=""; onChange={titleChangeHandler} /> <label>Amount</label> <input type="number" // after submit our form we will clier our amount field automatically value={enteredAmount}//enteredAmount=""; onChange={amountChangeHandler} /> <label>Date</label> <input type="date" // after submit our form we will clier our date field automatically value={enteredDate}//enteredDate=""; onChange={dateChangeHandler} /> <button type="submit">submit</button> </form> ); } export default clearForm; 

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy