私はreact
とredux
が初めてであり、angular
とどのように異なるかを調査しています。
単純なログインページを作成しようとしていますが、目的を達成できません。ログインフォームからユーザー名とパスワードを取得したら、次のように送信します。
_ submitHandler(e){
e.preventDefault();
var user = {
name : this.state.username,
password: this.state.password
}
this.props.authenticateUser(user);
browserHistory.Push('/home');
this.setState({
username:'',
password:''
})
}
_
ここで、authenticateUser
は、既存のユーザーのリストと、プロパティisAuthenticated
を持つ状態からチェックする、reducer内の関数です(以下を参照)。
_ case 'AUTHENTICATE_USER':
var users = state.userslist;
var payloadUser = action.payload;
for (let i = 0; i < users.length; i++) {
let user = users[i]
if (user.name === payloadUser.name) {
return {...state, isAuthenticated: true };
}
};
return {...state, isAuthenticated: false };
_
今、Angularでは、この呼び出しが完了するのを待って、この値がtrue
またはfalse
であるかどうかを確認し、_angular-router
_を使用してホームページに移動します。
しかし、どのようにreact
で同じことを達成できますか。サンプルアプリケーションで_react-router
_を使用しています。
this.props.authenticateUser(user)
を呼び出す場所のすぐ下のisAuthenticated
関数でsubmitHandler
をチェックしようとしましたが、問題は、_this.props.isAuthenticateUser
_が更新されず、false
、これはレデューサーでinitialState
として設定しました。
isAuthenticated
関数が呼び出された後にauthenticateUser
をチェックして、ホームページのルーティングを続行できるようにする方法を教えてください。 promise
を使用し、redux
によって状態が更新されるのを待ってから、もう一度確認する必要がありますか? (reactは一方通行のパスであり、そのようには動作しないことを知っています。)
また、認証に失敗した場合、ログインフォームの下にエラーパネルを表示するにはどうすればよいですか。入力としてisAuthenticated
を受け取り、表示するためにfalseかどうかをチェックするエラーパネルのコンポーネントを使用すると思います(AngularのようなngShow。)しかし、私はそれが怖い私の状態がちょうど時間内に更新されないため、同様に動作しません。
状態が変化すると、render関数が呼び出されることを知っています。しかし、私はただReact。
Edit:簡潔にするために、上記のアクション作成者と完全なリデューサーは提供せず、ユーザー認証のケース切り替え操作のみを示しました。私のアプリは、アクション、レデューサー、コンテナー、コンポーネントなどを備えた元のreduxアーキテクチャーに従います。
EDIT:Githubリンク ここ
Reduxアプリケーションでのデータフローの仕組みを簡単に説明します。
レデューサーは、コンポーネントから直接呼び出さないでください。ユーザー認証の呼び出しはアクション内にある必要があり、それはコンポーネントからディスパッチされるべきものです。
アクションを定義するとき、アクションのタイプを定義するプロパティを与えることができます。たとえば、この場合、_type: AUTHENTICATE_USER
_になります
アクションの完了後、reduxストアは現在の状態とアクションとともにリデューサーを呼び出します。ここで、action.type
_に基づいてredux状態を更新できます(上記の2番目のコードスニペット)
これが最も重要な部分です:コンポーネントには、Redux状態から値をコンポーネントに渡すmapStateToProps
メソッドが必要です。そのため、状態が変化すると、小道具が更新され、コンポーネントが再レンダリングされます。 mapStateToProps
を使用するには、react-reduxライブラリからconnectを実装する必要があります。 ( https://github.com/reactjs/react-redux/blob/master/docs/api.md#connectmapstatetoprops-mapdispatchtoprops-mergeprops-options )
あなたが望むものを達成するために、これは私が提案するものです:
コンポーネントのcomponentWillReceiveProps
メソッドで、_props.isAuthenticated
_を確認し、context.router.Push()
を使用して、ユーザーが認証された場合にナビゲートします。
また、コンポーネントのrender
メソッドで_props.isAuthenticated
_に基づいてチェックを行い、エラーメッセージを表示します。
役立つリンク: