最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

react中路由和按需加載的問題

 更新時(shí)間:2022年08月08日 10:58:53   作者:努力的Frank  
這篇文章主要介紹了react中路由和按需加載的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

react路由和按需加載問題

1 基本的路由設(shè)置

react-router可以解決路由問題,只需要添加[基于react-router4.x]

yarn add react-router-dom

然后在index.js中引入它,使用:

import {Link,BrowserRouter,Switch, Route} from 'react-router-dom';
ReactDOM.render((
     <BrowserRouter>
          <Switch>
              <Route  path="/list" component={ListDemo}/>
              <Route  path="/a" component={A}/> 
              <Route  path="/b" component={B}/>
          </Switch> 
      </BrowserRouter>
),mountdom)

這樣就完成了路由的設(shè)置,而超鏈接則可以使用提供的Link組件

<Link to="/a">a</Link>

等價(jià)于直接寫<a href="/a">a</a>。

2 如何完成路由的菜單部分

在每個(gè)menu中傳一個(gè)url屬性,然后url代表那個(gè)地方被高亮,每個(gè)路由都重新創(chuàng)建一個(gè)menu即如下:

<BrowserRouter>
   <Switch>
     <Route exact path="/" render={props=><Menu {...props} url="list"><ListDemo/></SiderDemo>}/>
     <Route  path="/list" render={props=><Menu {...props} url="list"><ListDemo/></SiderDemo>}/>
     <Route  path="/a" render={props=><Menu {...props} url="a"><A/></SiderDemo>}/> 
     <Route  path="/b" render={props=><Menu {...props} url="b"><B/></SiderDemo>}/>
   </Switch> 
</BrowserRouter>

但是每個(gè)頁面的初次加載都會閃一下,重新加載了js。要想不閃則需要路由嵌套:

//上來路由只匹配到Menu中
      <BrowserRouter>
          <Switch>
            <Route  path="/" component={Menu}/>
          </Switch> 
      </BrowserRouter>
//上面的route就一個(gè)組件menu,在menu中再次定義route,可以實(shí)現(xiàn)路由嵌套
<Menu>
    <頂部></頂部>
    <側(cè)欄 selectedurl={this.props.location.pathname}>
    </側(cè)欄>
    <內(nèi)容部分>
         <Route exact path="/list" component={List}/>
         <Route exact path="/a" component={At}/>
         <Route exact path="/b" component={Bt}/>
    </內(nèi)容部分>
<Menu>

這里主要是利用了每個(gè)頁面都有的一個(gè)屬性即props.location.pathname是路由屬性

3 如何將每個(gè)路由的js文件分開輸出

1 多入口文件的形式,但是不易于按需加載,只能是實(shí)現(xiàn)了分開輸出,沒啥用。一般寫的都是單入口應(yīng)用。

2 異步import,或者require.ensure,然后在webpack中配置

    output:{
        filename:"[name]-bundle.js",
        chunkFilename: "[name]-chunk.js",
        path: __dirname+'/dist'
    },

這樣就生成一個(gè)bundle文件,多個(gè)chunk文件,name就是import的文件的名字,注意這里的注釋是有用的直接決定了chunk輸出的時(shí)候的[name]。

import(/* webpackChunkName: "app" */'./app').then(function(res){
    let xx= res.default;//xx就是app的export default
})

4 react-router按需加載配置

create-react-app創(chuàng)建的應(yīng)用執(zhí)行npm run eject進(jìn)行彈射。webpack中已經(jīng)有了上面3中的配置,是可以直接生成多個(gè)chunk文件的。

創(chuàng)建一個(gè)函數(shù)用于生成異步組件:

import React, { Component } from "react";
export default function asyncComponent(importComponent) {
  class AsyncComponent extends Component {
    constructor(props) {
      super(props);
      this.state = {
        component: null
      };
    }
    async componentDidMount() {
      const { default: component } = await importComponent();
      this.setState({
        component: component
      });
    }
    render() {
      const C = this.state.component;
      return C ? <C {...this.props} /> : null;
    }
  }
  return AsyncComponent;
}

改變組件引入方式之前是直接import現(xiàn)在改為

