經過webpack能夠把整個React項目整合成一個單頁面的網站,此時能夠經過react-router來處理路由。react
首先安裝:webpack
npm install react-router --savegit
因爲react-router使用了history,要在webpack.config.js中進行相應的配置:github
devServer: {
historyApiFallback: trueweb
}npm
不然,相似localhost:8080/foo的URL會返回404。以後爲了將整個項目作成一個單頁面,作以下處理:babel
import { Router, browserHistory } from 'react-router';react-router
export default class App extends React.Component函數
{
routes = {
path: '/',
indexRoute: {
onEnter: (nextState, replace) => {},
},
childRoutes:[
]
}網站
render(){
return <Router history={browserHistory} routes={this.routes} />
}
}
其中,routes的配置可參見react-router的github頁面。同時,須要給別的組件都配置相應的route,這些route要寫在routes.childRoutes裏。
因爲大量的組件都須要進行route的設置,這能夠看做組件類的共同特徵,能夠用Decorator的方式讓代碼更簡潔,Decorator的詳細信息能夠查到,但爲了使用它,首先必須安裝相應的Babel插件:
npm install babel-plugin-transform-decorators-legacy --save,同時,須要在.babelrc中的plugins裏作相應配置:
"plugins": [
"transform-class-properties",
"babel-plugin-transform-decorators-legacy"
],
這裏咱們定義一個函數reactComponentEx,用它返回一個Decorator函數,並在函數中對類作相應的處理,主要是配置react-router:
export default function reactComponentEx(path){
return function (target, property, descriptor){
class _target extends target{
static route = {
path:path,
component:_target,
indexRoute:{},
childRoutes:target.childRoutes && target.childRoutes.map(v=>{
return {
path: v.path,
component: v.component
}
})
}
};
return _target;
}
}
此時,能夠將這個函數寫在每個想要設置路由的react組件的最外面,如:
@reactComponentEx('foo')
export default class Foo extends React.Component{......
再把它配置到剛纔的總route裏:
routes = {
path: '/',
indexRoute: {
onEnter: (nextState, replace) => {},
},
childRoutes:[
require("foo").default.route //經過Decorator已經生產了這個route
]
}
就能夠用localhost:8080/foo的形式訪問到相應的頁面了。