こんにちはで作られた状態の変化に基づいてイベントリスナーを反応します。私が反応し、Reduxの私は状態の変化に基づいて、私のアプリのユーザーをリダイレクトしようとしているときで作業いくつかの困難を持っています、</p> <p>をReduxの
レベル上位:私のuser
オブジェクトの状態に家の情報が入力された場合、私のアプリのルートを変更したい/
から/student/:username
今私は、これをハックリーな方法で達成しました。
私のLogin
コンポーネントでは、サードパーティAPIからのアクセストークンがExpressサーバからクライアントに返されたときに、ライフサイクルフックを使用してリスンしてアクションをディスパッチします。
import React from "react";
import LoginForm from "../minor/LoginForm";
const Login = React.createClass({
componentDidUpdate(){
const {success, access_token} = this.props.loginStatus;
if (success === true && access_token !== null){
console.log("It worked getting your data now...");
this.props.getUserData(access_token);
} else if (success === false || access_token === null){
console.log("Something went wrong...");
}
},
render(){
return(
<div className="loginComponentWrapper">
<h1>Slots</h1>
<LoginForm loginSubmit={this.props.loginSubmit}
router={this.props.router}
user={this.props.user} />
<a href="/register">New User?</a>
</div>
)
}
});
私はLoginForm
コンポーネントにrouter
とuser
を渡しています注意してください。
import React from "react";
const LoginForm = React.createClass({
componentDidUpdate(){
const {router, user} = this.props;
if (user.username !== null){
router.push(`/student/${user.username}`);
}
},
render(){
return(
<div className="loginWrapper">
<div className="loginBox">
<form className="loginForm" action="">
<input ref={(input) => this.username_field = input} type="text" placeholder="username" defaultValue="[email protected]" />
<input ref={(input) => this.password_field = input} type="text" placeholder="password" defaultValue="meowMeow3" />
<button onClick={this.loginAttempt}>Login</button>
</form>
</div>
</div>
)
}
});
確かに、それは動作しますが、私はこれがベストプラクティスと考えているものを過度に複雑なソリューションではない確信している:私はそうのようrouter
に.push
メソッドを使用します。ここで、私は別のcomponentDidUpdate
を使用するためにこれを行います。私はLogin
コンポーネント内にカスタムリスナーメソッドを追加しようとしましたが、私はそれが正常に発射されたことはありませんでしたが、代わりに私のアプリはループで立ち往生します。
Reduxを使用してこれを行うことができ、コンポーネントをより細かく保つ方法がありますか、より効率的な方法でcomponentDidUpdate
を利用できますか?
いつもと同じように、私は自分の問題についてもう少し経験豊かな方々に感謝し、いくつかのご意見をお待ちしております。
おかげ
UPDATE
App.js
import { bindActionCreators } from "redux";
import { connect } from "react-redux";
import * as actionCreators from "../actions/userActions.js";
import StoreShell from "./StoreShell.js";
function mapStateToProps(state){
return{
loginStatus: state.loginStatus,
user: state.user
}
}
function mapDispatchToProps(dispatch){
return bindActionCreators(actionCreators, dispatch)
}
const App = connect(mapStateToProps, mapDispatchToProps)(StoreShell);
export default App;
順番ににすべてのデータを渡すことStoreShell
という名前の私のコンテナコンポーネントには、このコンポーネント「振りかける」すべての私の再来のものと状態データをLogin
とLoginForm
のようなUIを構成する要素の小道具は多すぎますか?
import React from "react";
const StoreShell = React.createClass({
render(){
return(
<div className="theBigWrapper">
{React.cloneElement(this.props.children, this.props)}
</div>
)
}
})
export default StoreShell;
本当に私はreduxを採用し始めたと私はあなたがより良いreduxの目的を理解していると思うので、 。私は国家の一部としてURIが好きですし、それはスマートな練習だと思います。私はこのプロジェクトで 'redux-thunk'を使った経験があり、今私の利用を拡大します。ここにはすばらしいものがたくさんあります。あなたの徹底的な対応に感謝します。 1つの質問:なぜ 'connect'が' login'コンポーネントの一番下に 'mapStateToProps'と' mapDispatchToProps'と一緒に使われていますか?私はこれを「ログイン」の上の別のコンテナコンポーネントで行います。私はあなたにあなたの質問を更新します。 – m00saca
私はLoginContainerを 'connect'してくれました。それはそうするのに最適な場所ですから。ツリーの上位にある接続コンポーネントからログインアクションクリエータを小道具として渡すことは可能ですが、これは私には不必要な複雑さを加えるだけです。また、コンポーネントの再利便性が損なわれます。私。 LoginContainerが接続されている。サイト内の別の場所に別のログインコンポーネントを配置する場合は、それをインポートしてレンダリングするだけです。親コンポーネントが 'connect'を担当している場合、それを再利用するたびに、その親を接続する必要があります。 –
私のコンポーネントは、多くの小道具やディスパッチャで汚染されているので、これは意味があります。例えば、 'LoginForm'のための私のコンテナである' Login'はそのようなものです。この議論に基づいて、上の私の 'App.js'コンポーネントを取り除くことができるようです。 – m00saca