setState 计数器显示为 NaN

setState counter showing up as NaN

我的代码:

import React from "react"

export default class MenuItem extends React.Component {
    constructor(props) {
        super(props)
        this.state = { value: this.props.value }
    }
    updateValue(newValue) {
        let propertyName =
            this.state.selectedItem.objType === "number" ? "value" : "strValue"
        console.log(propertyName)
        this.setState((prevState) => {
            let objectToUpdate = prevState.currentObjects.find(

        )
        objectToUpdate[propertyName] = newValue
        return { currentObjects: this.state.currentObjects }
    })
}
data = [
    { itemId: 1 },
]

addTen() {
    this.setState((prevState) => {
        let newValue = prevState.value + 1
        return {
            value: newValue,
        }
    })
}

subTen() {
    this.setState((prevState) => {
        let newValue = prevState.value - 1
        this.setState({ newValue })
        return {
            value: newValue,
        }
    })
}

render() {
    let array = this.data.map((itemPrice, itemName) => {
        return (<div>
            <p>${this.props.itemPrice}</p>
            <h2>{this.props.itemName}</h2>
            <p>{this.props.itemDescription}</p>
            <button onClick={() => this.addTen()}>Add to Cart</button>
            <p> Item Count: {this.state.value}</p>

            <button onClick={() => this.addTen()}>Add One</button>
            <button onClick={() => this.subTen()}>Subtract One</button>
        </div>
        )
    })
    return (array)
}
}

问题是,当我去使用加或减按钮时,我得到了这个 picture of item count: NaN

基本上,我试图让按钮在按下按钮时增加或减少一个计数,但它没有这样做,相反,它只是显示为 NaN。此外,即使在开始时也没有计数为 0。我必须按下按钮才能弹出 NaN。我不知道为什么。有什么建议么?我不知道如何解决它。

因此这里需要进行一些更改。首先,在你的构造函数中,你从未给 value 一个默认值,因此 setState 在尝试将 1 加到未定义的值时返回 NaN 。构造函数供参考:

  constructor(props) {
    super(props);
    this.state = { value: 0 };
  }

另一个变化是您的 subTen() 方法。您在 hit 中调用了两次 this.setState 此处是更新版本:

  subTen() {
    this.setState((prevState) => {
      let newValue = prevState.value - 1;
      return {
        value: newValue
      };
    });
  }