当前位置: 首页 > 知识库问答 >
问题:

按钮点击不更新this.set状态在第一次点击;更新在第二次点击[重复]

闾丘山
2023-03-14

我正在尝试在React中构建我的第一个计算器。我的纽扣似乎有问题(我想)。在测试console.logs时,我发现我第一次点击添加按钮不会更新所有setState。相反,第二次单击会正确更新它。

知道它为什么不起作用吗?

js prettyprint-override">import React, { Component } from 'react';


class calculator extends Component {
    state = { 
        xxxxx:0,
        v1:0,
        v2:0,
        isCal:null

     }

    makeAdd = () => {

        const firstNum = this.state.xxxxx;

        this.setState({
            v1:firstNum,
            xxxxx:0,
            isCal:"add"
        });

        console.log("Add, firstNum is " + firstNum );
        console.log("and v1 is: " + this.state.v1);
        console.log("and isCal is: " + this.state.isCal);

        document.getElementById('DaInserting').innerHTML = null;

    };


    okInsert = (num) => {
        let ss = document.getElementById('DaInserting').innerHTML += num;

        this.setState({xxxxx:ss})
    }

    deAnswer = () => {


        let SecondNum = this.state.xxxxx;

        this.setState({v2:SecondNum})



        console.log("deSecond :" + this.state.v2);
        console.log("this.setState.isCal :" + this.state.isCal);


        let answer = 0;
        this.setState.v2 = this.state.xxxxx;
        if(this.state.isCal==="add") {
            answer = this.state.v1 + this.state.v2;
            console.log("and the answer is :" + answer);
        }

        document.getElementById('DaInserting').innerHTML = answer;

        //this.thenReset();
    }

    thenReset = () => {
        if (this.setState.isCal !== null) {
            this.setState({xxxxx:0})
            this.setState({v1:0})
            this.setState({v2:0})
            this.setState({isCal:null})
        }
    }



    render() {
        //console.log("\nALL states\nthis.state.xxxxx :" + this.state.xxxxx + "\nthis.state.v1 :"+ this.state.v1);

        return (
            <div className="container">
            <div className="row">
                <div style={{height:64}} className="col-12 card-body m-2 shadow-sm rounded bg-light" id="DaInserting"> </div>
            </div>    
            <div className="row">
                <div className="col-3"><div onClick={() => this.okInsert(7)} className="btn btn-secondary btn-lg m-2 btn-block ">7</div></div>
                <div className="col-3"><div onClick={() => this.okInsert(8)} className="btn btn-secondary btn-lg m-2 btn-block ">8</div></div>
                <div className="col-3"><div onClick={() => this.okInsert(9)} className="btn btn-secondary btn-lg m-2 btn-block ">9</div></div>
                <div className="col-3"><div onClick={this.makeDivide} className="btn btn-primary btn-lg m-2 btn-block ">/</div></div>
            </div>

            <div className="row">
                <div className="col-3"><div onClick={() => this.okInsert(4)} className="btn btn-secondary btn-lg m-2 btn-block ">4</div></div>
                <div className="col-3"><div onClick={() => this.okInsert(5)} className="btn btn-secondary btn-lg m-2 btn-block ">5</div></div>
                <div className="col-3"><div onClick={() => this.okInsert(6)} className="btn btn-secondary btn-lg m-2 btn-block ">6</div></div>
                <div className="col-3"><div onClick={this.makeMultiply} className="btn btn-primary btn-lg m-2 btn-block ">x</div></div>
            </div>

            <div className="row">
                <div className="col-3"><div onClick={() => this.okInsert(1)} className="btn btn-secondary btn-lg m-2 btn-block ">1</div></div>
                <div className="col-3"><div onClick={() => this.okInsert(2)} className="btn btn-secondary btn-lg m-2 btn-block ">2</div></div>
                <div className="col-3"><div onClick={() => this.okInsert(3)} className="btn btn-secondary btn-lg m-2 btn-block ">3</div></div>
                <div className="col-3"><div onClick={this.makeSubtract} className="btn btn-primary btn-lg m-2 btn-block ">-</div></div>
            </div>

            <div className="row">
                <div className="col-6"><div onClick={this.deAnswer} className="btn btn-warning btn-lg m-2 btn-block ">=</div></div>
                {/* <div className="col-3"><div onClick={() => this.okInsert(".")} className="btn btn-secondary btn-lg m-2 btn-block ">.</div></div> */}
                <div className="col-3"><div onClick={() => this.okInsert(0)} className="btn btn-secondary btn-lg m-2 btn-block ">0</div></div>
                <div className="col-3"><div onClick={this.makeAdd} className="btn btn-primary btn-lg m-2 btn-block ">+</div></div>
            </div>

            </div>

        );
    }
}

