Reactルーター:再ルーティング時にログインデータ(小道具)を保持する方法

cDub

React Routerアプリを作成していて、認証を学んでいます。ここにいくつかの部分があります:

ログインコンポーネント(login.jsx)

  • バックエンドでユーザーの資格情報を認証します
  • ローカルストレージに認証トークンを設定します
  • 戻り値はユーザーのデータです
  • データで状態を設定します
  • 状態を管理コンポーネントに渡します

管理コンポーネント(admin.jsx)

  • プライベートルートで保護されています(privateroute.jsxを参照)
  • 基本的にコンテナコンポーネント
  • ユーザーのデータをに渡し、データを表示/編集する他のコンポーネントをレンダリングします

ナビゲーションバーの認証ボタン(authbutton.jsx)

  • ユーザーがログインしているかどうかを確認し、「ログイン」または「ログアウト」ボタンを表示します
  • ログインしている場合は、管理者にルーティングする「マイ投稿」ボタンも表示されます

ログインから管理者まですべてうまく機能します。私の問題は、管理者ページ(ホームページなど)から離れてクリックし、[投稿]ボタンをクリックすると、管理者に再ルーティングされ、ログインしていることを認識しますが、ユーザーのデータは利用できなくなります。以前は、ログインコンポーネントから、ユーザーのデータはにありましたthis.props.location.state.me

2つの異なるコンポーネントから管理者にルーティングしようとしているので、行き詰まりました。これまでに行ったことがありません。さらに、認証設定に欠けている解決策があるように感じます。

その他のアイデア:

ユーザーのデータが渡されたときに、条件付きで管理者に状態を設定する必要がありますか?

認証トークンを使用する場合と同じように、ブラウザのローカルストレージにデータを保存する必要がありますか?

Adminで状態を設定してデータをフェッチしようとしましたが、componentDidMount再レンダリングされなかったため、使用するために読み取りましたcomponentWillReceivePropsが、非推奨になり、に置き換えられていgetDerivedStateFromPropsます。それを理解できませんでした。

login.jsx

import React, { Component, Fragment } from 'react';
import * as userService from '../../services/user';
import { Redirect } from 'react-router-dom';
import IndeterminateProgress from '../utilities/indeterminateprogress';
import Nav from '../home/nav';

class Login extends Component {
    constructor(props) {
        super(props);
        this.state = {
            redirectToReferrer: false,
            email: '',
            password: '',
            feedbackMessage: '',
            checkingLogin: true,
            me: ''
        };
    }

    componentDidMount() {
        userService.checkLogin()
            .then((loggedIn) => {
                if (loggedIn) {
                    this.setState({ redirectToReferrer: true, checkingLogin: false });
                } else {
                    this.setState({ checkingLogin: false });
                }
            });
    }

    login(e) {
        e.preventDefault();
        userService.login(this.state.email, this.state.password)
            .then((meData) => {
                this.setState({ redirectToReferrer: true, me: meData })
            })  
            .catch((err) => {
                if (err.message) {
                    this.setState({ feedbackMessage: err.message });
                }
            });
    }

    handleEmailChange(value) {
        this.setState({ email: value });
    }

    handlePasswordChange(value) {
        this.setState({ password: value });
    }

    render() {
        const { from } = this.props.location.state || { from: { pathname: '/admin', state: { ...this.state } } };
        const { redirectToReferrer, checkingLogin } = this.state;

        if (checkingLogin) {
            return <IndeterminateProgress message="Checking Login Status..." />;
        }
        if (redirectToReferrer) {
            return (
                <Redirect to={from} />
            );
        }

        return (
            <Fragment>
                <Nav />
                <h2 className="heading center">Login to continue</h2>
                <form className="center" onSubmit={(e) => this.login(e)}>
                    <div className="form-group">
                        <input
                            placeholder="Email"
                            id="email"
                            className="col-3"
                            type="email"
                            onChange={(e) => this.handleEmailChange(e.target.value)}
                            required
                        />
                    </div>
                    <div className="form-group">
                        <input
                            placeholder="Password"
                            id="password"
                            className="col-3"
                            type="password"
                            onChange={(e) => this.handlePasswordChange(e.target.value)}
                            required
                        />
                    </div>
                    {this.state.feedbackMessage ? (
                        <p>{this.state.feedbackMessage}</p>
                    ) : null}
                    <input type="submit" value="Login" className="btn btn-info btn-sm" />
                </form>
            </Fragment>
        );
    }
}

