react - router路由的使用

本文介绍了如何在React应用中使用`react-router`实现页面切换效果。首先讲解了如何安装`react-router`,并提供了官方学习资源。接着详细阐述了在`app.jsx`、`about.jsx`、`home.jsx`等组件中的应用。文章特别强调了`NavLink`组件的优化使用,并创建了自定义组件`MyNavLink.jsx`。此外,还讨论了路由嵌套、通过路由链接传递数据以及不同层级路由的实现,如在`message.jsx`中传递`id`到`detail.jsx`的`MessageDetail.jsx`组件。最后,文章提到了两种路由跳转方式,包括使用`history.push`和`history.replace`,以及利用`window.location`进行页面跳转。
摘要由CSDN通过智能技术生成

实现切换效果

1.静态组件

 

2.安装router

  npm install --save react-router

https://reacttraining.com/react-router/  路由学习的官网-很多案例

3.app.jsx

import React, {Component} from 'react'
import PropTypes from 'prop-types'
import {NavLink,Switch,Route,Redirect} from 'react-router-dom'

import About from '../views/about'
import Home from '../views/home'




export default class App extends Component{
   
   
    render(){
      
        return(
            <div>
               <h2>router  demo...</h2>
               <div className="container">
                   <div className="row">
                        <div className="col-md-2">
                            <div className="list-group">
                                 <NavLink className='list-group-item' to='/home'>Home</NavLink>
                                <NavLink className='list-group-item' to='/about'>About</NavLink>
                               
                            </div>
                        </div>
                        <div className="col-md-6">
                              <div className="panel">
                                 <div className="panel-body">
                                    <Switch>
                                        <Route path='/home' component={Home} />
                                        <Route path='/about' component={About} />
                                        <Redirect to='/home'/>
                                    </Switch>
                                 </div>
                              </div>
                        </div>
                   </div>
                
                 
               </div>
             
            </div>
        )
    }
}

4.about.jsx

import React,{Component} from 'react'
export default class About extends Component{
    render(){
        return(
            <div>about route Component</div>
        )
    }
}

4. home.jsx

import React,{Component} from 'react'
export default class Home extends Component{
    render(){
        return(
            <div>
                home react Component
            </div>
        )
    }
}

5. index.js

import React from 'react';
import {render} from 'react-dom';
import {BrowserRouter} from 'react-router-dom'

import './index.css';
import App from './components/app'
import * as serviceWorker from './service
React Router 提供了一些钩子函数来拦截路由,这样我们就可以在路由跳转之前或之后进行相关的操作。下面是一个简单的路由拦截示例: ```javascript import React from 'react'; import { BrowserRouter as Router, Route, Link, Redirect } from 'react-router-dom'; const isAuthenticated = true; const PrivateRoute = ({ component: Component, ...rest }) => ( <Route {...rest} render={(props) => ( isAuthenticated === true ? <Component {...props} /> : <Redirect to='/login' /> )} /> ); const LoginPage = () => ( <div> <h1>Login Page</h1> </div> ); const HomePage = () => ( <div> <h1>Home Page</h1> </div> ); const App = () => ( <Router> <div> <ul> <li><Link to='/'>Home</Link></li> <li><Link to='/login'>Login</Link></li> </ul> <hr /> <PrivateRoute exact path='/' component={HomePage} /> <Route path='/login' component={LoginPage} /> </div> </Router> ); export default App; ``` 在上面的代码中,我们定义了一个 `PrivateRoute` 组件来实现路由拦截。如果用户已经认证,则展示 `component` 组件,否则重定向到登录页面。 另外,我们还定义了两个页面组件:`HomePage` 和 `LoginPage`。在 `App` 组件中,我们使用 `PrivateRoute` 组件来保护 `HomePage` 组件,这样只有已经认证的用户才能访问该页面。 如果你想在路由跳转之前进行相关的操作,可以使用 `react-router` 提供的 `Prompt` 组件。下面是一个简单的示例: ```javascript import React, { useState } from 'react'; import { BrowserRouter as Router, Route, Link, Prompt } from 'react-router-dom'; const App = () => { const [isBlocking, setIsBlocking] = useState(false); const handleChange = (event) => { setIsBlocking(event.target.value.length > 0); }; return ( <Router> <div> <ul> <li><Link to='/'>Home</Link></li> <li><Link to='/about'>About</Link></li> </ul> <hr /> <Prompt when={isBlocking} message={location => `Are you sure you want to go to ${location.pathname}?`} /> <Route exact path='/' render={() => ( <div> <h1>Home Page</h1> <input type='text' onChange={handleChange} /> </div> )} /> <Route path='/about' render={() => ( <div> <h1>About Page</h1> </div> )} /> </div> </Router> ); }; export default App; ``` 在上面的代码中,我们使用 `Prompt` 组件来拦截路由,在用户输入内容时,如果尚未保存,就弹出提示框。提示框的内容可以通过 `message` 属性来设置。如果用户选择离开当前页面,则路由会跳转到目标页面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值