美文网首页
React入门(五)

React入门(五)

作者: Leonard被注册了 | 来源:发表于2019-11-15 18:56 被阅读0次

    SPA和MPA

    • SPA(Single-page Application)
      只有一个页面,所有需要展示的内容都在这一个页面中实现切换,WEBPACK中只需要配置一个入口即可(移动端单页面应用居多,PC端管理系统类也是单页面应用为主)
    • MPA(Multi-page Application)
      一个项目由很多页面组成,使用这个产品,主要就是页面之间的跳转(PC端多页面应用居多)。基于框架开发的时候,需要在WEBPACK中配置多入口,每一个入口对应一个页面
    • 二者区别
      MPA与SPA对比

    路由

    路由的两种实现方案

    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

    • 安装方式:$ yarn add react-rooter-dom
    • 相关资料:API学习文档
    • 使用方式
      1.导入路由组件
      2.使用HashRouter作为根容器(只能有一个子元素),包裹整个应用
      3.使用LinkNavLink作为链接地址,并指定to属性
      4.使用Route展示路由内容,并制定path属性,默认不是严格匹配,可以根据需求设置exact / strict / render进一步完善匹配规则
    // 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>
    
    • 受路由管控组件的三个属性
      1.history 实现路由跳转
      2.location 接收传递的参数信息
      3.match 存放路由地址匹配的信息
    • 路由传参
      1.问号传参props.history({path:'xxx',search:'?xxx=xxx'})
      2.隐性传参props.history({path:'xxx',state:{xxx:'xxx'}})
      3.路径传参<Route path='/detail/:id' component={Detail}></Route>
    • 非路由管控组件传参
      使用withRouter进行转换后,按路由管控组件的方式进行传参
    import React from 'react';
    import { withRouter } from 'react-router-dom';
    function Header(props) {
        console.log(props);
        return <>
            公共头部
        </>;
    }
    export default withRouter(Header);
    

    相关文章

      网友评论

          本文标题:React入门(五)

          本文链接:https://www.haomeiwen.com/subject/ptfsictx.html