Увеличение значения состояния с помощью React
в React я пытаюсь сделать увеличение кнопки значением, хранящимся в состоянии. Однако, используя код ниже функции, мое значение устанавливается undefined или NaN при использовании handleClick.
class QuestionList extends React.Component {
constructor(props) {
super(props);
this.state = {value: 0};
// This binding is necessary to make `this` work in the callback
this.handleClick = this.handleClick.bind(this);
}
handleClick = (prevState) => {
this.setState({value: prevState.value + 1});
console.log(this.state.value)
}
можете ли вы сказать мне, почему это происходит? следует исправить согласно документации здесь: https://facebook.github.io/react/docs/state-and-lifecycle.html
5 ответов
потому что вы неправильно используете функцию handleClick. Здесь:
handleClick = (prevState) => { .... }
prevState
будет объектом события, переданным функции handleClick, вам нужно использовать prevState с setState, например:
handleClick = () => {
this.setState(prevState => {
return {count: prevState.count + 1}
})
}
другая проблема заключается в том, что setState является асинхронным so console.log(this.state.value)
не будет печатать обновленное значение состояния, вам нужно использовать функцию обратного вызова с setState.
Проверьте более подробную информацию о асинхронное поведение setState и как проверить обновление значение.
Проверьте рабочее решение:
class App extends React.Component {
constructor(props){
super(props);
this.state={ count: 1}
}
onclick(type){
this.setState(prevState => {
return {count: type == 'add' ? prevState.count + 1: prevState.count - 1}
});
}
render() {
return (
<div>
Count: {this.state.count}
<br/>
<div style={{marginTop: '100px'}}/>
<input type='button' onClick={this.onclick.bind(this, 'add')} value='Inc'/>
<input type='button' onClick={this.onclick.bind(this, 'sub')} value='Dec'/>
</div>
)
}
}
ReactDOM.render(
<App />,
document.getElementById('container')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id='container'></div>
состояние set является асинхронным, поэтому вы не увидите обновление значения при консоли.журнал случается. Вы должны иметь значение состояния, распечатанное в пользовательском интерфейсе, чтобы вы могли видеть, что происходит. Чтобы исправить журнал консоли, попробуйте это.
class QuestionList extends React.Component {
constructor(props) {
super(props);
this.state = {value: 0};
}
handleClick = (prevState) => {
this.setState({value: prevState.value + 1}, () => {
console.log(this.state.value)
});
}
Примечание: когда вы определяете встроенную лямбду (функцию стрелки) для класса react this
привязан правильно, поэтому вам не нужно привязывать его в конструкторе.
также вы можете изменить способ передачи предыдущего номера, если его просто инкремент состояния, как это
handleClick = () => {
this.setState({value: this.state.value + 1}, () => {
console.log(this.state.value)
});
}
попробуйте это
class QuestionList extends React.component {
constructor(props){
super(props)
this.state = {
value : 0
}
}
handleClick(){
this.setState({
value : this.state.value + 1
})
}
render(){
return( <button type="button" onClick={this.handleClick.bind(this)}> {this.state.value} </button> )
}
}
обратите внимание, что при установке состояния он запускает функцию рендеринга, которая будет отражать текущее состояние. Попробуйте в браузере!
class SkuVariantList extends React.Component {
constructor(props) {
super(props)
this.state = {
clicks: 0
};
this.clickHandler = this.clickHandler.bind(this)
}
componentDidMount() {
this.refs.myComponentDiv.addEventListener('click', this.clickHandler);
}
componentWillUnmount() {
//this.refs.myComponentDiv.removeEventListener('click', this.clickHandler);
}
clickHandler() {
var clk = this.state.clicks
this.setState({
clicks: clk + 1
});
}
render() {
let children = this.props.children;
return (
<div className="my-component" ref="myComponentDiv">
<h2>My Component ({this.state.clicks} clicks})</h2>
<h3>{this.props.headerText}</h3>
{children}
</div>
);
}
}
Здравствуйте, попробуйте эти коды, чтобы увеличить ваше значение
class Counter extends React.Component{
constructor(props){
super(props);
this.addOne = this.addOne.bind(this);
this.state = {
count : 0
}
}
addOne() { // addOne as HandleClick
this.setState((preState) => {
return {
count : preState.count + 1
};
});
}
render() {
return (
<div>
<h1>Count : {this.state.count}</h1>
<button onClick={this.addOne}>+1</button>
</div>
);
}
}
ReactDOM.render(<Counter />, document.getElementById('YOUR-ID'));