Мое приложение вылетает, когда я использую циклы for или while

#javascript #reactjs

#javascript #reactjs

Вопрос:

Я начал изучать reactjs. Я создаю это действительно простое приложение. Итак, я создал кнопку уменьшения, но я хочу, чтобы эта кнопка работала только тогда, когда количество элементов больше или равно нулю. Я пытался использовать циклы while и for, но мое приложение вылетает, когда я использую циклы. Какие-нибудь советы? Спасибо!

Вот мой код:

 import React, { Component } from 'react';

class Cart extends Component {
  state = { 
    count: 0,
    message: ""
   };

   handleIncrement = () => {
     this.setState({count: this.state.count   1});
   }

   handelDecrement = () => {
     while(this.state.count > 0){
       this.setState({count: this.state.count - 1})
     }
   }

   handleStopShopping = () => {
     this.setState({message: this.state.message   "Thank you for your trust! Come back again."})
   }

  render() { 
    return ( 
      <div>
        <h5>Use plus sign to add items to your cart, or use the minus sign to delete items from your cart.</h5>
        {/*Printing the count*/}
        <span className = {this.getBadgeClasses()}>{this.showCount()}</span>
        {/*Increment Button*/}
        <button onClick = {this.handleIncrement} className = {this.incrementButton()}> </button>
        {/*Decrement Button*/}
        <button onClick = {this.handelDecrement} className = {this.decrementButton()}>-</button> <br></br>

        {/*Info about how much items is in the cart*/}
        <h5><p className = "badge badge-info">{this.itemInfo()}</p></h5>

        <button onClick = {this.handleStopShopping} className = "btn btn-danger btn-sm">Stop Shopping</button> <br></br>
        <h5><p className = "badge badge-dark">{this.state.message}</p></h5>
      </div>
     );
  }

  showCount(){
    let {count} = this.state;
    return count <= 0 ? count = "Zero" : count;
  }

  incrementButton(){
    let btnClasses = "btn m-2 btn-sm btn-";
    btnClasses  = this.state.count > 0 amp;amp; this.state.count < this.state.count ? "dark" : "outline-dark";
    return btnClasses;
  }

  decrementButton(){
    let btnClasses = "btn btn-sm btn-";
    btnClasses  = this.state.count === 0 amp;amp; this.state.count < this.state.count ? "dark" : "outline-dark";
    return btnClasses;
  }

  itemInfo(){
    let itemMessage = "You have "   this.showCount()   " item/s in your cart";
    return itemMessage;
  }

  getBadgeClasses(){
    let badgeClasses = "badge m-2 badge-";
    badgeClasses  = this.state.count <= 0 ? "warning" : "primary";
    return badgeClasses;
  }
}

export default Cart
  

Комментарии:

1. Итак … где находятся циклы for или while в этом коде?

2. Простите, я вставил неправильный код, я исправлю это через секунду.

3. Итак, это то, что я пытаюсь сделать. Цикл While в функции handleDecrement…

4. Почему вы используете цикл while, а не if инструкцию? Кажется более разумным.

5. @Paradigm пожалуйста, поделитесь журналами

Ответ №1:

Допустим, count = 5.

Если вы используете

 while(this.state.count > 0){
    this.setState({count: this.state.count - 1})
}
  

он выполнит код в блоке 5 раз, прежде чем завершить.

То, что вы ищете, — это if оператор.

 if(this.state.count > 0){
    this.setState({count: this.state.count - 1})
}
  

ТАКЖЕ
Вызов setState в вашем цикле происходит асинхронно, поэтому count может быть любое число от 1 до 5 и вызываться много раз, что, вероятно, вызывает сбои

Комментарии:

1. вы могли бы добавить await , и тогда оно не будет вызываться много раз. await this.setState({count: this.state.count - 1})

2. да, теперь я понимаю. Я не знаю, как я пропустил такое простое решение. Спасибо!