最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • React路由,我想像Vue一样写中心化路由(静态路由)

    正文概述 掘金(林深鹿)   2021-04-05   753

    一、前言

    最近开始学习React的, 作为一只从Vue转世而来的React萌新,首当其冲的但就是对路由的执着了, Vue在路由这一块的中心化,以及父子路由用的太顺手了, 一下子接受不了React教程中的路由写法, 所以想在React中也实现中心化的路由。

    二、React推荐的路由写法

    教程可以看这里

    通过教程可以看出,首先React是建议在当前文件中非公用组件,通过React的React.createClass方法生成一个组件类,或者可以直接写成一个方法。

    // 组件类
    const Message = React.createClass({
      render() {
        return <h3>Message {this.props.params.id}</h3>
      }
    })
    // 直接写成函数, 上写成组件类的写法类似。
    const Index = function(){
        return (
            <React.fragment>
                <p></this is Index>
                <Link to="/about/>About</Link>
            </React.fragment>
        )
    }
    

    回到主题,React4开始,对路由进行了革命性的创新,让路由更符合React的“组件化”思想,从React3及之前的“中心化路由”(或称“静态”路由)改为“去中心化路由”(“动态路由”)。

    而我很头铁,就是想在React新版本也用“中心化路由”,理由是好管理,路由清晰。(其实就是有点脑子轴了)

    三、“中心化路由”写法

    其实最开始, 是没有认真看完教程,对React的“组件化”思想理解不是很透彻,认为“组件化”是开发者的事,而框架还是停留在Vue,所以选择了“中心化路由”写法。 写法也很简单,如下。

    // src/route.js
    import Home from './pages/index/index';
    import HomeNews from './pages/index/component/HomeNews';
    import My from './pages/my/my';
    
    const routes = [
      {
        path: "/my",
        component: My
      },{ // 路由是从新闻页的路由开始写的,首页默认显示的组件在下面,需要在首页文件中判断。
        path: "/",
        component: Home,
        children: [
          {
            path: "/news",
            component: HomeNews
          }
        ]
      }
    ]
    
    export {
      routes
    }
    
    // src/index.jsx
    import React from 'react';
    import ReactDOM from 'react-dom';
    import reportWebVitals from './reportWebVitals';
    
    import {routes} from './route';
    import {BrowserRouter} from 'react-router-dom';
    import {renderRoutes} from 'react-router-config';
    
    ReactDOM.render(
      (
        <BrowserRouter>
          {renderRoutes(routes)}
        </BrowserRouter>
      ),
      document.getElementById('root')
    );
    
    // If you want to start measuring performance in your app, pass a function
    // to log results (for example: reportWebVitals(console.log))
    // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
    reportWebVitals();
    

    看完上面的代码,应该有小伙伴会疑惑,我为什么把默认路由(“/”)写在最下面,是因为我先开发的个人中心吗?

    当然不是,是因为React路由匹配的原因。

    在React中,路由默认是模糊匹配的,如果我写在上面,会导致个人中心的路由优先匹配到首页路由。

    如果我给首页路由加上exact强匹配,会导致期望的父子组件无效

    所以把首页路由写在最下面是无奈之举。

    如果有小伙伴也希望在React中采用“中心化路由”的话,那么就需要考虑其中的取舍了,因为还有一个小细节,也是需要注意的。

    项目中, Web的首页通常是顶部(Header)不动,下面的内容区(Main)随导航栏动态切换。

    比如掘金,红框区域不会变更, 绿框部分随导航栏(首页路由)切换而动态加载。

    React路由,我想像Vue一样写中心化路由(静态路由)

    掘金的绿框部分只是类容不同,而工作中,许多项目的绿框(Main)部分是布局也大不相同的,包括后台管理平台也是如此。

    所以我在首页中加入了路由判断,以此来确认渲染那一部分的组件。

    // src/pages/index/index.jsx
    class index extends Component {
      constructor(props){
        super(props)
        this.state = {
          route: props.route
        }
      }
    
      // 判断用户访问地址,确认加载组件
      getPath(){ 
        let route = this.props.location.pathname
        return route === '/'
      }
    
      render() {
        const route = this.state.route;
        return (
          <div className={`${s['main']}`}>
            <HeaderTop />
            <div className="container">
             {/*默认路由时加载首页组件, 否则按路由加载组件*/}
              {this.getPath() ? <HomeMain /> : renderRoutes(route.children)}
            </div>
            <Footer />
          </div>
        );
      }
    }
    

    至此,基本就是我写的“中心化路由”的全部思路及细节了。

    四、总结

    如果此时你项目刚刚开始,只是在犹豫、或者寻找怎么在React中写“中心化路由”的话,我希望你能在看看这篇教程,好好理解下教程中路由的写法, 然后按照教程中的“去中心化路由”写法在React去写路由。

    或许你也觉得这种写法挺难受的,尤其是如果你也和我一样,刚刚从Vue转世过来,但我希望你能试着去接受它。

    但不是说你不能写“中心化路由”,当然可以的,这篇文章最详细讲的就是我怎么在React中写的“中心化路由”。 而“去中心化路由”按照官网的模式去写就可以了。


    起源地下载网 » React路由,我想像Vue一样写中心化路由(静态路由)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元