在状态的先前值得到更新后,如何更新状态中的项目?

时间:2020-03-19 04:00:41

标签: reactjs

我正在构建一个反应价格跟踪应用程序,该程序将处理您的所有费用,收入,然后将其列出。

在将项目添加到费用或收入后,我不得不更新预算,但是由于setState的异步特性,它无法正常工作?

这是我的功能

async create(e){
        e.preventDefault()
        var type = this.type.value
        var obj  = {'id':this.NextId(type),'description':this.description.value,'amount':this.amount.value}
        if (type ==="expense"){
            obj.percentage   = "%100"

            var newState = this.state.setState((prevState)=>({
                expense:[...prevState.expense,obj],
                totalExpense:prevState.budget - parseInt(this.amount.value)
            }))
        }
        else{
            var newState = this.state.setState((prevState)=>({
                income:[...prevState.income,obj],
                totalIncome:prevState.totalIncome + parseInt(this.amount.value)

            }))
        }


        this.state.setState({budget:this.state.totalIncome  - this.state.totalExpense,percentage:this.getPercentage()}))        
    }

2 个答案:

答案 0 :(得分:1)

您可以使用setState回调

例如,假设您要在费用更新后更新预算,则可以传递一个函数作为this.setState(prevState => ({ expense: prevState.expense -10 }), () => { this.setState(prevState => ({ budget: prevState.totalIncome - prevState.expense })) }) 的回调

this.setState(prevState => ({ expense: prevState.expense -10, budget: prevState.budget - 10 }))

或者您可以同时更新多个项目

public static string ResultsFolder => DateTime.Now.ToString("MM.dd.yyyy h:mm:ss");

答案 1 :(得分:0)

我制作了一个新函数,将setState视为Promise

async PromiseSate(state){
       await new Promise(resolve => this.setState(state,resolve))
    }
var exampleSetState = PromiseState({data:"data"})

那么你可以这样做

exampleSetState.then("your code goes here")