8

This is my SearchForm.js, handleKeywordsChange must handle input keywords changes

import React from 'react';
import ReactDOM from 'react-dom';

class SearchForm extends React.Component {
    constructor(props) {
      super(props)

      this.state = {
       keywords: '',
       city: '',
       date: ''     
      }

      //this.handleChange = this.handleChange.bind(this)
      //this.handleSubmit = this.handleSubmit.bind(this)

      this.handleKeywordsChange = this.handleKeywordsChange.bind(this);
     }

    handleKeywordsChange(e) {
        console.log(1);

        this.setState({
          value: e.target.value
        });
    }

    render() {
        return ( 
            <form className='form search-form' onSubmit={this.handleSubmit}>
                <div className="form-row">
                  <div className="form-group col-md-5">
                    <label htmlFor="keywords">Keywords</label>
                    <input type="text" className="form-control" name="keywords" id="keywords" placeholder="Keywords" onChange={this.handleKeywordsChange} value={this.state.keywords} />

                  </div>

                  <div className="form-group col-md-5">
                    <label htmlFor="city">City</label>
                    <input type="text" className="form-control" name="city" id="city" placeholder="City" onChange={this.handleChange} value={this.state.city} />
                  </div>

                  <div className="form-group col-md-2">
                    <label htmlFor="date">Date</label>
                    <select className="form-control" name="date" id="date" onChange={this.handleChange} value={this.state.date}>
                      <option>1</option>
                      <option>2</option>
                      <option>3</option>
                      <option>4</option>
                      <option>5</option>
                    </select>
                  </div>
                 </div>

                 <div className="form-row">
                     <div className="form-group col-md-12">
                        <input id='formButton' className='btn btn-primary' type='submit' placeholder='Send' />
                    </div>
                 </div>
            </form>
        )
    }
}

export { SearchForm }

The problem is input keywords doesn't change its value when I'm typing. What's wrong?

6 Answers 6

27

Make a common function for changing the state for input values.

handleInputChange(e) {
    this.setState({
        [e.target.name]: e.target.value
    });
}

Make sure you mention name in every input tag. e.g:

<input name="someUniqueName" value={this.state.someState} onChange={this.handleInputChange} />
Sign up to request clarification or add additional context in comments.

2 Comments

In the object you pass to setState(), why is the key an array with a single value in it? Why not this.setState( { e.target.name: e.target.value} )
@Ungeheuer the Key is not an array but computed property name.
18

React Hooks makes this so much easier!!!

import React, {useState} from 'react'

function SearchForm () {
  const [input, setInput] = useState("")
  
  return (
    <div className="SearchForm">
       <input 
           value={input} 
           onChange={(e) => setInput(e.target.value)} />
    </div>
  )

}

Comments

4

It should be :

this.setState({
    keywords: e.target.value
});

Comments

3

Your handleKeywordsChange function sets the state value whereas you are using this.state.keywords as value for input

handleKeywordsChange(e) {
    console.log(1);

    this.setState({
      keywords: e.target.value
    });
}

Comments

2
class InputKeywordCheck {
state = {
    email: '',
}

handleInputChange (e) {
    const {name, value } = e.target;
    this.setState({[name]: value});
}

render() {
    return (
        <input name="email" value={this.state.email} onChange={this.handleInputChange} />
    )
} }

Comments

0

I believe that you need to do something like this:

handleKeyWordsChange (e)  {
    this.setState({[e.target.name]: e.target.value});
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.