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

React router動(dòng)態(tài)加載組件之適配器模式的應(yīng)用詳解

 更新時(shí)間:2018年09月12日 08:18:19   作者:我是leon  
這篇文章主要介紹了React router動(dòng)態(tài)加載組件之適配器模式的應(yīng)用 ,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

前言

本文講述怎么實(shí)現(xiàn)動(dòng)態(tài)加載組件,并借此闡述適配器模式。

一、普通路由例子

import Center from 'page/center';
import Data from 'page/data';

function App(){
 return (
  <Router>
   <Switch>
   <Route exact path="/" render={() => (<Redirect to="/center" />)} />
   <Route path="/data" component={Data} />
   <Route path="/center" component={Center} />
   <Route render={() => <h1 style={{ textAlign: 'center', marginTop: '160px', color:'rgba(255, 255, 255, 0.7)' }}>頁面不見了</h1>} />
   </Switch>
  </Router>
 );
}

以上是最常見的React router。在簡(jiǎn)單的單頁應(yīng)用中,這樣寫是ok的。因?yàn)榇虬蟮膯我籮s文件bundle.js也不過200k左右,gzip之后,對(duì)加載性能并沒有太大的影響。

 但是,當(dāng)產(chǎn)品經(jīng)歷多次迭代后,追加的頁面導(dǎo)致bundle.js的體積不斷變大。這時(shí)候,優(yōu)化就變得很有必要。

二、如何優(yōu)化

優(yōu)化使用到的一個(gè)重要理念就是——按需加載。

可以結(jié)合例子進(jìn)行理解為:只加載當(dāng)前頁面需要用到的組件。

比如當(dāng)前訪問的是/center頁,那么只需要加載Center組件即可。不需要加載Data組件。

業(yè)界目前實(shí)現(xiàn)的方案有以下幾種:

•react-router的動(dòng)態(tài)路由getComponent方法(router4已不支持)
•使用react-loadable小工具庫
•自定義高階組件進(jìn)行按需加載

而這些方案共通的點(diǎn),就是利用webpack的code splitting功能(webpack1使用require.ensure,webpack2/webpack3使用import),將代碼進(jìn)行分割。

接下來,將介紹如何用自定義高階組件實(shí)現(xiàn)按需加載。

三、自定義高階組件

3.1 webpack的import方法

webpack將import()看做一個(gè)分割點(diǎn)并將其請(qǐng)求的module打包為一個(gè)獨(dú)立的chunk。import()以模塊名稱作為參數(shù)名并且返回一個(gè)Promise對(duì)象。

因?yàn)閕mport()返回的是Promise對(duì)象,所以不能直接給<Router/>使用。

3.2 采用適配器模式封裝import()

適配器模式(Adapter):將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。

當(dāng)前場(chǎng)景,需要解決的是,使用import()異步加載組件后,如何將加載的組件交給React進(jìn)行更新。
 方法也很容易,就是利用state。當(dāng)異步加載好組件后,調(diào)用setState方法,就可以通知到。
 那么,依照這個(gè)思路,新建個(gè)高階組件,運(yùn)用適配器模式,來對(duì)import()進(jìn)行封裝。

3.3 實(shí)現(xiàn)異步加載方法asyncComponent

import React from 'react';
export const asyncComponent = loadComponent => (
 class AsyncComponent extends React.Component {
  constructor(...args){
   super(...args);
   this.state = {
    Component: null,
   };
   this.hasLoadedComponent = this.hasLoadedComponent.bind(this);
  }
  componentWillMount() {
   if(this.hasLoadedComponent()){
    return;
   }
   loadComponent()
    .then(module => module.default ? module.default : module)
    .then(Component => {
     this.setState({
      Component
     });
    })
    .catch(error => {
     /*eslint-disable*/
     console.error('cannot load Component in <AsyncComponent>');
     /*eslint-enable*/
     throw error;
    })
  }
  hasLoadedComponent() {
   return this.state.Component !== null;
  }
  render(){
   const {
    Component
   } = this.state;
   return (Component) ? <Component {...this.props} /> : null;
  }
 }
);
// 使用方式
const Center = asyncComponent(()=>import(/* webpackChunkName: 'pageCenter' */'page/center'));

如例子所示,新建一個(gè)asyncComponent方法,用于接收import()返回的Promise對(duì)象。

當(dāng)componentWillMount時(shí)(服務(wù)端渲染也有該生命周期方法),執(zhí)行import(),并將異步加載的組件,set入state,觸發(fā)組件重新渲染。

