Meteor アプリでmeteor-useraccountsパッケージをReactと統合しようとしています。私はかなり遠くまで来ましたがhistory.push()
、コールバック関数としてまたは同等のものを実装するのに苦労していますAccountsTemplate.logout()
-後者は、ユーザーをログアウトする方法が組み込まれています。
コールバック関数の構成は次のように行われます。
AccountsTemplates.configure({
onLogoutHook: myLogoutFunc
})
しかし、React.Component の「クラス」内でこれを行うことはできません。したがって、ブラウザの履歴を使用するコールバック関数を定義する必要がありますが、Components スコープの外側にあると思います。
サインイン/アウト ボタンを押す場合、次のような解決策を見つけました。
class LogInOutButton extends Component {
constructor(props) {
super(props);
this.state = {
loggedIn: Meteor.userId() ? true : false,
redirect: false
}
this.redirectToSignIn = this.redirectToSignIn.bind(this);
window.logInOutButton = this;
}
redirectToSignIn() {
if (!this.state.loggedIn && document.location.pathname !== "/signIn")
this.setState({redirect: <Redirect to="/signIn" />});
}
render() {
const { redirect } = this.state
return (
<li className="nav-item">
{redirect}
<a className="nav-link" href="#"
onClick={Meteor.userId() ? AccountsTemplates.logout : this.redirectToSignIn}>
{Meteor.userId() ? "Sign Out" : "Sign In"}
</a>
</li>
)
}
}
ご覧のとおり、たとえば、redirectToSignIn()
メソッドをグローバルウィンドウオブジェクトのメンバーにして、外部からメソッドを呼び出そうとしました。気分が悪く、どちらも機能しません:
var myLogoutFunc = () =>
window.logInOutButton.redirectToSignIn();
次のアプローチも試しました。
var myLogoutFunc = withRouter(({history}) =>
<div onLoad={history.push="/signIn"}>
</div>
)
ただし、これは機能しませんwithRouter
。コンポーネントがパラメーターとして必要なためです。少なくとも、これは私が次のエラーを説明しようとする方法です:
Exception in delivering result of invoking 'logout': TypeError: "props is undefined"
withRouter
モジュールでこれを読んだ後:
var withRouter = function withRouter(Component) {
var C = function C(props) {
...
これをどのように解決しますか?