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

詳解react-router4 異步加載路由兩種方法

 更新時間:2017年09月12日 11:45:53   作者:little_ab  
本篇文章主要介紹了詳解react-router4 異步加載路由兩種方法 ,具有一定的參考價值,有興趣的可以了解一下

方法一:我們要借助bundle-loader來實現按需加載。

首先,新建一個bundle.js文件:

import React, { Component } from 'react'

export default class Bundle extends React.Component {

  state = {
    // short for "module" but that's a keyword in js, so "mod"
    mod: null
  }

  componentWillMount() {
    this.load(this.props)
  }

  componentWillReceiveProps(nextProps) {
    if (nextProps.load !== this.props.load) {
      this.load(nextProps)
    }
  }

  load(props) {
    this.setState({
      mod: null
    })
    props.load((mod) => {
      this.setState({
        // handle both es imports and cjs
        mod: mod.default ? mod.default : mod
      })
    })
  }

  render() {
    if (!this.state.mod)
      return false
    return this.props.children(this.state.mod)
  }
}

然后,在入口處使用按需加載:

// ...

// bundle模型用來異步加載組件
import Bundle from './bundle.js';

// 引入單個頁面(包括嵌套的子頁面)
// 同步引入
import Index from './app/index.js';
// 異步引入
import ListContainer from 'bundle-loader?lazy&name=app-[name]!./app/list.js';

const List = () => (
  <Bundle load={ListContainer}>
    {(List) => <List />}
  </Bundle>
)

// ...

  <HashRouter>
    <Router basename="/">
      <div>
        <Route exact path="/" component={Index} />
        <Route path="/list" component={List} />
      </div>
    </Router>
  </HashRouter>

// ...


webpack.config.js文件配置
output: {
  path: path.resolve(__dirname, './output'),
  filename: '[name].[chunkhash:8].bundle.js',
  chunkFilename: '[name]-[id].[chunkhash:8].bundle.js',
},

方法二:用原生的

Webpack 配置

首先在 webpack.config.js 的 output 內加上 chunkFilename

output: {
  path: path.join(__dirname, '/../dist/assets'),
  filename: 'app.js',
  publicPath: defaultSettings.publicPath,
  // 添加 chunkFilename
  chunkFilename: '[name].[chunkhash:5].chunk.js',
},

name 是在代碼里為創(chuàng)建的 chunk 指定的名字,如果代碼中沒指定則 webpack 默認分配 id 作為 name。

chunkhash 是文件的 hash 碼,這里只使用前五位。

在路由頁面

這里寫的是舊的沒按需要加載的路由寫法

ReactDOM.render(
 (
  <Router history={browserHistory}>
   {/* 主頁 */}
   <Route path="/" component={App}>
    {/* 默認 */}
    <IndexRoute component={HomePage} />

    {/* baidu */}
    <Route path="/baidu" component={BaiduPage}>
     <Route path="result" component={BaiduResultPage} />
     <Route path="frequency" component={BaiduFrequencyPage} />
    </Route>

    {/* 404 */}
    <Route path='/404' component={NotFoundPage} />
    
    {/* 其他重定向到 404 */}
    <Redirect from='*' to='/404' />
   </Route>
  </Router>
 ), document.getElementById('app')
);

我們需要讓路由動態(tài)加載組件,需要將 component 換成 getComponent

ReactDOM.render(
 (
  <Router history={browserHistory}>
   {/* 主頁 */}
   <Route path="/" component={App}>
    {/* 默認 */}
    <IndexRoute component={HomePage} />

    {/* baidu */}
    <Route path="/baidu"
          getComponent(nextState, cb) 
          { require.ensure([], (require) => { cb(null, require('components/layer/HomePage')) }, 'HomePage')}>
     <Route path="result"   getComponent... />
     <Route path="frequency" getComponent... />
    </Route>
    {/* 404 */}
    <Route path='/404' getComponent... />
    {/* 其他重定向到 404 */}
    <Redirect path='*' onEnter: (_, replaceState) => replaceState(null, "/404") />
   </Route>
  </Router>
 ), document.getElementById('app')
);

getComponent

對應于以前的 component 屬性,但是這個方法是異步的,也就是當路由匹配時,才會調用這個方法。

這里面有個 require.ensure 方法

require.ensure(dependencies, callback, chunkName)

這是 webpack 提供的方法,這也是按需加載的核心方法。第一個參數是依賴,第二個是回調函數,第三個就是上面提到的 chunkName,用來指定這個 chunk file 的 name。