3.4 釋疑

•state.Component初始化

this.state = {
 Component: null,
};

這里的null,主要用于判斷異步組件是否已經(jīng)加載。

•module.default ? module.default : module

這里是為了兼容具名和default兩種export寫法。

•return (Component) ? <Component {...this.props} /> : null;

這里的null,其實(shí)可以用<LoadingComponent />代替。作用是:當(dāng)異步組件還沒加載好時(shí),起到占位的作用。
this.props是通過AsyncComponent組件透?jìng)鹘o異步組件的。

3.5 修改webpack構(gòu)建

output: {
 path: config.build.assetsRoot,
 filename: utils.assetsPath('js/[name].[chunkhash].js'),
 chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
}

在輸出項(xiàng)中,增加chunkFilename即可。

四、小結(jié)

自定義高階組件的好處,是可以按最少的改動(dòng),來優(yōu)化已有的舊項(xiàng)目。

像上面的例子,只需要改變import組件的方式即可?;ㄗ钌俚拇鷥r(jià),就可以得到頁面性能的提升。

 其實(shí),react-loadable也是按這種思路去實(shí)現(xiàn)的,只不過增加了很多附屬的功能點(diǎn)而已。

以上所述是小編給大家介紹的React router動(dòng)態(tài)加載組件之適配器模式的應(yīng)用,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • React組件三大屬性之state,props,refs

    React組件三大屬性之state,props,refs

    這篇文章主要介紹了React組件三大屬性之state,props,refs,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • Next.js搭建Monorepo組件庫文檔實(shí)現(xiàn)詳解

    Next.js搭建Monorepo組件庫文檔實(shí)現(xiàn)詳解

    這篇文章主要為大家介紹了Next.js搭建Monorepo組件庫文檔,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • React 自動(dòng)聚焦字段使用詳解

    React 自動(dòng)聚焦字段使用詳解

    這篇文章主要為大家介紹了React 自動(dòng)聚焦字段使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • react路由守衛(wèi)的實(shí)現(xiàn)(路由攔截)

    react路由守衛(wèi)的實(shí)現(xiàn)(路由攔截)

    react不同于vue,通過在路由里設(shè)置meta元字符實(shí)現(xiàn)路由攔截。本文就詳細(xì)的介紹一下,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 深入淺析React refs的簡(jiǎn)介

    深入淺析React refs的簡(jiǎn)介

    React中的Refs提供了一種方式,允許我們?cè)L問DOM節(jié)點(diǎn)或在render方法中創(chuàng)建的React元素,本文給大家介紹react refs的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2021-07-07
  • react通過組件拆分實(shí)現(xiàn)購物車界面詳解

    react通過組件拆分實(shí)現(xiàn)購物車界面詳解

    這篇文章主要介紹了react通過組件拆分來實(shí)現(xiàn)購物車頁面的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 詳解React Native 采用Fetch方式發(fā)送跨域POST請(qǐng)求

    詳解React Native 采用Fetch方式發(fā)送跨域POST請(qǐng)求

    這篇文章主要介紹了詳解React Native 采用Fetch方式發(fā)送跨域POST請(qǐng)求,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • React JSX基礎(chǔ)語法教程示例

    React JSX基礎(chǔ)語法教程示例

    這篇文章主要為大家介紹了React JSX基礎(chǔ)語法教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • react入門級(jí)詳細(xì)筆記

    react入門級(jí)詳細(xì)筆記

    這篇文章講述了React的基本介紹,基本使用和React相關(guān)js庫.通過這篇文章可以入門React的使用,可以快速上手使用React進(jìn)行代碼的編寫
    2021-06-06
  • React之使用useState異步刷新的問題

    React之使用useState異步刷新的問題

    這篇文章主要介紹了React之使用useState異步刷新的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03

最新評(píng)論

兴城市| 玛沁县| 霍山县| 临高县| 泰顺县| 绥中县| 乌兰县| 茌平县| 鹿邑县| 新宁县| 昆山市| 孙吴县| 朔州市| 大同市| 龙陵县| 灵璧县| 拜城县| 广州市| 延川县| 白水县| 韶山市| 环江| 郓城县| 安丘市| 湘潭市| 淮阳县| 玉山县| 靖江市| 鞍山市| 吉水县| 准格尔旗| 永泰县| 界首市| 承德市| 德化县| 海阳市| 延长县| 台东县| 鹤岗市| 井冈山市| 闽清县|