2017-12-30 4 views
1

버튼을 클릭하여 변수에 저장된 숫자를 변경하려고하지만 버튼을 처음 클릭해도 변수의 값은 변경되지 않지만 두 번째는 않습니다. 숫자가 1 씩 변경되므로 단추를 클릭하면 currentNumber += 1이 표시되고 변경된 후에는 console.log이 실행됩니다. 처음 클릭하면 기본값이 인쇄되고 두 번째로 클릭하면 실제로 변경되고 코드의 의도 된 기능이 엉망이됩니다. 나는 이것을 위해 React를 사용하고있다. React로 숫자를 변경하는 함수가 제대로 작동하지 않습니다.

constructor(props) { 
 
\t  super(props); 
 
     this.state = { 
 
      currentSize: parseInt(this.props.size), 
 
      min: 4, 
 
      max: 40, 
 
     } 
 
    }; 
 
    
 
    
 
increaseSize(){ 
 
     this.setState({currentSize: this.state.currentSize + 1}, function(){ 
 
      if(this.state.currentSize >= this.state.max){ 
 
       this.state.currentSize = this.state.max; 
 
       this.state.isRed = true; 
 
      } else if(this.state.currentSize < this.state.max){ 
 
       this.state.isRed = false; 
 
      } 
 
     }); 
 
     console.log(this.state.currentSize); 
 
    }; 
 
    
 
render() { 
 
     var isBold = this.state.bold ? 'normal' : 'bold'; 
 
     var currentSize = this.state.currentSize; 
 
     var textColor = this.state.isRed ? 'red' : 'black'; 
 

 
     return(
 
       <div> 
 
       <button id="decreaseButton" hidden='true' onClick={this.decreaseSize.bind(this)}>-</button> 
 
       <span id="fontSizeSpan" hidden='true' style={{color: textColor}}>{currentSize}</span> 
 
       <button id="increaseButton" hidden='true' onClick={this.increaseSize.bind(this)}>+</button> 
 
       <span id="textSpan" style={{fontWeight: isBold, fontSize: currentSize}} onClick={this.showElements.bind(this)}>{this.props.text}</span> 
 
       </div> 
 
     ); 
 
    }
변수의 수는 표시하지만에서 볼 수있는 바와 같이 디스플레이되는 한 가변

enter image description here

내부 것과 다른 값을 갖는다 그림, 표시된 숫자는 26이지만 그 변수는 25입니다.

또한 카운터의 최소값과 최대 값을 설정했는지 확인할 수 있습니다. 두 값 중 하나에 도달하면 콘솔에서는 표시되지 않지만 디스플레이에서는 1이됩니다. 그래서 디스플레이에서는 3과 41시에 멈추지 만 콘솔에서는 4와 40으로 멈 춥니 다.

내가 뭘 잘못하고 있니?

편집 : 기본 값은 16이며 그 이유는 제대로 작동하지 않는 이유는 버튼을 처음 클릭하면 콘솔에 출력됩니다.

+0

먼저 참조하십시오, 당신은 상태 반응 변이해서는 안됩니다. 'increaseSize()'함수에서, 여러분은 그것을 변이시키고있는'this.state'에 값을 할당합니다. 상태를 변경하려면'this.setState()'를 사용하십시오. 둘째, 상태가 변경되기 전에'this.setState()'가 반환되기 때문에 상태가 변경되기 전에'increaseSize()'의'console.log'가 호출됩니다. 상태가 변경된 후에 코드를 실행하려면 코드를'this.setState()'의 콜백에 넣으십시오. – Sidney

+0

@ 시드니 고맙습니다. 나는 setState 문제를 해결했다. 그것은 내 부분에 간과했다. 그러나 나는 아직도 숫자 문제에 봉착하고있다. 어떤 코드에 두 번째 포인트를 참조합니까? 편집 : nevermind. 나는 그것을 알아 냈다 : – Leo

답변

0

React가 비동기 적으로 변경 사항을 처리하기 때문에의 기능 버전을 사용하십시오. 설정시 값을 보장 할 수 없습니다. 이것은 또한 console.log을 사용하는 원인이기도합니다. 대신 같은 뭔가를 이동합니다

increaseSize(){ 
const aboveMax = this.state.currentSize >= this.state.max; 

this.setState(prevState => ({ 
    currentSize: aboveMax ? prevState.max : prevState.currentSize + 1, 
    isRed: aboveMax 
}) 
,() => console.log(this.state.currentSize)); 
}; 

또는, 당신은 setState() 콜백 함수로하지 않으려면 render() 방법에 콘솔 문을 이동합니다.

https://reactjs.org/docs/react-component.html#setstate뿐만 아니라 당신의 생성자에서 isRed을 설정하는 것을 잊지 마세요 :)

+0

나는 isRed' 소품을 기억했다, 나는 단지이 포스트의 목적을 위해 그것을 포함하지 않았지만, 알림을 주셔서 감사합니다. 이 코드는 38까지 내려갈 때까지 숫자가 여전히 빨간색으로 내려가는 유일한 경고와 함께 훌륭하게 작동합니다. 모든 단서는? 편집 : 귀하의 형식으로 reducedSize 함수를 다시 작성하여 문제가 해결되었습니다. 아마 이전에 그렇게 했어야했는데. 도와 주셔서 대단히 감사합니다. – Leo

관련 문제