export { Login };

admin.jsx

import React, { Component } from 'react';
import Nav from '../home/nav';
import AdminBlogContainer from './adminblogcontainer'
import { BrowserRouter as Router, Link } from 'react-router-dom';

const Admin = (props) => {
    return (
        <div className="flexcol center">
            <Nav />
            <h1 className="heading">Your Blog Posts</h1>
            <AdminBlogContainer {...props.location.state.me} />
            <Link to={{
                pathname: '/write',
                state: { ...props.location.state.me }
            }}
                className="btn btn-outline-secondary mt-4"
            >Create a New Blog Post</Link>
        </div>
    )
}

export { Admin };

privateroute.jsx

import React from 'react';
import { Route, Redirect } from 'react-router-dom';
import { isLoggedIn } from '../../services/user';

const PrivateRoute = (props) => {
    const Component = props.component;
    const propsToPass = Object.assign({}, props);
    delete propsToPass.component;

    return (
        <Route {...propsToPass} render={props => (
            isLoggedIn() ? (
                <Component {...props} />
            ) : (
                <Redirect to={{
                    pathname: '/login',
                    state: { from: props.location }
                }} />
            )
        )} />
    );
};

export { PrivateRoute }

authbutton.jsx

import React from 'react';
import { Link } from 'react-router-dom';
import { isLoggedIn } from '../../services/user';

const AuthButton = (props) => {
    if (isLoggedIn()) {
        return (
            <div>
                <Link className="btn btn-info m-1" to="/logout">Logout</Link>
                <Link className='btn btn-info m-1' to={{
                    pathname: '/admin',
                    // state: { ...this.state }
                }}
                    >My Posts</Link>
            </div>
        );
    } else {
        return (
            <div>
                <Link className="btn btn-info m-1" to="/login">Login</Link>
                <Link className="btn btn-info m-1" to="/register">Register</Link>
            </div>
        )
    }
};

export { AuthButton };
ケミコファゴースト

これが店舗づくりの理由のひとつです。これは、アプリケーション内のどこからでもアクセスできるグローバルオブジェクトと考えてください。

私は個人的にmobx / mobx-react(簡単で魔法のように物事を行う)を使用しましたが、reduxもあります

mobxを使用すると、次のようなことができます。

グローバルストア

// /stores/authentication.js
class AuthenticationStore {
   user = {};
   //authentication logic here
}
const authenticationStore = new AuthenticationStore();
export default authenticationStore;

ルートアプリコンポーネント

// /app.js
import authenticationStore from './stores/authentication';
import { Provider } from 'mobx-react';

export default class App extends Component {

  render(){
   return (
   <Provider authenticationStore={authenticationStore}>
      <BrowserRouter>
         <SomeComponent/>
      </BrowserRouter>
   <Provider>);
   }

}

一部のコンポーネント。

