2016-11-03 16 views
0

状態管理に反応し、苦労して苦労しました。次のコードでは、ボタンがあります。それをクリックすると、2段階の機能がトリガーされます:onClick関数の現在の状態を取得していません

1)いくつかの検証を行い、成功したかどうかに基づいて状態のフラグを更新するには、減速機を呼び出します。

2)状態でupdatedフラグを使用して、検証に失敗した場合はユーザーに通知し、成功した場合は通常のプロセスを続行します。

transfer() { 
    this.props.validateData(); 
    this.notifyOrSend(this.props.validationSucceeded); 
} 

notifyOrSend(validationSucceeded) { 
    if (validationSucceeded === false) { 
    this.refs.validationModal.showModal(); 
    } else { 
    this.props.sendTransfer(); 
    } 
} 

render() { 
    return (
     <div> 
     <Button label="Transfer" onClickFn={this.transfer}/> 
     <ValidationModal ref="validationModal"/> 
     </div> 
); 
} 

...

function mapStateToProps(state) { 
    return { 
    validationSucceeded: state.validatedData.validationSucceeded, 
    }; 
} 

function mapDispatchToProps(dispatch) { 
    return bindActionCreators({ 
    validateData, 
    }, dispatch); 
} 

私の問題は、私はフラグ(this.props.validationSucceeded)の古いバージョンを取得していますということです。フラグの初期状態はtrueです。ボタンの最初のクリックで検証に失敗した場合、this.props.validationSucceededの値はtrueのままです。 falseへの変更は、2回目のクリックでのみ取得されます。コンソールでは、トリガされるアクションがnextStateのフラグの最新の値を持つことがわかります。このコードを変更して最新の値を取得するにはどうすればよいですか?

答えて

1

setStateはイベントに似ていますが、実際には一度実行されるsetStateに2番目の関数を渡すことができます。

すぐにnotifyOrSendを呼び出しているので、次のレンダリングが発生するまでは状態は変わりません。私はnotifyOrSend関数をコンポーネントの適切なライフサイクルメソッドに移動する方法を検討します。実際にはnotifyOrSendの機能に応じて、componentDidUpdateまたはcomponentWillUpdateのいずれかになります。ザから

はドキュメント反応:直ちにthis.state変異ない

SETSTATEを()が、 ペンディング状態遷移を作成します。この メソッドを呼び出した後this.stateにアクセスすると、潜在的に既存の値が返される可能性があります。 setStateへの呼び出しの同期操作を保証する はなく、パフォーマンス向上のために を呼び出してもよいでしょう。

+0

お返事ありがとうございます。私はcomponentWillUpdateとcomponentWillReceivePropsを試していましたが、最初のクリックで動作しましたが、その後に二次的な問題があります。ユーザーが誤ったデータを修正せず、検証フラグがfalseのままである場合、状態は変更されず、ライフサイクルメソッドは呼び出されません。検証フラグがfalseの間にボタンをクリックするたびにトリガするように通知する必要があります。 –

+0

どこでもshouldcomponentupdateを使用していますか?状態は実際には変更されないので、コンポーネントの再レンダリングをトリガしない可能性が高く、そのロジックには決して当たらない。 私がいて、あなたが求めていることが必要なのは、私がこの状態で何もしないことと、 'validateData'を真または偽を返し、減速機に結びつけない関数にすることです。次に、あなたは単に 'validateData'の結果でnotifyOrSendを呼び出すでしょうが、私はあなたのコードの多くしか見ることができず、あなたのために働かないかもしれません – finalfreq

関連する問題