State можно и нужно использовать. Об этом не раз говорил создатель библиотеки Redux.
Согласен с
Pavel Shvedov по поводу того в каких случаях. Абсолютно нет никакой необходимости тот же onChange в поле инпута выносить в redux store и диспатчить изменения на каждый чих, если вы, например, делаете валидацию поля. Пусть у вас будет форма, у нее есть кнопка submit, для нее, например, простейшее правило: все три поля формы должны быть не пустыми. Надо ли это выносить в store? Зачем? Используете state, смотрите: если поля не пустые - убираете атрибут disabled у кнопки submit. Смотрите === реакт сам смотрит, в зависимости от переменной в state, так как на изменения state происходит ре-рендер компонента.
Пример:
...
constructor(props) {
super(props)
this.state = {
email: '',
password: '',
}
this.onSubmit = this.onSubmit.bind(this)
this.onInputChange = this.onInputChange.bind(this)
}
onSubmit(e) {
e.preventDefault()
const { email, password } = this.state
this.props.onSubmit(email, password)
}
onInputChange(e) {
this.setState({ [e.target.id]: e.target.value })
}
validate() {
if (this.state.email && this.state.password) {
return true
}
}
...
далее в методе render компонента:
render() {
const { email, password } = this.state
return (
<div className='row'>
<div className='centered w300'>
<form onSubmit={this.onSubmit}>
...
<button type='submit' className='btn btn-success' disabled={!this.validate()}>
Submit
</button>
</form>
</div>
</div>
)
}
Если не требуется большего, то зачем при этом использовать store ? На случай для какой-то более сложной валидации, можно использовать onBlur события и их уже диспатчить (вдруг вы введеный ник проверяете на "занят/не занят").