React全家桶 - react-router (二)

react-router

import React from "react";
import {BrowserRouter, Link, Route, Switch, Redirect} from "react-router-dom";
import {connect} from 'react-redux'
import {login} from '../store/user.redux'

function Home(props) {
    return <div>
        <h3>課程列表</h3>
        <ul>
            <li><Link to="/detail/js">js</Link></li>
            <li><Link to="/detail/java">java</Link></li>
        </ul>
    </div>
}

// 傳遞進來的路由器對象
function Detail(props) {
    console.log(props)
    // 1, history: 導(dǎo)航指令
    // 2, match: 獲取參數(shù)信息
    // 3,location:當(dāng)前url信息
    return <div>
        <h3>當(dāng)前課程: {props.match.params.course}</h3>
        <button onClick={props.history.goBack}>返回</button>
    </div>
}

function About(props) {
    return <div>
        <h3>個人中心</h3>
        <div>
            <Link to="/about/me">個人信息</Link>
            <Link to="/about/order">訂單查詢</Link>
        </div>

        <Switch>
            <Route path="about/me" component={() => (<div>me</div>)}></Route>
            <Route path="about/order" component={() => (<div>order</div>)}></Route>
            // 默認重定向
            <Redirect to="/about/me"></Redirect>
        </Switch>

    </div>
}

function NoMatch({location}) {
    return <div>404, {location.pathname}不存在 </div>
}

// 路由守衛(wèi) (高階組件, 實際是對Route的封裝)
// 希望用法 <PrivateRoute component={About}  path="/about"  ... />
const PrivateRoute = connect(state => ({isLogin: state.user.isLogin}))(
    ({component: Comp, isLogin, ...rest}) => {
        // 做認證
        // render: 根據(jù)條件動態(tài)渲染
        return (
            // rest剩余的props ,props中包含了conponent,  conponent優(yōu)先級會高于 render
            <Route {...rest} render={props => isLogin ? (<Comp/>) : (
                <Redirect to={{pathname: "/login", state: {redirect: props.location.pathname}}}/>)}/>
        )
    }
)

// function PrivateRoute({component: Comp, isLogin, ...rest}) {
//     // 做認證
//     // render: 根據(jù)條件動態(tài)渲染
//     return (
//         <Route {...rest} render={props => isLogin ? (<Comp/>) : (
//             <Redirect to={{pathname: "/login", state: {redirect: props.location.pathname}}}/>)}/>
//     )
// }

//登錄組件
const Login = connect(state => ({isLogin: state.user.isLogin, loading: state.user.isLogin}, {login: login}))
(({location, isLogin, login, loading}) => {
    const redirect = location.state.redirect || '/'
    if (isLogin) {
        return <Redirect to={redirect}/>
    }
    return (
        <div>
            <p>用戶登錄</p>
            <hr/>
            <button onClick={login} disabled={loading}>{loading ? '登錄中...' : '登錄'}</button>
        </div>
    )
})
// function Login({location, isLogin, login}) {
//     const redirect = location.state.redirect || '/'
//     if (isLogin) {
//         return <Redirect to={redirect}/>
//     }
//     return (
//         <div>
//             <p>用戶登錄</p>
//             <hr/>
//             <button onClick={login}>登錄</button>
//         </div>
//     )
// }

export default function RouterSample() {
    return <div>
        <BrowserRouter>
            <div>
                {/*導(dǎo)航鏈接*/}
                <ul>
                    <li>
                        <Link to="/">首頁</Link>
                        <Link to="/about">關(guān)于</Link>
                    </li>
                </ul>

                {/*路由配置: 路由既組件*/}
                {/*路由匹配默認是包容性質(zhì)*/}
                <Switch>
                    <Route exact path='/' component={Home}></Route>
                    <PrivateRoute path='/about' component={About}></PrivateRoute>
                    <Route path='/login' component={Login}></Route>
                    <Route path='/detail/:course' component={Detail}> </Route>
                    // 404沒有path, 必然匹配
                    <Route component={NoMatch}></Route>
                </Switch>
            </div>
        </BrowserRouter>
    </div>
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容