Reputation: 14594
I'm trying my first bit of React.js and am stumped early on... I have the code below, which renders a search form into <div id="search"></div>
. But typing in the search box does nothing.
Presumably something is going missing passing the props and state up and down, and this seems like a common problem. But I'm stumped - I can't see what's missing.
var SearchFacet = React.createClass({
handleChange: function() {
this.props.onUserInput(
this.refs.searchStringInput.value
)
},
render: function() {
return (
<div>
Search for:
<input
type="text"
value={this.props.searchString}
ref="searchStringInput"
onchange={this.handleChange} />
</div>
);
}
});
var SearchTool = React.createClass({
render: function() {
return (
<form>
<SearchFacet
searchString={this.props.searchString}
onUserInput={this.props.onUserInput}
/>
<button>Search</button>
</form>
);
}
});
var Searcher = React.createClass({
getInitialState: function() {
return {
searchString: ''
}
},
handleUserInput: function(searchString) {
this.setState({
searchString: searchString
})
},
render: function() {
return (
<div>
<SearchTool
searchString={this.state.searchString}
onUserInput={this.handleUserInput}
/>
</div>
);
}
});
ReactDOM.render(
<Searcher />,
document.getElementById('searcher')
);
(Eventually I will have other types of SearchFacet*
but I'm just trying to get this one working.)
Upvotes: 170
Views: 292578
Reputation: 11
Check your input field names. I corrected my input field names and issue solved for me.
Upvotes: 0
Reputation: 659
I got a similar problem, i fixed it by adding a value
and a name
params to each input i used.
Here an example:
const onValueChange = (e) => {
setProduct({ ...product, [e.target.name]: e.target.value })
}
//...
<input
type="number"
id="exampleFormControlInput4"
label="Price :"
placeholder="Enter price"
text="Must be a number"
aria-describedby="exampleFormControlInputHelpInline"
onChange={(e) => onValueChange(e)}
value={price}
name="price"
/>
Upvotes: 0
Reputation: 55
In my case i use Material ui and also needed name="data"
(same as state)
<TextField name="fecha" id="fecha" label="fecha" value={this.state.fecha} onChange={this.handleInputChange} />
the name value is needed for react works
Upvotes: 0
Reputation: 61
Instead of value use defaultValue
We use value when the fields are empty, but if we have to type or update the value from the value already in the input box. We must use defaultValue
Upvotes: 6
Reputation: 553
Once I ran into a similar error. Let me describe it.
Edit.js
// components returns edit form
function EditVideo({id}) {
.....
// onChange event listener
const handleChange = (e) => {
setTextData({
...textData,
[e.target.name]: e.target.value.trim()
});
}
....
...
}
)
ImportEdit.js
import Edit from './Edit';
function ImportEdit() {
......
...
return (
<div>
<EditVideo id={id}/>
</div>
)
}
export default ImportEdit
The Problem was: I was unable to use spacebar (i.e. if i press spacekey, i didn't see space input)
The Bug: .trim()
.trim() method was trimming all the white space i typed
Note: Edit.js worked fine when used sepeartely without import
Upvotes: 0
Reputation: 1776
In a class component context...
handleChange(e){
this.setState({[e.target.name]:[e.target.value]});
}
it can be used such as this...onChange={(e)=>this.handleChange(e)}
<input type="text" name="any" value={this.state.any} onChange={(e)=>this.handleChange(e)}></input>
handle = (e) =>{
this.setState({[e.target.name]:[e.target.value]});
}
it can be used like this... onChange={this.handle}
<input type="text" name="any2" value={this.state.any2} onChange={this.handle} ></input>
And this solved my "Can't type in React input text field" problem.
Upvotes: 1
Reputation: 6002
For me the following simple change worked perfectly
<input type="text"
value={props.letter}
onChange={event => setTxtLetter(event.target.value)} /> {/* does not work */}
change... value={myPropVal} to... defaultValue={myPropVal}
<input type="text"
defaultValue={props.letter}
onChange={event => setTxtLetter(event.target.value)} /> {/* Works!! */}
Upvotes: 26
Reputation: 1073
This might be caused by the onChange function is not updating the proper value which is mentioned in the input.
Example:
<input type="text" value={this.state.textValue} onChange = {this.changeText}></input>
changeText(event){
this.setState(
{textValue : event.target.value}
);
}
in the onChange function update the mentioned value field.
Upvotes: 12
Reputation: 30957
You haven't properly cased your onchange
prop in the input
. It needs to be onChange
in JSX.
<input
type="text"
value={this.props.searchString}
ref="searchStringInput"
onchange={this.handleChange} <--[should be onChange]
/>
The topic of passing a value
prop to an <input>
, and then somehow changing the value passed in response to user interaction using an onChange
handler is pretty well-considered in the docs.
They refer to such inputs as Controlled Components, and refer to inputs that instead let the DOM natively handle the input's value and subsequent changes from the user as Uncontrolled Components.
Whenever you set the value
prop of an input
to some variable, you have a Controlled Component. This means you must change the value of the variable by some programmatic means or else the input will always hold that value and will never change, even when you type -- the native behaviour of the input, to update its value on typing, is overridden by React here.
So, you're correctly taking that variable from state, and have a handler to update the state all set up fine. The problem was because you have onchange
and not the correct onChange
the handler was never being called and so the value
was never being updated when you type into the input. When you do use onChange
the handler is called, the value
is updated when you type, and you see your changes.
Upvotes: 101
Reputation: 1496
I also have same problem and in my case I injected reducer properly but still I couldn't type in field. It turns out if you are using immutable
you have to use redux-form/immutable
.
import {reducer as formReducer} from 'redux-form/immutable';
const reducer = combineReducers{
form: formReducer
}
import {Field, reduxForm} from 'redux-form/immutable';
/* your component */
Notice that your state should be like state->form
otherwise you have to explicitly config the library also the name for state should be form
.
see this issue
Upvotes: 4
Reputation: 10372
Using value={whatever}
will make it so you cannot type in the input field. You should use defaultValue="Hello!"
.
See https://facebook.github.io/react/docs/uncontrolled-components.html#default-values
Also, the onchange
should be onChange
as @davnicwil points out.
Upvotes: 276