【问题标题】:I get a warning message saying "Do not mutate state directly."我收到一条警告消息,说“不要直接改变状态”。
【发布时间】:2021-06-24 08:05:49
【问题描述】:

我的代码运行良好,但我不断收到此警告消息“不要直接改变状态。使用 setState()”。我尝试将 setState 用于 currentNumber 和输入,如下所示:

this.setState({currentNumber: this.state.currentNumber.toString() + numberbtn.toString()})
this.setState({inputs: this.state.currentNumber})

但它会在第二次单击而不是第一次单击时显示输出。 下面是对我有用但显示警告消息的完整代码。

import React from 'react'
import DisplayComponent from './components/DisplayComponent'

class App extends React.Component {
  constructor(props){
      super(props);
      this.state = {
        inputs: '',
        result: '',
        currentNumber: '',
      }
  }

  inputNumber = numberbtn => {
    this.state.currentNumber = this.state.currentNumber.toString() + numberbtn.toString()
    this.state.inputs = this.state.currentNumber 
    this.setState({result: this.state.inputs})
  }

  render() {
      return (
          <div className = "container">
              <div className = "display">
                  <DisplayComponent result={this.state.result}/>
              </div>
              <button onClick={() =>this.inputNumber(1)}>1</button>
              <button onClick={() =>this.inputNumber(2)}>2</button>
          </div>
      )
  }
}
export default App

【问题讨论】:

  • currentNumberinputsresult 的用途是什么?看起来它们都存储相同的值。为什么?
  • 我正在尝试构建一个计算器。所以当点击数字按钮时,数字存储在当前数字中,当前数字会将值传递给输入。当您点击一个运算符时,前一个数字将具有当前数字的值,当前数字将为空。输入将存储数字和运算符。结果将获得输入的值并将其显示在屏幕上。我刚刚在这里发布了部分代码。现在有意义吗?

标签: reactjs


【解决方案1】:

这是因为您直接更新状态,例如this.state.currentNumber = ...
我建议使用一些变量。

inputNumber = numberbtn => {
    let currentNumber = this.state.currentNumber.toString() + numberbtn.toString()
    let inputs = currentNumber 
    this.setState({currentNumber: currentNumber, inputs: currentNumber, result: inputs})
  }

【讨论】:

  • 我的代码中有其他函数使用 currentNumber 和输入。所以,如果我使用变量,它不会更新其他函数中的值。
  • @user3629875:我认为您误解了解决方案。在您的代码中,您正在更新每个状态值,并使其依赖于先前的状态值。相反,您可以预先计算值并同时更新所有状态值。
  • 为了了解我遇到的问题,我在下面的链接中发布了更好的代码视图。 [stackoverflow.com/q/68123742/3629875]。让我知道。谢谢
  • @user3629875 你能分享你的代码的codeandbox链接吗?
猜你喜欢
  • 2019-12-22
  • 2017-11-19
  • 1970-01-01
  • 2015-09-18
  • 2019-07-10
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 2021-11-28
相关资源
最近更新 更多