根据须要安装如下组件。html
npm install --save redux npm install --save react-redux npm install --save-dev redux-devtools
react-redux
是Redux 官方提供的 React 绑定库。 具备高效且灵活的特性。react
<Provider>
组件: 这个组件须要包裹在整个组件树的最外层。这个组件让根组件的全部子孙组件可以轻松的使用 connect() 方法绑定 store。connect()
:这是 react-redux 提供的一个方法。若是一个组件想要响应状态的变化,就把本身做为参数传给 connect() 的结果,connect() 方法会处理与 store 绑定的细节,并经过 selector 肯定该绑定 store 中哪一部分的数据。selector
:这是你本身编写的一个函数。这个函数声明了你的组件须要整个 store 中的哪一部分数据做为本身的 props。dispatch
:每当你想要改变应用中的状态时,你就要 dispatch 一个 action,这也是惟一改变状态的方法。react-redux提供如下API:git
API原型:
<Provider store>
github
使组件层级中的 connect() 方法都可以得到 Redux store(将store传递给App框架)。一般状况下咱们须要将根组件嵌套在 标签 中才能使用 connect() 方法。npm
class Index extends Component { render() { return <Provider store={configureStore()}> <AppWithNavigationState /> </Provider> } }
以上代码片断的完整部分能够在课程源码中查找。redux
在上述代码中咱们用 标签包裹了根组件AppWithNavigationState
,而后为它设置了store参数,store (Redux Store)接受的是应用程序中惟一的 Redux store 对象。框架
API原型:
connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])
异步
链接 React 组件与 Redux store,链接操做会返回一个新的与 Redux store 链接的组件类,而且链接操做不会改变原来的组件类。ide
react-redux`提供了connect函数,connect是一个高阶函数,首先传入mapStateToProps、mapDispatchToProps,而后返回一个生产 Component 的函数(wrapWithConnect),而后再将真正的Component做为参数传入wrapWithConnect(MyComponent),这样就生产出一个通过包裹的Connect组件,如:`export default connect(mapStateToProps)(HomePage);
建立action函数
/* * action 类型 */ export const ADD_TODO = 'ADD_TODO'; export const COMPLETE_TODO = 'COMPLETE_TODO'; export const SET_VISIBILITY_FILTER = 'SET_VISIBILITY_FILTER' /* * 其它的常量 */ export const VisibilityFilters = { SHOW_ALL: 'SHOW_ALL', SHOW_COMPLETED: 'SHOW_COMPLETED', SHOW_ACTIVE: 'SHOW_ACTIVE' }; /* * action 建立函数 */ export function addTodo(text) { return { type: ADD_TODO, text } } export function completeTodo(index) { return { type: COMPLETE_TODO, index } } export function setVisibilityFilter(filter) { return { type: SET_VISIBILITY_FILTER, filter } }
以上代码片断的完整部分能够在课程源码中查找。
import { combineReducers } from 'redux' import { ADD_TODO, COMPLETE_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 } ] case COMPLETE_TODO: return [ ...state.slice(0, action.index), Object.assign({}, state[action.index], { completed: true }), ...state.slice(action.index + 1) ] default: return state } } //经过combineReducers将多个reducer合并成一个rootReducer const todoApp = combineReducers({ visibilityFilter, todos }) export default todoApp
以上代码片断的完整部分能够在课程源码中查找。
这里经过Redux提供的combineReducers
方法,将多个reducer聚合成一个rootReducer。
import {createStore} from 'redux' import todoApp from './reducers' let store = createStore(todoApp)
这里经过Redux提供的createStore
方法,建立了store;
使用<Provider>
包裹根组件
import {Provider} from 'react-redux' export default class index extends Component { render() { return (<Provider store={store}> <App/> </Provider>) } }
以上代码片断的完整部分能够在课程源码中查找。
这里咱们使用react-redux
提供的<Provider>
来包裹咱们的根组件,让根组件的因此子组件都能使用 connect() 方法绑定 store。
function selectTodos(todos, filter) { switch (filter) { case VisibilityFilters.SHOW_ALL: return todos case VisibilityFilters.SHOW_COMPLETED: return todos.filter(todo => todo.completed) case VisibilityFilters.SHOW_ACTIVE: return todos.filter(todo => !todo.completed) } } // Which props do we want to inject, given the global state? // Note: use https://github.com/faassen/reselect for better performance. function select(state) { return { visibleTodos: selectTodos(state.todos, state.visibilityFilter), visibilityFilter: state.visibilityFilter } } // 包装 component ,注入 dispatch 和 state 到其默认的 connect(select)(App) 中; export default connect(select)(App)
以上代码片断的完整部分能够在课程源码中查找。
经过上述代码咱们声明App
组件须要整个 store 中的哪一部分数据做为本身的 props,这里用到了connect
,咱们将select
做为参数传给connect
,connect
会返回一个生成组件函数,而后咱们将App组件当作参数传给这个函数。
connect是一个高阶函数,首先传入mapStateToProps、mapDispatchToProps,而后返回一个生产 Component 的函数(wrapWithConnect),而后再将真正的Component做为参数传入wrapWithConnect(MyComponent),这样就生产出一个通过包裹的Connect组件
render() { // Injected by connect() call: const {dispatch, visibleTodos, visibilityFilter} = this.props return ( <View> <AddTodo onAddClick={text => dispatch(addTodo(text)) } toast={this.toast} /> <TabBar filter={visibilityFilter} onFilterChange={nextFilter => dispatch(setVisibilityFilter(nextFilter)) }/> <TodoList todos={visibleTodos} onTodoClick={index => dispatch(completeTodo(index)) } toast={this._toast()} /> <Toast ref={toast => this.toast = toast}/> </View> ) }
以上代码片断的完整部分能够在课程源码中查找。
在这里咱们经过dispatch
将action发送到store,store会将这个action
分发给reducer
,reducer
会建立当前state的副本,而后修改该副本并返回一个新的state,这样一来store树将被更新,而后对应组件的props将被更新,从而组件被更新;