React系列学习笔记:3.React-router配置

前言

本节我们主要将通过react-router完成路由配置,并采用ducks-modular-redux的方式编写第一个Counter组件,包列表:

  • react-router:关于react-router的具体使用可以参考官方文档
  • babel-plugin-transform-decorators-legacy支持最es7的(decorator)装饰器语法
  • redux及react-redux

添加新的目录

在我们的开发目录下新建components,containers目录及routes.js相关文件,最终目录结构如下(新增加的用*注释):

components目录:单独组件目录,可以在任意地方调用
containers目录:页面组件目录,该目录下每一个目录都是一个单页
redux目录:采用redux的方法将,所有redux文件的放置目录

|-React-redux-example/
    |-node_modules/                    #包文件
    |-public/                        #静态目录
        |-assets/                    #静态资源生成目录
        |-index.html
    |-src/                            #开发目录
        |-redux/                    *redux目录
            |-middleware/            *redux中间件
            |-modules/                *redux的actions,reducers
                |-counter.js        *Counter的actions,reducer
                |-reducers.js        *redux目录树
            |-create.js
        |-componets/                *单独组件目录
            |-Counter/                *Counter组件
                |-Counter.js
            |-index.js                *所有组件引用
        |-containers/                *页面组件目录
            |-App/                    *APP组件,整个应用顶级路由
                |-App.js
            |-Home/                    *主页组件,'/'根路由默认页面
                |-Home.js
            |-index.js                *所有组织的引用
        |-server.js                    #express服务器文件
        |-app.js                    #client入口文件
        |-routes.js                    *路配置文件
    |-config/                        #配置目录
        |-webpack.dev.js            #webpack开发配置文件
    |-package.json        
    |-README.md
    |-.gitignore                    #git的忽略列表

页面路由

src/containers/App/App.js

这是整个APP的顶层路由页面,所有的路由都会加载这个页面组件,然后根据路由来匹配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

主页组件,默认根路由显示的页面

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

export default class Home extends Component {

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

src/containers/index.js

集中导出组件,方便引用

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

src/routes.js

import React from 'react'
//IndexRoute就是根路由默认显示的
import {Route, IndexRoute} from 'react-router'
//从src/containers/index.js导入
import {App, Home} from './containers'

//这里IndexRoute入在根app下后,就是在App页面组件的props.children
//匹配规则参考官方文档
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,看见如下图说明路由配置成功

编写第一个组件Counter

在编译过程中加入装饰器语法的插件,就要用到这个插件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的语法装饰器,这样整个应用的逻辑更加清楚。

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} >奇数加法</button>
      </div>
    )
  }

最后效果如下


Next

bootstrap-loader React-bootstrap使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容