# 一个简单的计数器开始
首先为了理清一些概念,先写一个小Demo进行说明。
`index.js`
```js
import React, { Component } from 'react'
import ReactDOM from 'react-dom'
import PropTypes from 'prop-types'
import { createStore } from 'redux'
const reducers = (state = 0, action) => {
switch (action.type) {
case 'INCREMENT': return state + 1;
case 'DECREMENT': return state - 1;
default: return state;
}
};
const store = createStore(reducers)
const rootEl = document.getElementById('root')
class Counter extends Component{
constructor (props) {
super(props);
this.increment = this.increment.bind(this);
this.decrement = this.decrement.bind(this);
}
increment () {
const { onIncrement } = this.props
onIncrement()
}
decrement () {
const { onDecrement } = this.props
onDecrement()
}
render () {
const { value } = this.props
return (
<p>
Count: {value} <br/>
{' '}
<button onClick={this.increment}>
+
</button>
{' '}
<button onClick={this.decrement}>
-
</button>
</p>
)
}
}
Counter.propTypes = {
value: PropTypes.number.isRequired,
onIncrement: PropTypes.func.isRequired,
onDecrement: PropTypes.func.isRequired
}
const render = () => ReactDOM.render(
<Counter
value={store.getState()}
onIncrement={() => store.dispatch({ type: 'INCREMENT' })}
onDecrement={() => store.dispatch({ type: 'DECREMENT' })}
/>,
rootEl
)
render()
store.subscribe(render)
```
运行效果如下:
:-: ![](http://xiaoyulive.oss-cn-beijing.aliyuncs.com/imgs/react/009.png)
可以看到效果为点击 +/- 对应的 Count 数值也对应增加。
当然这只是一个很简单的例子,只是为了说明一些问题,实际应用中比这复杂得多。
## 基本概念
一个 Redux 应用程序包括以下几个部分:
### Store
Store 是一个数据存储池,用于保存View中的一些状态。
比如上述案例中的:
```js
import { createStore } from 'redux'
import reducers from './reducers'
const store = createStore(reducers)
```
创建了一个数据存储池 store,后面章节详细介绍。
### State
Store对象包含所有数据。如果想得到某个时点的数据,就要对 Store 生成快照。这种时点的数据集合,就叫做 State。
State 是view中的具体状态,使用 `store.getState()` 获取状态值,一个state只对应一个view。
比如上述案例中的:
```js
<Counter
value={store.getState()}
/>
```
将state传递给 Counter 组件,在组件中使用 `props.value` 接收。
### Action
Action 是把数据从应用传到 store 的有效载荷。它是 store 数据的唯一来源。一般来说会通过 store.dispatch() 将 action 传到 store。
比如上述案例中的:
```js
onIncrement={() => store.dispatch({ type: 'INCREMENT' })}
onDecrement={() => store.dispatch({ type: 'DECREMENT' })}
```
提交一个type为 `DECREMENT` 的Action以改变state
在上例中的 `reducers` 方法,接收两个参数,一个是 state 的状态,另一个参数叫 action,使用一个 type 属性区别 action 的具体行为。
### Reducer
Reducer 是具体指定 Action 将如何改变 State 状态的一个方法,接收上一个状态的状态值 previousState 和一个 action,返回新的状态值 newState。
比如上述案例中定义的的 `reducers` 函数,这个方法就是 reducer。
```js
const reducers = (state = 0, action) => {
switch (action.type) {
case 'INCREMENT': return state + 1;
case 'DECREMENT': return state - 1;
default: return state;
}
};
```
- 简介
- 第一章 React入门
- 1.1 创建一个React项目
- 1.2 组件
- 1.3 JSX
- 1.4 eject
- 1.5 渲染
- 第二章 React组件
- 2.1 组件定义
- 2.2 数据处理
- 2.2.1 props
- 2.2.2 state
- 2.3 生命周期
- 2.3.1 装载过程
- 2.3.2 更新过程
- 2.3.3 卸载过程
- 2.4 事件处理
- 2.5 条件渲染
- 2.6 列表渲染
- 第三章 React高级
- 3.1 静态类型检查
- 3.1.1 flow
- 3.1.2 typescript
- 3.2 React Developer Tools
- 第四章 Redux状态管理
- 4.1 安装与配置
- 4.2 一个简单的计数器开始
- 4.3 Store
- 4.3.1 获取state
- 4.3.2 subscribe
- 4.4 Action
- 4.4.1 Action Creators
- 4.5 Reducer
- 4.5.1 Reducer 的拆分
- 4.6 与其他状态管理工具的对比
- 第五章 React-Router路由
- 参考资料