如果需要返回多個子組件,則使用 getComponents 方法,將多個組件作為一個對象的屬性通過 cb 返回出去即可。這個在官方示例也有,但是我們這里并不需要,而且根組件是不能返回多個子組件的,所以使用 getComponent。 

當改寫之后,我們需要把這個重定向的路由單獨拆出來,也就是 * 這個路由,我們上面已經為他創(chuàng)建了一個 redirect 目錄。這里使用到 onEnter 方法,然后在這個方法里改變路由狀態(tài),調到另外的路由,實現 redirect :

/redirect/index.js

module.exports = {
 path: '*',
 onEnter: (_, replaceState) => replaceState(null, "/404")
}

The root route must render a single element

跟著官方示例和上面碼出來之后,可能頁面并沒有渲染出來,而是報 The root route must render a single element 這個異常,這是因為 module.exports 和 ES6 里的 export default 有區(qū)別。

如果你是使用 es6 的寫法,也就是你的組件都是通過 export default 導出的,那么在 getComponent 方法里面需要加入.default。

getComponent(nextState, cb) {
  require.ensure([], (require) => {
   // 在后面加 .default
   cb(null, require('components/layer/ReportPage')).default
  }, 'ReportPage')
}

如果你是使用 CommonJS 的寫法,也就是通過 module.exports 導出的,那就無須加 .default 了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • React Grid Layout基礎使用示例教程

    React Grid Layout基礎使用示例教程

    React Grid Layout是一個用于在React應用程序中創(chuàng)建可拖拽和可調整大小的網格布局的庫,通過使用React Grid Layout,我們可以輕松地創(chuàng)建自適應的網格布局,并實現拖拽和調整大小的功能,本文介紹了React Grid Layout的基礎使用方法,感興趣的朋友一起看看吧
    2024-02-02
  • react中使用video.js的踩坑記錄

    react中使用video.js的踩坑記錄

    這篇文章主要介紹了react中使用video.js的踩坑記錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 詳解react使用react-bootstrap當輪子造車

    詳解react使用react-bootstrap當輪子造車

    本篇文章主要介紹了詳解react使用react-bootstrap當輪子造車,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-08-08
  • react router 4.0以上的路由應用詳解

    react router 4.0以上的路由應用詳解

    本篇文章主要介紹了react router 4.0以上的路由應用詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • react hook使用useState更新數組,無法更新問題及解決

    react hook使用useState更新數組,無法更新問題及解決

    這篇文章主要介紹了react hook使用useState更新數組,無法更新問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • react PropTypes校驗傳遞的值操作示例

    react PropTypes校驗傳遞的值操作示例

    這篇文章主要介紹了react PropTypes校驗傳遞的值操作,結合實例形式分析了react PropTypes針對傳遞的值進行校驗操作相關實現技巧,需要的朋友可以參考下
    2020-04-04
  • React實現生成和導出Word文檔的方法詳解

    React實現生成和導出Word文檔的方法詳解

    React是一個流行的JavaScript庫,用于構建現代前端應用程序,本文將深入探討如何在React中生成和導出Word文檔,感興趣的小伙伴可以學習一下
    2023-09-09
  • react使用CSS實現react動畫功能示例

    react使用CSS實現react動畫功能示例

    這篇文章主要介紹了react使用CSS實現react動畫功能,結合實例形式分析了react使用CSS實現react動畫功能具體步驟與實現方法,需要的朋友可以參考下
    2020-05-05
  • 解讀useState第二個參數的"第二個參數"

    解讀useState第二個參數的"第二個參數"

    這篇文章主要介紹了useState第二個參數的"第二個參數",具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • React性能debug場景解決記錄

    React性能debug場景解決記錄

    這篇文章主要為大家介紹了React性能debug場景解決記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05

最新評論

江口县| 明水县| 泸西县| 宜昌市| 新竹县| 瑞昌市| 合江县| 夏邑县| 邹城市| 汝州市| 化德县| 改则县| 清流县| 穆棱市| 电白县| 阿尔山市| 青州市| 阿尔山市| 石泉县| 西和县| 华安县| 隆昌县| 城固县| 新绛县| 法库县| 新田县| 大洼县| 绥滨县| 广水市| 易门县| 宣威市| 揭西县| 内江市| 郓城县| 黑山县| 巴彦淖尔市| 溧阳市| 锦州市| 巩留县| 南澳县| 齐齐哈尔市|