为啥我的状态计数器比它应该的值落后一个值?

Posted

技术标签:

【中文标题】为啥我的状态计数器比它应该的值落后一个值?【英文标题】:Why is my state counter one value behind what it should be?为什么我的状态计数器比它应该的值落后一个值? 【发布时间】:2019-12-14 08:23:53 【问题描述】:

我是 reactjs 新手。我试图为一些上传的文件创建一个评论部分,并在每个文件的评论按钮上保留一个计数器。但是,计数器返回奇怪的值。 以下是相关代码:

class ListItem extends React.Component 


        constructor(props)
            super(props)
            this.clicked = false 
            this.commentButtonRef = React.createRef();
            this.state = clickCounter:0, counterMat:[] 
        




         handleClick = () =>


                console.log(this.state.clickCounter) 
                this.clicked = true;
                this.counterMat = []
                this.props.onCommentButtonClick(this.props.file, this.clicked)
                this.clicked = false;

            //update click counter
            this.setState(clickCounter:this.state.clickCounter + 1, this.updateCounterMatrix())

        

        updateCounterMatrix = ()=> 

                const temp = this.state.counterMat.slice() //copy the array
                temp[1] = this.state.clickCounter //execute the manipulations
                this.setState(counterMat: temp,console.log(this.state.counterMat, this.state.clickCounter))
            

        createCounterMat=(element)=>
            // use ref callback to pass DOM element into setState
            this.setState(counterMat:[element,this.state.clickCounter]) 
            console.log(this.counterMat) 
        

        render()

            return( 

                <div className="item">
                        <i className="large file alternate icon"></i>
                        <div className="content">
                                <div className="header">this.props.file</div>
                                <button className='comment-button' 
                                        id = this.props.file 
                                        onClick = this.handleClick 
                                        key = this.props.file
                                        ref = this.createCounterMat
                                        clickcounter = this.state.clickCounter
                                > Comment</button> 
                        </div>
                </div>
            )
        

以下是我遇到的问题:

1) 一旦此页面首次呈现,我在 button 元素中使用的 reactRef 回调函数 createCounterMat 应该控制台日志的未定义,这是出乎意料的。

2) 在第一次单击我的按钮时,handleClick 函数会正确调用。但是,handleClickupdateCounterMatrix 内部的控制台日志都为this.state.clickCounter 返回值0。我预计第一个为 0,但到此阶段第二个 console.log 为 1。

3) 在第二次单击时,clickCounter 状态似乎正确地增加了 1。但是,console.log(this.state.counterMat, this.state.clickCounter)this.state.counterMat 中给出的值是 0,而在这种情况下的值是 1。 state.clickCounter。

这是显示所有这些的屏幕截图

谁能帮我弄清楚发生了什么事?

【问题讨论】:

【参考方案1】:

您在设置状态之前调用 console.log,而不是之后。这个:

 this.setState(
  counterMat: temp,
  console.log(this.state.counterMat, this.state.clickCounter)
)

... 表示“调用console.log,然后将其结果与counterMat: temp 一起传递给this.setState”。你可能打算这样做:

 this.setState(
  counterMat: temp,
  () => console.log(this.state.counterMat, this.state.clickCounter)
)

【讨论】:

感谢您的帮助。我已经按照你说的修改了。我还意识到我需要将//update click counter this.setState(clickCounter:this.state.clickCounter + 1, this.updateCounterMatrix()) 更改为//update click counter this.setState(clickCounter:this.state.clickCounter + 1, ()=&gt;this.updateCounterMatrix()) 才能完全解决问题。但是,我在第一次渲染时仍然得到未定义的值 您有时使用this.counterMat,有时使用this.state.counterMat。 createCountermat 中的日志使用this.counterMat,但在单击发生之前不会设置该变量。如果无意中使用了两个变量,则将代码更新为只使用一个。如果是故意的,那么给this.counterMat一个初始值,可能在构造函数中。

以上是关于为啥我的状态计数器比它应该的值落后一个值?的主要内容,如果未能解决你的问题,请参考以下文章

对db中的值进行排序和计数[重复]

对为啥我的算法运行速度比它应该的慢感到困惑

西门子1200plc为啥不计高速计数器的值(AB正交的编码器)

innodb 存储引擎为啥要用一个自增的主键

我的表有多个列,我想获取每列中的值计数并在 postgresql 中分别显示每列的计数值

0x50 动态规划(0x5C 计数类DP)例题3:装饰围栏(题解)(计数类DP讲解,确定第k个排列)