2016-06-15 97 views
0

我試圖從兩個輸入中進行數學運算。首先更新狀態,然後添加具有新更新狀態的兩個值。React.JS處理狀態中的兩個值

<input type="number" onChange={this.handleIncomeChange.bind(this)} value={this.state.income} /> 

這個代碼不工作:(結果總是在後面一個數字)

handleIncomeChange(e) { 
    this.setState({income: e.target.value}); 
    this.state.resultMonth = +this.state.income - +this.state.expense; 
} 

此代碼工作:

handleIncomeChange(e) { 
    const income = e.target.value; 
    this.state.resultMonth = +income - +this.state.expense; 
    this.setState({income: e.target.value}); 
} 

不知道如果我的理解作出反應的概念。 JS狀態正確。肯定不明白爲什麼第一個代碼不起作用。

回答

4

您不應該直接使用this.state =修改狀態(狀態初始化期間除外)。使用setState API進行所有狀態修改。

例如:

handleIncomeChange(e) { 
    const newIncome = e.target.value; 
    this.setState({ 
    income: newIncome, 
    resultMonth: newIncome - this.state.expense 
    }); 
} 

更新:基於由OP在下面註釋中描述的codepen和問題。

你可以做下面的事情來解決可重用性的問題。

handleDataChange(income, expense) { 
    this.setState({ 
    income: income, 
    expense: expense, 
    resultMonth: income - expense 
    }); 
} 

handleIncomeChange(e) { 
    const newIncome = e.target.value; 
    this.handleDataChange(newIncome, this.state.expense); 
} 

handleExpenseChange(e) { 
    const newExpense = e.target.value; 
    this.handleDataChange(this.state.income, newExpense); 
} 
+0

'handleIncomeChange(E){ \t \t常量newIncome = e.target.value; \t \t this.setState({ \t \t \t收入:newIncome, \t \t \t resultMonth:newIncome - this.state.expense \t \t}); \t \t this.showinfo() \t} \t showinfo(){ \t \t的console.log(resultMonth); \t}' 如果我使用這個函數,它仍然「落後一步」。你知道如何正確地做到這一點? –

+1

'this.setState'不能保證同步執行,因此如果你在調用'this.setState'後直接登錄'this.state',你不能保證看到更新後的結果。相反,您需要通過'render()'或者其中一個生命週期方法(例如'componentWillUpdate(nextProps,nextState)')來訪問更新後的狀態。你在'showInfo'中想做什麼?如果你用這個更新你的問題,我可以提出建議。很有可能你可以在'render()'中處理這個問題。 – ctrlplusb

+0

'showInfo'僅用於測試目的。我想要實現具有許多輸入的表單,其中每次更改都會觸發一個用更新值進行數學運算的函數。就像:'calculate {this.state.expense - this.state.income + this.state.tax}' –