export default calculator;

我有一个名为“DaInserting”的div,当用户点击任何数字键时会更新,然后当用户点击加法/减法/等时,v1应该更新,但它没有。它在第二次点击时更新:-检查console.log

当用户点击加法/减法后,DaInserting得到一个重置,用户再次点击一些数字,然后点击结果按钮,然后检查用户选择的内容(加法/减法)

共有2个答案

夏侯阳
2023-03-14

它测试了你的代码,并且它正在正确地更新状态,请记住setState()是一个异步函数,所以如果你想正确地检查添加函数作为状态更新后执行的回调,像这样:

this.setState({ v1:firstNum, xxxxx:0, isCal:"add"}, () => {
      console.log("Add, firstNum is " + firstNum );
      console.log("and v1 is: " + this.state.v1);
      console.log("and isCal is: " + this.state.isCal);
      console.log(news)
});
聂炜
2023-03-14

在React中,setState是异步的(有关详细信息,请参阅这些文档),因此您不能在调用setState后立即依赖状态更新。相反,您通常需要等到下一次呈现状态值进行更新。

为了解决这个问题,您可以将回调函数(作为第二个参数)传递给setState,或者使用wait,或者直接使用正在更新状态的新值。在这里,我建议使用最后一个选项。另外,通常只在退出函数之前调用setState是一个好主意,以避免异步混淆。

下面是一个如何更新deAnswer方法的示例:

deAnswer = () => {
    let answer = 0;
    if (this.state.isCal === "add") {
        answer = this.state.v1 + this.state.xxxxx;
        console.log("and the answer is :" + answer);
    }

    this.setState({
        v2: this.state.v1,
        answer: answer,
    })
}


render() {
    return (
        <div className="row">
            <div id="DaInserting">{ this.state.answer }</div>
        </div>
    )
}

另外请注意,我已经删除了innerHTML的设置,因为您可以而且应该通过使用状态变量进行呈现来更改“DaInserting”div的内容,而不是直接进行DOM操作。

也可以考虑看看Intro to React教程,这是一本很好的读物,可以帮助你学习和使用React构建。

 类似资料:
  • 为什么第一次点击时状态没有改变? 控制台日志总是在第一次单击时返回“0”,而不是预期的“1”。我该怎么解决这个问题?

  • 我正在使用和这里找到的自定义表模型。我已经用那篇文章中提供的建议更新了我的代码,遇到了一个新问题。我对代码所做的更改是注入<code>ArrayList 用于初始化< code>JTable的代码如下: 我用来更新< code>JTable的代码如下: 我也尝试过使用但这也不起作用。截至目前,使更新的唯一方法是关闭并重新打开程序。具有我用于的,随着用户添加更多玩家,其大小会增加。 为什么< cod

  • 问题内容: 我正在开发我的第一个android计算器应用程序。我陷入一个单一的缺陷。我添加了几个按钮,然后单击这些按钮,它将把各自的文本放在“ 字段”上。主要问题描述如下:在运行项目时,必须单击两次按钮才能将相应的文本首次放置在字段上。例如,单击时将“ 1”放在字段上。在运行时,首先单击该按钮无效。仅在第二次单击时,它将“ 1”放在字段上。 该守则如下: XML按钮和EditField, Main

  • 我的代码生成一个输入字段,允许用户输入要搜索的值。然后当他们单击提交按钮时,它会使displayMap为true,因此当MapDisplay组件呈现时,它将通过Map组件触发API搜索并返回随后显示在地图上的值。 问题是这个过程只工作一次。当我再次单击该按钮时,它确实做了一些事情,我确认它正在输入框中获取新值,但我似乎不知道如何再次渲染地图。 我尝试在this.setState中设置其他变量,试图

  • 目前,我在尝试用新信息更新我的JFrame时遇到了一个主要问题。我尝试了通常的无效、验证、重新绘制等。 以下是创建JFrame的主要代码: 这是用来切换JFrame的按钮代码:这是一个完全不同的类 现在您会注意到,在makeCenter方法的第一段代码中,注释掉了一些内容。如果我不评论它,信息会发生变化,但每次都会创建一个新窗口。 现在,尽管dispose()当前不在其中,但我将其放在makeCe

  • 我突然出现了一个奇怪的行为。我简单地将作为HBox的子节点。当我第一次单击时,它会缩小其大小并失去自己的装饰,就好像它变成了一个普通的。这种行为发生在和继承它的人身上(如JfoPhoenix的也会受到影响)。我将行为动画如下: 初始化时,工具栏下的按钮似乎也会出现此故障状态,如下所示: 我使用的FXML如下所示: 以下是影响此FXML文件的规则: 我不知道是什么影响了即使是普通的按钮。是什么导致此