質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

523閲覧

react-routerでのログイン処理について

gion1192

総合スコア12

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2018/06/21 14:55

react-routerでログイン処理を行いたい

現在react-routerにてログイン処理を実装しております。
下記のような形式で、ルートへのリクエストでAuthコンポーネントにアクセスし、
ログイン済みならTodoListコンポーネント、
ログインが未処理であればLoginコンポーネントにリダイレクトをしたいと考えております。
また全てのリクエストに共通でHeaderコンポーネントを表示したいです。

現在作成中のソースコード

javascript

1 2class App extends Component { 3render() { 4 return ( 5 <div className="App"> 6 <Header /> 7 <Switch> 8 <Route exact path="/" component={Auth} /> 9 <Route path="/login" component={Login} /> 10 </Switch> 11 </div> 12 ); 13 } 14} 15 16class Auth extends Component { 17 render() { 18 return( 19            //loggedはログインのフラグです。 20 this.props.logged ? 21 <Switch> 22 <Route exact path="/" component={TodoList} /> 23 </Switch> : 24 <Redirect 25 to={{ 26 pathname: "/login", 27 state: { from: this.props.location } 28 }} 29 /> 30 ); 31 } 32} 33 34class Login extends Component { 35 render() { 36 return( 37 <div> 38                ログイン画面 39 </div> 40 ); 41 } 42} 43

この形式ですと、直接"/login"URLにアクセスした場合はLoginコンポーネントが表示されますが、リダイレクト後ではHeaderコンポーネントのみしか表示がされません。
ルーティングの記載方法に誤りはありますでしょうか。
どうぞ宜しくお願い致します。

補足情報(FW/ツールのバージョンなど)

"react-router-dom": "^4.3.0-rc.3",

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

掲載されているコードが全ての必要なコードを含んでいないので、コードを実行して動作確認することが出来ません。

なので、代わりに簡易的なコードを書いてみたので参考までに置いておきます。

※ ログイン状態のようなアプリケーション全体にまたがる状態はReduxなどで管理したいところですが、とりあえず、簡易的にpropsの橋渡しで書いてみました。

イメージ説明
アニメーションGIF

デモコード

https://codesandbox.io/s/r4wv8lnyv4

  • ログインボタンを押すとログイン状態に切り替わり、メンバーページを表示可能になる。
  • ログアウト状態の場合は、メンバーページにアクセスしてもHomeにリダイレクトされる。
import React, { Component } from "react"; import ReactDOM from "react-dom"; import { BrowserRouter, Route, Switch, Redirect, Link } from 'react-router-dom'; const Header = (props) => <div>Header</div> const Home = ({ authenticate, isLoggedIn }) => { return ( <div> <div> <p>You are now {isLoggedIn ? 'logged in!' : 'logged out!'}</p> <button onClick={authenticate}> { isLoggedIn ? 'Log out' : 'Log in'} </button> </div> <nav> <ul> <li><Link to='/member'>Member Page</Link></li> </ul> </nav> </div> ) } const requireAuthentication = (WrappedComponent) => { return class EnhancedComponent extends Component { render() { if (this.props.isLoggedIn === false) { return <Redirect to={'/'} /> } return <WrappedComponent { ...this.props } /> } } } const MemberPage = () => <h1>Member Page</h1> const ProtectedMemberPage = requireAuthentication(MemberPage); class App extends Component { state = { isLoggedIn: false } handleLogin = () => { this.setState((prevState) => { return { isLoggedIn: !prevState.isLoggedIn } }) } render() { return ( <div className="App"> <Header /> <BrowserRouter> <Switch> <Route exact path="/" render={(props) => <Home isLoggedIn={this.state.isLoggedIn} authenticate={this.handleLogin} />} /> <Route path="/member" render={(props) => <ProtectedMemberPage isLoggedIn={this.state.isLoggedIn} {...props} />} /> </Switch> </BrowserRouter> </div> ); } } ReactDOM.render( <App />, document.getElementById("root") );

投稿2018/06/21 22:17

編集2018/06/21 22:18
HayatoKamono

総合スコア2415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gion1192

2018/06/22 11:23

ご回答ありがとうございました。 Router内にHeaderコンポーネントを含んでいたことがエラーの原因でした。 大変参考になりましたm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問