const List=asyncComponent(()=>import(/* webpackChunkName: "list" */"./router/List"))
const At=asyncComponent(()=>import(/* webpackChunkName: "a" */"./router/A"))
const Bt=asyncComponent(()=>import(/* webpackChunkName: "b" */"./router/B"))

渲染

<HashRouter>
  <Switch>
    <Route  path="/" component={SiderDemo}/>
  </Switch> 
</HashRouter>
class SiderDemo extends React.Component {
  render() {
    let selected=this.props.location.pathname.substring(1)
    if(selected==="")selected="list"
    return (
      <Layout>
        <Sider>
          <Menu defaultSelectedKeys={[selected]}>
           .........................
          </Menu>
        </Sider>
        <Layout>
          <Header></Header>
          <Content >
            <div>
                <Route exact path="/list" component={List}/>
                <Route exact path="/a" component={At}/>
                <Route exact path="/b" component={Bt}/>
                <Route exact path="/" component={List}/>
            </div>
          </Content>  
          <Footer></Footer>
        </Layout>
      </Layout>
    );
  }
}

5 最后效果

react路由的基本使用

1.先下包

react-router-dom@5.3.0   可以自己用npm yarn cnpm 進(jìn)行下載,我使用的是5.3.0版本

2.導(dǎo)入并使用

import { HashRouter as Router , Route, Link } from 'react-router-dom'
?
export default function App () {
? return (
? ? <div>
? ? ? <h1>react路由基本使用</h1>
? ? ? <Router>
? ? ? ? <Link to="/comment">評論</Link>
? ? ? ? <Link to="/search">搜索</Link>
?
? ? ? ? <Route path="/comment" component={Comment} />
? ? ? ? <Route path="/search" component={Search} />
? ? ? </Router>
? ? </div>
? )
}
ReactDom.render(<App />, document.getElementById('root'))

這樣就實(shí)現(xiàn)了一個(gè)簡易的點(diǎn)擊路由跳轉(zhuǎn)

3.使用HashRouter包裹整個(gè)應(yīng)用

(一個(gè)項(xiàng)目中只會有一個(gè) 我上面是經(jīng)過as改名之后的)

兩種常用 Router:HashRouter 和 BrowserRouter

  • HashRouter:使用 URL 的哈希值實(shí)現(xiàn)
  • 監(jiān)聽 window 的 hashchange 事件來實(shí)現(xiàn)的
  • BrowserRouter:使用 H5 的 history.pushState() API 實(shí)現(xiàn)
  • 監(jiān)聽 window 的 popstate 事件來實(shí)現(xiàn)的

4.使用Link指定導(dǎo)航鏈接

指定導(dǎo)航鏈接方式有兩種 分別是Link 和 NavLink

Link組件最終會渲染成a標(biāo)簽,用于指定路由導(dǎo)航

Link組件無法展示哪個(gè)link處于選中的效果

NavLink組件,可以用用于指定當(dāng)前導(dǎo)航高亮

(當(dāng)前組件被點(diǎn)擊時(shí) 會添加一個(gè) active 類,可以通過修改這個(gè)類 可以修改被選中是的樣式)

<NavLink to="/xxx" activeClassName="active">鏈接</NavLink>

5.使用Route指定路由規(guī)則(哪個(gè)路徑展示哪個(gè)組件)

默認(rèn)路由路徑匹配規(guī)則是: 模糊匹配規(guī)則

  • 只要pathname以path開頭就算匹配成功
  • 匹配成功就加載對應(yīng)組件;
  • 整個(gè)匹配過程是逐一匹配,一個(gè)匹配成功了,并不會停止匹配。

6.精確匹配 :exact

只有路徑完全一致才被匹配上

7.Switch

用Switch組件包裹多個(gè)Route組件。

在Switch組件下,不管有多少個(gè)Route的路由規(guī)則匹配成功,都只會渲染第一個(gè)匹配的組件

? ? ? ? <Switch>
? ? ? ? ? <Route path="/" exact component={Home} />
? ? ? ? ? <Route path="/article" component={Article} />
? ? ? ? ? <Route path="/article/123" component={ArticleDetail} />
? ? ? ? </Switch>