// /components/some.component.js
@inject('authenticationStore')
class SomeComponent extends Component {
    render(){
       const {authenticationStore} = this.props;
       const {user} = authenticationStore;
       render(
          <div>${user.name}</div>
       )
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

React-router:ルーティングされたパラメーターを小道具に変換するにはどうすればよいですか?

分類Dev

Reactルーター+ iis?ルーティングを有効にする方法

分類Dev

小道具なしでフローティング小道具警告に反応する

分類Dev

データバインディングasp.netチャートコントロール時にラベル値を設定する方法

分類Dev

dplyrチェーンでのフィルタリング時にベースデータフレームの行名を保持する方法

分類Dev

dplyrチェーンでのフィルタリング時にベースデータフレームの行名を保持する方法

分類Dev

dplyrチェーンでのフィルタリング時にベースデータフレームの行名を保持する方法

分類Dev

小道具のデータをテーブルに表示する

分類Dev

SQLServerのデータベースデータを1時間ごとにフィルタリングする方法

分類Dev

ルーターパスの小道具を反応させてコンポーネントをルーティングする

分類Dev

ログイン時にデータベースのプロファイルデータを表示する

分類Dev

NetgearN600ルーターでDNS要求をリダイレクト/再ルーティングする方法

分類Dev

React-redux:小道具をループしてコンポーネントにデータを入力する

分類Dev

ルーティング中にangular2でデータを保存する方法

分類Dev

react jsで渡される小道具データをリファクタリングする方法は?

分類Dev

データテーブルをフィルタリングする方法

分類Dev

コントロールを作成し、実行時にそのデータバインディングを定義する方法

分類Dev

グループでデータをフィルタリングし、空のグループを保持する

分類Dev

関数からグローバルコンテキストプロバイダーに小道具を渡す

分類Dev

再ログイン時にAndroidの通知データを処理する

分類Dev

Reactルーターのレンダリングが小道具を取得しない

分類Dev

Javascriptからロードされた画像にスタイルをターゲティング/適用する方法

分類Dev

インポート時にPythonモジュールを別のディレクトリ(サブバージョン)に再ルーティングする

分類Dev

Azure リソース グループで再デプロイ ボタンを使用するタイミング

分類Dev

Gmailのサインインユーザーに基づいてHTMLテーブルデータをフィルタリングする方法

分類Dev

ルーティング中にデータを保持する必要がありますか?

分類Dev

データをリロードせずにDataGridViewのコンテンツをフィルタリングする

分類Dev

プログラムでVisioでコネクタを再ルーティングする方法は?

分類Dev

Reactルーター4:ルート小道具をレイアウトコンポーネントに渡す

Related 関連記事

  1. 1

    React-router:ルーティングされたパラメーターを小道具に変換するにはどうすればよいですか?

  2. 2

    Reactルーター+ iis?ルーティングを有効にする方法

  3. 3

    小道具なしでフローティング小道具警告に反応する

  4. 4

    データバインディングasp.netチャートコントロール時にラベル値を設定する方法

  5. 5

    dplyrチェーンでのフィルタリング時にベースデータフレームの行名を保持する方法

  6. 6

    dplyrチェーンでのフィルタリング時にベースデータフレームの行名を保持する方法

  7. 7

    dplyrチェーンでのフィルタリング時にベースデータフレームの行名を保持する方法

  8. 8

    小道具のデータをテーブルに表示する

  9. 9

    SQLServerのデータベースデータを1時間ごとにフィルタリングする方法

  10. 10

    ルーターパスの小道具を反応させてコンポーネントをルーティングする

  11. 11

    ログイン時にデータベースのプロファイルデータを表示する

  12. 12

    NetgearN600ルーターでDNS要求をリダイレクト/再ルーティングする方法

  13. 13

    React-redux:小道具をループしてコンポーネントにデータを入力する

  14. 14

    ルーティング中にangular2でデータを保存する方法

  15. 15

    react jsで渡される小道具データをリファクタリングする方法は?

  16. 16

    データテーブルをフィルタリングする方法

  17. 17

    コントロールを作成し、実行時にそのデータバインディングを定義する方法

  18. 18

    グループでデータをフィルタリングし、空のグループを保持する

  19. 19

    関数からグローバルコンテキストプロバイダーに小道具を渡す

  20. 20

    再ログイン時にAndroidの通知データを処理する

  21. 21

    Reactルーターのレンダリングが小道具を取得しない

  22. 22

    Javascriptからロードされた画像にスタイルをターゲティング/適用する方法

  23. 23

    インポート時にPythonモジュールを別のディレクトリ(サブバージョン)に再ルーティングする

  24. 24

    Azure リソース グループで再デプロイ ボタンを使用するタイミング

  25. 25

    Gmailのサインインユーザーに基づいてHTMLテーブルデータをフィルタリングする方法

  26. 26

    ルーティング中にデータを保持する必要がありますか?

  27. 27

    データをリロードせずにDataGridViewのコンテンツをフィルタリングする

  28. 28

    プログラムでVisioでコネクタを再ルーティングする方法は?

  29. 29

    Reactルーター4:ルート小道具をレイアウトコンポーネントに渡す

ホットタグ

アーカイブ