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

我的函数计算价格值的总数,但总是落后一步?[重复]

秦安怡
2023-03-14

我在我的反应容器中有加减法函数,每当点击跨度'或'-'时都会传递这些函数,以便计算给定不同价格值的三种'产品'的总'价格'。

我的问题是:当我第一次点击任一按钮时,它首先记录初始值0,然后随着每次点击,从总数中增加或减少,但总是落后一步。

例如,如果我点击“苹果,价格:2”,我的控制台记录为0。然后,我将单击“pears,price:5”,我的控制台将记录2,将上一次单击的值相加,而不是将5添加到总数中。

我的加减函数有什么问题吗?我在控制台注销之前更改state.total,那么为什么会发生这种情况呢?

这是我的密码:

class ProductList extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            total: 0
        }

        this.addFunction = this.addFunction.bind(this);
        this.subtractFunction = this.subtractFunction.bind(this);
    }

    addFunction(product) {
        var x = Number(product.price)
        this.setState({total: this.state.total + x});
        console.log('total is ' + this.state.total)
    }

    subtractFunction(product) {
        var x = Number(product.price)
        this.setState({total: this.state.total - x});
        console.log('total is ' + this.state.total)
    }

    render() {
        var createProducts = this.props.products.map((product, i) => {
            return <Product 
                    key={i} 
                    title={product.title} 
                    price={product.price}
                    addProductSetUp={() => this.addFunction(product)}
                    subtractProductSetUp={() => this.subtractFunction(product)}
                    />
        });

        return (
            <div>
                <ul>
                   {createProducts}
                </ul>
            </div>
        );
    }
}

共有2个答案

万俟亦
2023-03-14

setState操作是异步的,并且是为了提高性能而批处理的。这是在setState的留档中解释的:

https://reactjs.org/docs/state-and-lifecycle.html#state-updates-may-be-asynchronous

因此,在您的示例中,状态尚未更新。您可以使用回调来检查更新后的状态:

addFunction(product) {
    var x = Number(product.price)
    this.setState({total: this.state.total + x},
      () => console.log('total is ' + this.state.total));

}

但这对你来说不一定有用。您可以简单地打印出计算值

addFunction(product) {
    var x = Number(product.price);
    var total = this.state.total + x;
    this.setState({total});
    console.log('total is ' + total);
}
戴博
2023-03-14

ReactJS的setState是一个异步操作,这就是为什么您不能立即获得它的最新值。

如果您需要立即访问,您可以使用:

this.setState(prevState => ({
  total: prevState.total + x,
}), () => {
  console.log(this.state)
})
 类似资料:
  • 我在React中有各种各样的函数,其中我需要使用useState更改状态,然后根据新状态是否满足某些条件执行一些操作。 当使用prop=“newpassword”调用handleChange时,它使用useState中的setValues方法设置newpassword的值。然后使用正则表达式测试对新密码进行评估,如果它有效,则状态变量passwordIsValid应设置为true。 状态总是比th

  • 问题内容: 我有两个表如下 桌子 和一张桌子 我想做的是,计算每种产品的小计价格(数量*价格),然后求和整个订单的TOTAL值。 我正在尝试这样的事情 但是当然那是行不通的:) 任何帮助表示赞赏! 编辑: 我只想显示整个订单的总数,因此基本上是OrderItem中每一行的Quantity * Price的总和。这是一些示例数据。 样本数据 桌子产品 表OrderItem 中号 问题答案: 使用:

  • 我还没反应过来。我已经学了几个月了。我目前正在使用ant-design创建标记,并试图在单击时删除它们。我有一个用户的状态,根据他们想要删除或创建标记,用户状态会更新。但是,当I删除标记时,状态不会立即更新,并在中的I返回空数组。我看过以前类似的问题,但是它们使用,但这不适合我的用例。我还尝试将这个放在代码的返回部分,这在某种程度上解决了问题,但是,每当我从用户表中选中一个复选框时,标记的颜色就会

  • 我想计算一个句子中重复单词或重复单词的总数。这里我可以打印单词,但不能计算这些单词。 我期望输出:- 给定字符串中的重复单词:大黑色 给定字符串中的重复单词总数:2 输出如下: 给定字符串中的重复单词:大黑色 给定字符串中的重复单词总数:10 总计数显示为10,而不是2。

  • 我试图在Acrobat中使用JavaScript以交互形式总计10个数据字段。最初,数据是手动输入的。我们创建的计算公式在手动输入数据时有效,但当数据从另一个表单导出,然后使用FDF文件导入到此表单时,计算公式不能正确合计。 当前工作流使用三种形式。数据输入表格1 打开表格3,将两个数据文件导入该表格。有两个具有类似公式的总计字段,一个将所有负数相加,另一个将所有正数相加。 但是,当我们导入两个文

  • 问题内容: 我有这些表: 我如何计算这些列的总价: 对于每种产品: 适用于所有含运费的产品 问题答案: 您可以通过访问属性来检索 _数据透视_表的列,该属性已经存在了很长时间了 默认情况下,只有模型关键点会出现在枢轴对象上。如果数据透视表包含额外的属性,则在定义关系时必须指定它们: 在您的情况下,您可以像下面的代码中那样定义关系: 现在,可以通过属性(例如)访问表上的列。 最后,这是计算订单总数的