2016-07-06 9 views
0

基本上,我通過檢查他們是否通過我的正則表達式驗證表單字段,如果他們這樣做,我設置狀態爲'成功'或'錯誤' (由react-bootstrap使用)。reactjs - 我的函數有一些問題來更新狀態和使用承諾

所以基本上,我有大約6個需要執行的函數,但是,密碼字段驗證函數給我帶來了很多麻煩。

handleSubmit()目前看起來是這樣的 -

handleSubmit() { 
    this.validate1(); 
    this.validate2(); 
    // ... 
    this.validatePassword(); 
    this.validateConfirmPassword(); 
} 

然而,問題是,validatePassword()將SETSTATE是「成功」或「錯誤」,並且由於功能爲了不燒了,我通常得到validateConfirmPassword()的錯誤結果。

我正在閱讀Promise上的mozilla頁面,但是我非常困惑,不確定如何在我的代碼中應用該頁面。

我可以做類似Promise.all([everything_except_validateConfirmPassword]).then(validateConfirmPassword())但看起來不正確..

validatePassword(pass) { 
    if (pass.length >= 8) { 
     if (checkPass.test(pass)) { 
     this.setState({ 
      passValidation: validation.success 
     }); 
     } else { 
     this.setState({ 
      passValidation: validation.error 
     }); 
     } 
    } else { 
     this.setState({ 
     passValidation: validation.error 
     }); 
    } 
    } 

validateConfirmPassword(pass, confirmPass) { 
    const matches = pass === confirmPass; 
    if (matches && this.state.passValidation === validation.success) { 
     this.setState({ 
     confirmPassValidation: validation.success 
     }); 
    } else { 
     this.setState({ 
     confirmPassValidation: validation.error 
     }); 
    } 
    } 
+0

是否有任何的這些功能異步? –

+0

你好。是的 - 他們現在都在,但我想知道如何在'validatePassword()'後面觸發'validateConfirmPassword()''' – user3152131

+0

...你確定嗎?根據某些正則表達式檢查字符串不是異步的。除非您正在與服務器通話並等待響應,否則您並不需要Promises。 –

回答

-1

可以使用陣營的componentDidUpdate以這種方式解決這個問題:

componentDidUpdate() { 
    if (this.state.canCheckConfirmPwd) { 
    this.validateConfirmPassword(); 
    } 
} 

validatePassword(pass) { 
if (pass.length >= 8) { 
    if (checkPass.test(pass)) { 
    this.setState({ 
     passValidation: validation.success, 
     canCheckConfirmPwd: true, // on next update we'll trigger validateConfirmPassword() 
    }); 
    } else { 
    this.setState({ 
     passValidation: validation.error 
    }); 
    } 
} else { 
    this.setState({ 
    passValidation: validation.error 
    }); 
    } 
} 

validateConfirmPassword(pass, confirmPass) { 
    const matches = pass === confirmPass; 
    if (matches && this.state.passValidation === validation.success) { 
     this.setState({ 
     confirmPassValidation: validation.success, 
     canCheckConfirmPwd: false, // to avoid retriggering the function on next update 
     }); 
    } else { 
     this.setState({ 
     confirmPassValidation: validation.error, 
     canCheckConfirmPwd: false, 
     }); 
    } 
    } 
+0

謝謝。不幸的是,我有一個代碼錯誤,它是100%我的錯:(對不起 – user3152131

+0

這個答案重新強調OP的組件過度使用狀態。理想情況下,你應該保持儘可能最小狀態。請看看[這篇文章](http://reactkungfu.com/2015/09/common-react-dot-js-mistakes-unneeded-state/),以幫助理解爲什麼。 –

+0

什麼會是一個更好的方式來做到這一點呢?開放的建議!:) – user3152131