React系列學(xué)習(xí)筆記:3.React-router配置

前言

本節(jié)我們主要將通過react-router完成路由配置,并采用ducks-modular-redux的方式編寫第一個(gè)Counter組件,包列表:

  • react-router:關(guān)于react-router的具體使用可以參考官方文檔
  • babel-plugin-transform-decorators-legacy支持最es7的(decorator)裝飾器語法
  • redux及react-redux

添加新的目錄

在我們的開發(fā)目錄下新建components,containers目錄及routes.js相關(guān)文件,最終目錄結(jié)構(gòu)如下(新增加的用*注釋):

components目錄:單獨(dú)組件目錄,可以在任意地方調(diào)用
containers目錄:頁面組件目錄,該目錄下每一個(gè)目錄都是一個(gè)單頁
redux目錄:采用redux的方法將,所有redux文件的放置目錄

|-React-redux-example/
    |-node_modules/                    #包文件
    |-public/                        #靜態(tài)目錄
        |-assets/                    #靜態(tài)資源生成目錄
        |-index.html
    |-src/                            #開發(fā)目錄
        |-redux/                    *redux目錄
            |-middleware/            *redux中間件
            |-modules/                *redux的actions,reducers
                |-counter.js        *Counter的actions,reducer
                |-reducers.js        *redux目錄樹
            |-create.js
        |-componets/                *單獨(dú)組件目錄
            |-Counter/                *Counter組件
                |-Counter.js
            |-index.js                *所有組件引用
        |-containers/                *頁面組件目錄
            |-App/                    *APP組件,整個(gè)應(yīng)用頂級(jí)路由
                |-App.js
            |-Home/                    *主頁組件,'/'根路由默認(rèn)頁面
                |-Home.js
            |-index.js                *所有組織的引用
        |-server.js                    #express服務(wù)器文件
        |-app.js                    #client入口文件
        |-routes.js                    *路配置文件
    |-config/                        #配置目錄
        |-webpack.dev.js            #webpack開發(fā)配置文件
    |-package.json        
    |-README.md
    |-.gitignore                    #git的忽略列表

頁面路由

src/containers/App/App.js

這是整個(gè)APP的頂層路由頁面,所有的路由都會(huì)加載這個(gè)頁面組件,然后根據(jù)路由來匹配this.props.children子頁面路由

import React,{Component, PropTypes} from 'react'

export default class App extends Component {

  render(){
    return(
      <div>
        <div>App Nav</div>
        <div>{this.props.children}</div>
        <div>App footer</div>
      </div>
    )
  }
}

src/containers/Home/Home.js

主頁組件,默認(rèn)根路由顯示的頁面

import React,{Component,PropTypes} from 'react'

export default class Home extends Component {

  render(){
    return(
      <div>HomePage</div>
    )
  }
}

src/containers/index.js

集中導(dǎo)出組件,方便引用

export App from './App/App';
export Home from './Home/Home';

src/routes.js

import React from 'react'
//IndexRoute就是根路由默認(rèn)顯示的
import {Route, IndexRoute} from 'react-router'
//從src/containers/index.js導(dǎo)入
import {App, Home} from './containers'

//這里IndexRoute入在根app下后,就是在App頁面組件的props.children
//匹配規(guī)則參考官方文檔
export default (
  <Route name='app' path='/' component={App}>
    <IndexRoute component={Home} />
  </Route>
)

重寫src/app.js

import React from 'react'
import ReactDOM from 'react-dom'

import routes from './routes'
import {Router, browserHistory} from 'react-router'


ReactDOM.render(
  <Router history={browserHistory}>
    {routes}
  </Router>
  ,document.getElementById('app'))

完成npm run dev,看見如下圖說明路由配置成功

編寫第一個(gè)組件Counter

在編譯過程中加入裝飾器語法的插件,就要用到這個(gè)插件babel-plugin-transform-decorators-legacy

module:{
loaders:[
  {
    test:/\.js$/,
    exclude:/node_modules/,
    loader:'babel-loader',
    query:{
      presets:['react','es2015','stage-0'],
      plugins:['transform-decorators-legacy'] //裝飾器插件
    }
  }
]
},

這里我就不再累述如何用編寫redux的組件了,唯一要提醒的就是這里我們用了es7的語法裝飾器,這樣整個(gè)應(yīng)用的邏輯更加清楚。

src/components/Counter/Counter.js
src/container/Home/Home.js頁面組件下使用Counter組件

import React,{Component, PropTypes} from 'react'

import {bindActionCreators} from 'redux'
import {connect} from 'react-redux'

import * as CounterActions from '../../redux/modules/counter'

@connect(
  state => ({counter:state.counter}),
  dispatch => bindActionCreators(CounterActions,dispatch)
)
export default class Counter extends Component{
  static propTypes = {
    counter:PropTypes.number.isRequired,
    increment:PropTypes.func.isRequired,
    incrementIfOdd:PropTypes.func.isRequired
  };

  render(){
    const {counter,increment,incrementIfOdd} = this.props;
    return(
      <div>
        <h2>{counter}</h2>
        <button onClick={increment}>
           You have clicked me {counter} time{counter === 1 ? '' : 's'}.
        </button>
        <button onClick={incrementIfOdd} >奇數(shù)加法</button>
      </div>
    )
  }

最后效果如下


Next

bootstrap-loader React-bootstrap使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容