React入门(五)

2019-11-15  本文已影响0人  Leonard被注册了

SPA和MPA

路由

路由的两种实现方案

1.hash路由
       形式:http://www.xxx.com/#AA,真实项目中(前后端分离的项目:客户端渲染),我们经常使用的是哈希路由来完成的,它依据相同的页面地址,不同的哈希值,来规划当前页面中的哪一个组件呈现渲染,它基于原生JS构造了一套类似于history API的机制,每一次路由切换都是基于history stack完成的

class App extends React.Component {
    render() {
        return <div >
            <button onClick={ev => {
                window.location.href = window.location.href.replace(/#[a-z]+/ig, '') + '#AAA'
            }}>A</button>
            <button onClick={ev => {
                window.location.href = window.location.href.replace(/#[a-z]+/ig, '') + '#BBB'
            }}>B</button>
        </div >;
    }
}

2.browser路由
       基于History API中的pushState进行地址切换的时候,页面不刷新,地址也会改,监听到改变后实现组件的切换;但当手动刷新的时候,如果当前跳转的页面不存在,会报错,需要服务器对于不存在的页面做特殊的处理

class App extends React.Component {
    render() {
        return <div >
            <button onClick={ev => {
                window.history.pushState({},'PAGE','/AAA')
            }}>A</button>
            <button onClick={ev => {
                window.history.pushState({},'PAGE','/BBB')
            }}>B</button>
        </div >;
    }
}

React-router

// 1 导入组件
import { HashRouter, Link, Route, Switch } from 'react-router-dom'

// 2.使用HashRouter
<HashRouter>

  // 3 设置 Link / NavLink(设置后多添加一个class为active的属性)
  <Link to='/' exact>首页</Link>
  <NavLink to='/category'>分类</NavLink>
  <NavLink to='/pinWei' >品味</NavLink>

  // 4.设置路由
  // Switch确保匹配单个后不会继续匹配其他路由
  <Switch>
    // exact保证精确匹配
    <Route path='/' exact component={Home}></Route>
    <Route path='/category' component={Category}></Route>
    // 可以在component中传入回调函数进行路由验证
    <Route path='/pinWei' component={()=>{
        return <Pinwei />  
    }></Route>
    // render中一般进行“权限校验”
    <Route path='/pay' render={() => {
            let flag = localStorage.getItem('FLAG');
            if (flag && flag === 'SAFE') return <C/>;
            return '当前环境不安全,不利于支付';
        }} />
  </Switch>
</HashRouter>
import React from 'react';
import { withRouter } from 'react-router-dom';
function Header(props) {
    console.log(props);
    return <>
        公共头部
    </>;
}
export default withRouter(Header);
上一篇下一篇

猜你喜欢

热点阅读