Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save tachang/cf24de4725ef81dbc8e266c4b50e75fb to your computer and use it in GitHub Desktop.
Save tachang/cf24de4725ef81dbc8e266c4b50e75fb to your computer and use it in GitHub Desktop.
React controlled input with internal state example
class ControlledInputWithInternalState extends Component {
constructor(props) {
super(props);
this.state = {
isValid : true,
value : props.value
};
}
componentWillReceiveProps(nextProps) {
if(nextProps.value !== this.props.value) {
// new value from the parent - copy it to state
this.setState({value : nextProps.value});
}
}
onValueChanged = (e) => {
const {value} = e.target;
// No empty strings
const isValid = value !== "";
this.setState({value, isValid}, this.onStateUpdated);
}
onStateUpdated = () => {
if(this.state.isValid) {
this.props.onChange(this.state.value);
}
}
render() {
const {value, isValid} = this.state;
let errorMessage = null;
if(!isValid) {
errorMessage = <div>Oops!</div>
}
return (
<div>
<input
type="text"
name="theInput"
value={value}
onChange={this.onValueChanged}
/>
{errorMessage}
</div>
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment