由于React Router 4.0已经正式发布,所以该博文分React Router 和 React Router 4.0 进行分类讨论!该博文会持续更新中,欢迎大家一起讨论与补充!

我相信用过react一般都用过react-router,那就很有必要说说用react-router实现的一些常用功能了,比如组件按需加载、用户登录验证、刷新当前路由。。。在这篇文章中,我将列出一些react-router使用小技巧,希望每个读者都能至少从中学到一个有用的技巧!

一、按需加载

React Router:使用 getComponent + require.ensure 实现按需加载

getComponent 相比以前的 component 属性,这个方法是异步的,也就是当路由匹配时,才会调用这个方法。

require.ensure(dependencies, callback, chunkName)

require.ensure 是 webpack 提供的方法,这也是按需加载的核心方法。第一个参数是依赖的模块数组,第二个是回调函数,该函数调用时会传一个require参数,第三个是模块名,用于构建时生成文件时命名使用

实现按需加载核心代码如下:

import React, { Component } from 'react'; // react核心
import { Router, Route, Redirect, IndexRoute, browserHistory } from 'react-router'; /*** (路由根目录组件,显示当前符合条件的组件)* * @class Roots* @extends {Component}*/
class Roots extends Component {render() {return (<div>{this.props.children}</div>);}
}const history = browserHistory;// 首页
const home = (location, cb) => {require.ensure([], require => {cb(null, require('./Home').default);}, 'home');
}const RouteConfig = (<Router history={history}><Route path="/" component={Roots}><IndexRoute getComponent={home} />   <Route path="/home" getComponent={home} /> <Route path="/login" component={login} /><Redirect from="*" to="/home" /></Route></Router>
);export default RouteConfig;

React Router 4.0:使用 babel-plugin-syntax-dynamic-import + react-loadable 实现按需加载

首先确保已安装 babel-plugin-syntax-dynamic-importreact-loadable,未安装请先安装:

npm i -D babel-plugin-syntax-dynamic-importnpm i -S react-loadable

实现按需加载核心代码如下:

import React, { Component } from 'react';
import { BrowserRouter, HashRouter, Switch, Route, Redirect} from 'react-router-dom';
import createBrowserHistory from 'history/createBrowserHistory'
const history = createBrowserHistory();// 按路由拆分代码
import Loadable from 'react-loadable';const loadingComponent = ({ isLoading, error }) => {// Handle the loading stateif (isLoading) {return <div>Loading...</div>;}// Handle the error stateelse if (error) {return <div>Sorry, there was a problem loading the page.</div>;}else {return null;}
};const Index = Loadable({loader: () => import('./Index'),loading: loadingComponent
});const Home= Loadable({loader: () => import('./Home'),loading: loadingComponent
});const Login= Loadable({loader: () => import('./Login'),loading: loadingComponent
});/*** (路由根目录组件,显示当前符合条件的组件)* * @class Roots* @extends {Component}*/
class Roots extends Component {render() {return (<div>{this.props.children}</div>);}
}let Router = process.env.NODE_ENV !== 'production' ? BrowserRouter : HashRouter;const RouteConfig = (<Router history={history}><Switch><Route path="/" exact component={Index} /><Route path="/home" component={Home} /><Route path="/login" component={Login} /><Redirect from='' to="/" /></Switch></Router>
);export default RouteConfig;

二、实现登录验证

React Router:利用 Route 的 onEnter 钩子在渲染对象组件前做拦截操作实现登录验证;

import React, { Component } from 'react'; // react核心
import { Router, Route, Redirect, IndexRoute, browserHistory } from 'react-router'; /*** (路由根目录组件,显示当前符合条件的组件)* * @class Roots* @extends {Component}*/
class Roots extends Component {render() {return (<div>{this.props.children}</div>);}
}const history = browserHistory;// 首页
const home = (location, cb) => {require.ensure([], require => {cb(null, require('./Home').default);}, 'home');
}// 登录验证
const requireAuth = (nextState, replace) => {if(true) { // 未登录replace({pathname: '/login',state: { nextPathname: nextState.location.pathname }});}
}const RouteConfig = (<Router history={history}><Route path="/" component={Roots}><IndexRoute getComponent={home} onEnter={requireAuth} />   <Route path="/home" getComponent={home} onEnter={requireAuth} /> <Route path="/login" component={login} /><Redirect from="*" to="/home" /></Route></Router>
);export default RouteConfig;

React Router4.0:在 Route 的 render 属性上添加一个函数实现登录验证;

实现登录验证核心代码如下:

import React, { Component } from 'react';
import { BrowserRouter, HashRouter, Switch, Route, Redirect} from 'react-router-dom';
import createBrowserHistory from 'history/createBrowserHistory'
const history = createBrowserHistory();// 按路由拆分代码
import Loadable from 'react-loadable';const loadingComponent = ({ isLoading, error }) => {// Handle the loading stateif (isLoading) {return <div>Loading...</div>;}// Handle the error stateelse if (error) {return <div>Sorry, there was a problem loading the page.</div>;}else {return null;}
};const Index = Loadable({loader: () => import('./Index'),loading: loadingComponent
});const Home= Loadable({loader: () => import('./Home'),loading: loadingComponent
});const Login= Loadable({loader: () => import('./Login'),loading: loadingComponent
});/*** (路由根目录组件,显示当前符合条件的组件)* * @class Roots* @extends {Component}*/
class Roots extends Component {render() {return (<div>{this.props.children}</div>);}
}// 登录验证
function requireAuth(Layout, props) {if (true) { // 未登录return <Redirect to="/login" />;} else {return <Layout {...props} />}
}let Router = process.env.NODE_ENV !== 'production' ? BrowserRouter : HashRouter;const RouteConfig = (<Router history={history}><Switch><Route path="/" exact component={Index} /><Route path="/home" component={props => requireAuth(Home, props)} /><Route path="/login" component={Login} /><Redirect from='' to="/" /></Switch></Router>
);export default RouteConfig;

三、实现点击左侧菜单刷新当前组件

React Router:利用 Route 的 createElement 钩子实现点击左侧菜单刷新当前组件;

实现点击左侧菜单刷新当前组件核心代码如下:

import React, { Component } from 'react'; // react核心
import { Router, Route, Redirect, IndexRoute, browserHistory } from 'react-router'; /*** (路由根目录组件,显示当前符合条件的组件)* * @class Roots* @extends {Component}*/
class Roots extends Component {render() {return (<div>{this.props.children}</div>);}
}const history = browserHistory;// 首页
const home = (location, cb) => {require.ensure([], require => {cb(null, require('./Home').default);}, 'home');
}// 此处为要点击刷新的组件
const arr = [home
];// 开关优化
let onOff =false;// 页面强制刷新,如果需要强制刷新在路由中添加onChange事件以及在组件数组添加
const createElement=(component, props) =>{if (props.children && onOff || props.children && arr.includes(props.routes.slice(-1)[0].getComponent)) {let children = Object.assign({}, props.children, {key : `${window.location.pathname}` + new Date().getTime()})props = { ...props, children };onOff = false;}return React.createElement(component, props)}const onChange = (props, next) => {onOff = trueconsole.log(`${next.location.pathname}`, 'change');}const RouteConfig = (<Router history={history} createElement = {createElement}><Route path="/" component={Roots}><IndexRoute getComponent={home} />   <Route path="/home" getComponent={home} /> <Route path="/login" component={login} /><Redirect from="*" to="/home" /></Route></Router>
);export default RouteConfig;

React Router4.0:直接使用 history.replace 实现点击左侧菜单刷新当前组件即可;

欢迎大家一起讨论react-router使用小技巧,该博文会持续更新!

利用react-router实现按需加载、登录验证、刷新组件。。。相关推荐

  1. react项目如何按需加载antdDesign组件

    react项目如何按需加载antdDesign组件分为两种情况: 第一种手写的,不使用脚手架: 1.安装: npm install ant --save 2.引用: import { Alert, F ...

  2. Mint-ui中loadmore(上拉加载下拉刷新)组件在ios中滑动会触发点击事件的解决方法...

    bug说明: Mint-ui中loadmore(上拉加载下拉刷新)组件 在 使用fastclick的情况下 ,在ios设备中滑动会触发点击事件: 解决方法: 我是按需引入,去项目中找到loadmore ...

  3. php mescroll,mescroll.js上拉加载下拉刷新组件使用详解

    本文实例为大家分享了上拉加载下拉刷新组件mescroll.js的具体代码,供大家参考,具体内容如下 使用注意事项: 1.引入的时候出问题及时看官方给出的解决方案(基本上都必须看): 2.react中一 ...

  4. React之antd按需加载

    虽然antd官网有提供按需加载的方法: 但这种方法需要执行eject命令,而eject是不可逆的,会更改package文件,并且将所有的依赖都暴露在外面.我将自己的项目eject后,找不到packag ...

  5. ensure函数_webpack中利用require.ensure()实现按需加载

    webpack中的require.ensure()可以实现按需加载资源包括js,css等,它会给里面require的文件单独打包,不和主文件打包在一起,webpack会自动配置名字,如0.js,1.j ...

  6. uniapp 自定义上拉加载下拉刷新组件

    介绍 该组件是结合uview框架写的,主要结合了里面的u-loadmore组件,可配置下拉刷新加载圈的颜色及背景色,暂无数据时的图等,突出的特点就是通过设置组件的高度,适配刘海屏iPhone,且支持嵌 ...

  7. mysql5.7修改默认密码策略(需加载密码验证插件)

    mysql 5.6对密码的强度进行了加强,推出了validate_password 插件.支持密码的强度要求. 此插件要求版本:5.6.6 以上版本 此插件是默认安装好的,但是你得启用它数据库中才能查 ...

  8. vue router按需加载

    1 import Vue from 'vue' 2 import Router from 'vue-router' 3 4 Vue.use(Router); 5 //按需加载,当渲染其他页面时才加载其 ...

  9. vue按需加载组件-webpack require.ensure(转)

    vue按需加载组件-webpack require.ensure 2017年07月28日 09:58:07 A_山水子农 阅读数:23245 标签: vue按需加载组件按需加载webpackrequi ...

  10. Webpack的Code Splitting实现按需加载

    一. 什么是Code Splitting? 在最开始使用Webpack的时候, 都是将所有的js文件全部打包到一个build.js文件中(文件名取决与在webpack.config.js文件中outp ...

最新文章

  1. c+语言+null,C/C++语言中NULL、'\0’和0的区别
  2. spring-bean依赖注入-02(通过p命名空间注入)
  3. wenbao与最优比率生成树
  4. [js] ReferenceError和TypeError有什么区别?
  5. 简单理解bash和常规操作
  6. 番茄花园win11专业版32位系统v2021.07
  7. 递推(hdu2563)
  8. 班级html网页设计实例,静态网页班级网站设计.doc
  9. 关于CWMP基础(二)----TR069通信流程
  10. 华为手机自带的双系统模式,你知道吗?一部手机当两部使用
  11. kettle点击spoon.bat打不开
  12. 计算机1级考试试题ps,2016年计算机等级考试一级ps模拟练习题及答案
  13. sql查询语句分支语句
  14. 小米路由器4C R4CM 原厂BootLoader和eeprom备份
  15. mysql转dm7_DM7 达梦数据库 数据库级 数据复制(DATA REPLICATION) 搭建手册
  16. android编辑图片和文字,微商图片和文字编辑器
  17. 7-5 梅森数 (10 分)
  18. 绿盟科技技术大会 TechWorld 2016完美谢幕
  19. Bugku / CTF / WEB 输入密码查看flag
  20. 【日常练习】递增数列 【迭代加深】

热门文章

  1. vue3 创建路由「vue-router 4.x 的使用」
  2. OpenCV3学习(3)——视频文件的读取与写入
  3. 7-130 古风排版 (20 分)
  4. 7-19 谁先倒 (15 分)
  5. 3007基于二叉链表的二叉树叶子结点到根结点的路径的求解(附DFS在树里的应用分析,思路详解)
  6. PAT乙级 1004 成绩排名
  7. 查询数据库前十条数据_入门数据分析的一些建议
  8. python使用大漠插件进行脚本开发的尝试(一)
  9. Alpha冲刺阶段博客汇总
  10. Spring 注解解释