8.處理404頁 

思路: 不設(shè)置path屬性,將404頁對應(yīng)的路由放在switch內(nèi)部的最后位置

? ? ? ? <Switch>
? ? ? ? ? <Route path="/" exact component={Home} />
? ? ? ? ? <Route path="/article" component={Article} />
? ? ? ? ? <Route path="/article/123" component={ArticleDetail} />
? ? ? ? ? <Route component={Page404} />
? ? ? ? </Switch>

Redirect

<Redirect from="/" exact to="/comment" /> 當(dāng)精準(zhǔn)匹配到/ 時(shí) ,跳轉(zhuǎn)到comment路徑

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解React中的this指向

    詳解React中的this指向

    這篇文章主要介紹了React中的this指向的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用React,感興趣的朋友可以了解下
    2021-04-04
  • 教你在react中創(chuàng)建自定義hooks

    教你在react中創(chuàng)建自定義hooks

    簡單來說就是使用自定義hook可以將某些組件邏輯提取到可重用的函數(shù)中。 自定義hook是一個(gè)從use開始的調(diào)用其他hook的Javascript函數(shù),下面看下react中創(chuàng)建自定義hooks的相關(guān)知識,感興趣的朋友一起看看吧
    2021-11-11
  • 每天一個(gè)hooks學(xué)習(xí)之useUnmount

    每天一個(gè)hooks學(xué)習(xí)之useUnmount

    這篇文章主要為大家介紹了每天一個(gè)hooks學(xué)習(xí)之useUnmount,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 如何將你的AngularJS1.x應(yīng)用遷移至React的方法

    如何將你的AngularJS1.x應(yīng)用遷移至React的方法

    本篇文章主要介紹了如何將你的AngularJS1.x應(yīng)用遷移至React的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • React中style的使用及注意事項(xiàng)(推薦)

    React中style的使用及注意事項(xiàng)(推薦)

    React中style的使用和直接在HTML中使用有些不同,第一,React中必須是style="opacity:{this.state.opacity};"這種寫法,第二如果設(shè)置多個(gè)style格式如下,多個(gè)style中間使用逗號分割,這篇文章主要介紹了React中style的使用注意事項(xiàng),需要的朋友可以參考下
    2023-02-02
  • Electron打包React生成桌面應(yīng)用方法詳解

    Electron打包React生成桌面應(yīng)用方法詳解

    這篇文章主要介紹了React+Electron快速創(chuàng)建并打包成桌面應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-12-12
  • React Native從類組件到函數(shù)組件詳解

    React Native從類組件到函數(shù)組件詳解

    這篇文章主要介紹了React Native從類組件到函數(shù)組件方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • webpack打包react項(xiàng)目的實(shí)現(xiàn)方法

    webpack打包react項(xiàng)目的實(shí)現(xiàn)方法

    這篇文章主要介紹了webpack打包react項(xiàng)目的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • React?Server?Component混合式渲染問題詳解

    React?Server?Component混合式渲染問題詳解

    React?官方對?Server?Comopnent?是這樣介紹的:?zero-bundle-size?React?Server?Components,這篇文章主要介紹了React?Server?Component:?混合式渲染,需要的朋友可以參考下
    2022-12-12
  • ReactNative之FlatList的具體使用方法

    ReactNative之FlatList的具體使用方法

    本篇文章主要介紹了ReactNative之FlatList的具體使用方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11

最新評論

乡宁县| 会宁县| 广昌县| 马尔康县| 凤台县| 玛纳斯县| 上饶市| 天全县| 商河县| 铁岭县| 札达县| 濮阳县| 金寨县| 环江| 渝中区| 泗水县| 兴宁市| 九台市| 屏东市| 肥城市| 比如县| 呼伦贝尔市| 浙江省| 象州县| 全南县| 北流市| 广安市| 临汾市| 五河县| 临澧县| 阿勒泰市| 闽侯县| 苍溪县| 昌宁县| 抚松县| 徐汇区| 浦县| 内丘县| 龙泉市| 肥东县| 射阳县|