reactjs中如何处理this.setState问题

Posted

技术标签:

【中文标题】reactjs中如何处理this.setState问题【英文标题】:How to deal with this.setState issue in react JS 【发布时间】:2019-05-10 16:16:57 【问题描述】:

由于某种原因,当我按下下一个按钮时,我的 setState 的值没有更新。这是一个进度条,每次按下按钮时进度条都会增加 20。所以像 value:this.state.value+20 有谁知道发生了什么?任何帮助表示赞赏。谢谢!

import React, Component from "react";
import  Button, Progress  from 'reactstrap';
import "../src/Questions.css"

class Questions extends React.Component 



     handleClick=()=>
         alert(this.state.value);
         this.setState(
             value:this.state.value +20
         )


     

    render() 

        this.state = 

            value:10


        return(
            <div>
                <div><Progress value=this.state.value /></div>
                <div className="howMuchText">How much does it cost to build an app</div>


                <div className="nextButton">
                <Button onClick=this.handleClick color="primary" size="lg">Next</Button>
                </div>
            </div>
        )
    


export default Questions;

【问题讨论】:

为什么你的渲染中有this.state = value: 10?这是你的问题的原因,而不是你应该做的事情。 这只是默认设置。抱歉,我对此很陌生 在此处提问之前,请花点时间阅读一些 React 初学者教程。这种类型的问题对其他人并没有真正的帮助,而且很容易调试(类似于错字)。解释一下:这不是你在 React 中的默认状态。您必须在构造函数中或使用类字段声明快捷方式来执行此操作。通过在渲染中这样做,value 将始终为 10。 我认为这个问题不应该被否决,它会阻止人们提问:( kenny335 可能已经完成了教程,但没有一个人解释过这个......但我是一个堆栈溢出的新手,所以也许我错了:) 【参考方案1】:

之所以没有更新,是因为您在 handleClick 函数中使用 setState 更新状态,然后在 render 函数中将其重置,因此您正在撤消更新。尝试这个。

将您的来源从您所拥有的更改为:

import React,  Component  from "react";
import  Button, Progress  from 'reactstrap';
import "../src/Questions.css"

//you've imported component so you don't need to do React.Component
class Questions extends Component 

   state =  
     value: 10, 
    
     handleClick = () =>
         alert(this.state.value);
         this.setState(
             value: this.state.value +20
         )
     

    render() 

        return(
            <div>
                <div><Progress value=this.state.value /></div>
                <div className="howMuchText">How much does it cost to build an app</div>


                <div className="nextButton">
                <Button onClick=this.handleClick color="primary" size="lg">Next</Button>
                </div>
            </div>
        )
    

应该这样做。希望这会有所帮助。

【讨论】:

np 快乐编码 :)【参考方案2】:

在渲染函数中改变状态是错误的。在每次更新时,状态都会发生变化。状态在反应时是不可变的。您可以在构造函数中对其进行初始化。

  constructor(props) 
        super(props);
        this.state = 

            value:10
             
       

【讨论】:

【参考方案3】:

您应该使用构造函数来初始化值。当您单击按钮时,您在代码中做错了什么,它正在更新值,但 setState 重新渲染,所以它再次初始化 value=10。

import React, Component from "react";
import  Button, Progress  from 'reactstrap';
import "../src/Questions.css"

class Questions extends React.Component 
  constructor(props) 
    super(props);
    this.state =  value:10
        
   


 handleClick=()=>
     alert(this.state.value);
     this.setState(
         value:this.state.value +20
     )


 

render() 

    return(
        <div>
            <div><Progress value=this.state.value /></div>
            <div className="howMuchText">How much does it cost to build an app</div>


            <div className="nextButton">
            <Button onClick=this.handleClick color="primary" size="lg">Next</Button>
            </div>
        </div>
    )
 


  export default Questions;

【讨论】:

您不再需要构造函数...代码仍将使用它执行,但您不需要它,节省您的手指打字时间:) @BensSteves 我知道,但这是在反应中初始化变量的正确方法,当您将拥有更多状态时,如果没有构造函数,您将很难管理状态。 我不确定我是否完全同意这一点。想象一下,您有五个方法必须不断地绑定到您的组件,只是在您使用构造函数路由之前。我认为你可以在没有的情况下管理状态。只是我的观点。我确实认为你的方式对初学者有好处。让他们有更好的理解。另外,我认为您的方式还有更多文档:) 我同意,但我说的是代码质量,当他们的代码出现错误时,开发人员很容易理解问题。 是的,我同意你的看法

以上是关于reactjs中如何处理this.setState问题的主要内容,如果未能解决你的问题,请参考以下文章

Sencha Touch V2 中如何处理方向变化

Rust 中如何处理分布式内存并行性? [关闭]

函数式编程中如何处理副作用?

函数式编程中如何处理副作用?

深度学习分类中如何处理类之间的相关性?

Preact 中如何处理“refs”?