npm install redux
react
redux将整个应用的state存储到一个store中,当用户触发一个action的时候,经过调用store.dispatch(action)来触发sotre中定义好的 reducers 最终更新引用的state。npm
下面我会对每一个概念进行介绍redux
action
是将数据发送的store
的有效负载,他们是store数据的惟一来源经过 store.dispatch()
将数据发送的storebash
action 是一个普通的js对象,action必须指定一个 type 属性用来描述执行的操做。app
{
type: 'ADD_TODO',
text: 'Build my first Redux app'
}
复制代码
action creators 是返回一个action 的方法,这样写能够方便开发和测试。dom
function addTodo(text) {
return {
type: ADD_TODO,
text
}
}
dispatch(addTodo('eat'))
复制代码
Reducers是指定状态树如何响应 dispatch 到store 的action的,action只是用来描述发生的动做,不描述状态的变化。ide
首先肯定state的数据的格式函数
{
todos: [
{
text: 'Consider using Redux',
completed: true
}
]
}
复制代码
肯定state的数据格式以后咱们就能够编写一个reducer,reducer 是一个纯函数接收state和action返回新的state测试
const initialState = {
todos: []
}
function todoApp(state = initialState, action) {
switch (action.type) {
case 'ADD_TODO':
return Object.assign({}, state, {
todos: [
...state.todos,
{
text: action.text,
completed: false
}
]
})
default:
return state
}
}
复制代码
注意咱们使用Object.assign()返回一个新的状态,不改变参数中的state 的值ui
当咱们应用程序的action比较多每一个action在reducers中的逻辑比较复杂的时候,若是还像咱们上面一直使用 switch case 能够想象咱们的reducers会变的很是的长,此时咱们就须要对一些复杂的操做进行分割,分割的规则是根据 state 的节点操做进行分割,针对每一个节点的操做写一个reducers而后使用 combineReducers
方法进行合并。
例如
import { combineReducers } from 'redux'
import {
ADD_TODO,
TOGGLE_TODO,
SET_VISIBILITY_FILTER,
VisibilityFilters
} from './actions'
const { SHOW_ALL } = VisibilityFilters
function visibilityFilter(state = SHOW_ALL, action) {
switch (action.type) {
case SET_VISIBILITY_FILTER:
return action.filter
default:
return state
}
}
function todos(state = [], action) {
switch (action.type) {
case ADD_TODO:
return [
...state,
{
text: action.text,
completed: false
}
]
default:
return state
}
}
const todoApp = combineReducers({
visibilityFilter,
todos
})
export default todoApp
复制代码
在redux 应用程序中只能有一个store,使用store能够将上面的reducers和actions进行组合,而后进行操做。
redux提供了一个createStore接收一个reducers参数,最终返回一个store,咱们将以前定义好的reducers引入,而后传入createStore 就能够了。
import { createStore } from 'redux'
import todoApp from './reducers'
const store = createStore(todoApp)
复制代码
npm install --save react-redux
复制代码
<provider />
是redux提供的一个组件,这个组件 有一个props store (上面文档中建立出来的store)
, 这个组件可使,使用connect()函数嵌套的组件能访问redux中的store。
用法
import React from 'react'
import ReactDOM from 'react-dom'
import { Provider } from 'react-redux'
import { App } from './App'
import createStore from './createReduxStore'
const store = createStore()
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
)
复制代码
connect
函数用于把redux 的store 和react 的组件链接到一块儿,他返回的是一个包装函数,这个函数的参数是一个react的组件,这个函数将会返回一个 包装组件。
function connect(mapStateToProps?, mapDispatchToProps?, mergeProps?, options?)
例子
import { addTodo } from './actionCreators'
const mapDispatchToProps = {
addTodo
}
const mapStateToProps = (state, ownProps) => ({
todo: state.todos[ownProps.id]
})
export default connect(
mapStateToProps,
mapDispatchToProps
)(TodoApp)
复制代码
state为redux的状态树,ownProps是连接组件的props
若是此方法有一个参数,在redux的state发生变化的时候会调用函数,若是此方法有两个参数,此方法将会在链接组件的props或者redux的state发生变化的时候调用。
此方法返回一个对象,** 此对象(一般称为stateProps)将合并为链接组件的props
**。若是定义mergeProps,它将做为mergeProps的第一个参数提供。
dispatch 即 store中的dispatch 经过传入一个action给变store中的state数据
ownProps 即 连接组件的 props
您的mapDispatchToProps函数应返回一个对象。对象的每一个字段都应该是一个函数,调用哪一个函数能够dispatch 一个action 到store。
mapDispatchToProps函数的返回被视为dispatchProps。它将做为props合并到您链接的组件。若是定义mergeProps,它将做为mergeProps的第二个参数提供。
若是指定,则定义如何肯定本身的包装组件的最终props。若是您不提供mergeProps,则默认状况下,您的包装组件会收到{... ownProps,... stateProps,... dispatchProps}。
mergeProps的返回值称为mergedProps,字段将用做包装组件的props。
暂未使用