React路由

路由模式(2种)

hash

改变地址 -> push     ->  window.location.hash=
         -> replace  -> window.location.replace(url)
hashchange

browser/history

改变地址 -> pushstate  -> window.history.pushState({}, `这是标题`, this.getAttribute('href'));
        ->  replacestate  -> window.history.replaceState({}, `这是标题`, this.getAttribute('href'));
popState
1、react-router-dom

web前段用的

Switch
// 只显示匹配的第一个子路由,然后就不往下匹配了


// 当route不给path属性是会匹配路由
<Route component={()=><h1>未匹配路由</h1>}/>

// redirect不给from属性是也会匹配任意匹配
<Redirect exact to='/index'></Redirect>

引入
import {
    HashRouter as Router,   // 使用哈希版本
    Link,   // 相当于vue的router-link
    Redirect,  // 改变重定向
    Route   // 相当于vue的router-view
} from 'react-router-dom';

render(){
        return 
            <Router>
                <Fragment>
                    <Switch>
                            // 占位标签,如果path与当前路径匹配,渲染component
                            // exact表示精准匹配,当path与当前路径一模一样才匹配
                        <Route exact path="/index" component={()=><h1>我是首页</h1>}/>
                        <Route path="/taobao" component={()=><h1>我是淘宝</h1>}/>
                    </Switch>
                    <footer>
                        // 导航标签 to属性声明要跳转的路径
                        <Link to="/index">首页</Link>
                        <Link to="/taobao">淘宝</Link>
                        <Redirect exact from="/" to="/index"></Redirect>
                    </footer>
                </Fragment>
            </Router>
    }
2、react-router-native

native用的

3、HashRouter

哈希模式(#) 只存在浏览器端,服务器会忽略

瞄点:不会刷新浏览器,跳转页面

4、BrowserRouter

浏览器模式(localhost:3000/tab) // 假的url,伪地址

5、后退

  • window.history.go(-1)
  • window.history.back()
<button onClick={()=>{
    window.history.back()
}}>
    后退
</button>

6、路由的封装(一级路由)
index.js


import React from 'react';
import ReactDOM from 'react-dom';
import {HashRouter as Router} from 'react-router-dom';

// 封装的类似于router-view的文件
import RouterView from './react/reactView';
// 路由配置
import config from './react/react.config';

ReactDOM.render(<Router>
    <RouterView routes={config.routes}></RouterView>
</Router>,document.getElementById('root'));

react/reactView.jsx

import React from 'react';
import {Switch,Route,Redirect} from 'react-router-dom';

export default (props)=>{
    return <Switch>{
        props.routes.map((item,index)=>{
            return <Route key={index} path={item.path} render={(props)=>{
                if(item.children){
                    // 渲染组件
                    // ...props 展开路由信息传递下去
                    // item.children 把子路由配置传递下去
                    return <item.component {...props} routes={item.children}/>
                }else{
                    return <item.component {...props}/>
                }
            }}></Route>
        })
    }
    <Redirect exact from='/' to='/tab'></Redirect>
    </Switch>
}

react/react.config.js


// 一级路由
import Tab from '../components/Tab.jsx';
import Detail from '../components/Detail.jsx';

// 二级路由
import Hot from '../components/include/Hot.jsx';
import Movie from '../components/include/Movie.jsx';
import My from '../components/include/My.jsx';

export default{
    routes:[
        {
            path:'/tab',
            component:Tab,
            children:[
                {
                    path:'/tab/hot',
                    component:Hot
                }, {
                    path:'/tab/movie',
                    component:Movie
                }, {
                    path:'/tab/my',
                    component:My
                }
            ]
        },{
            path:'/detail',
            component:Detail
        }
    ]
}

components/Tab.js

import React,{Component} from 'react';
import {NavLink} from 'react-router-dom';

class Detail extends Component{
    constructor(props){
        super(props)
    }

    render(){
        return <div>
            <footer>
                <NavLink to="/tab/hot">热映</NavLink>
                <NavLink to="/tab/movie">电影</NavLink>
                <NavLink to="/tab/my">我的</NavLink>
            </footer>
        </div>
    }
}

export default Detail;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值