React Navigation 集成 Redux
更新时间:2018-03-03
修复因 React Navigation 更新引起的 addListener is not a function
的问题。
react-navigation 是 React Native 官方推荐的导航库。redux 是一个状态容器,redux 的简单使用可参考阮一峰的 Redux 入门教程,现在网上也有很多中文文档。
在 React Navigation 最新版本中需要添加 react-navigation-redux-helpers
包
1 | $ yarn add react-native-navigation-redux-helpers |
首先写 redux helper 工具 redux.js
1 | import { |
首先写一个 navigator
1 | export const AppNavigator = StackNavigator({ |
集成 Redux 主要含三部分:Store,Action,Reducer
Action
1 | export function getBanners() { |
Reducer
othersReducer.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// 初始 state
const initState = {
banners: [],
articles: [],
loading: false
}
export default function discoveryData(state=initState, action) {
switch(action.type) {
case actionTypes.BANNER:
return {...state, banners:action.data, loading:false}
default:
return state;
}
}navReducer.js 用于导航
1
2
3
4
5
6
7
8
9
10
11
12
13
14import { AppNavigator } from '../navigators/AppNavigator';
import { NavigationActions } from 'react-navigation';
// Home 是个 TabNavigator,在这里 firstAction 为 null,会导致后续程序会出错,所以自己手写了一个 action
const firstAction = AppNavigator.router.getActionForPathAndParams('Home') || {
type: 'Navigation/NAVIGATE',
touteName: 'Home'
};
const initialNavState = AppNavigator.router.getStateForAction(firstAction);
const navReducer = (state = initialNavState, action) => {
const nextState = AppNavigator.router.getStateForAction(action, state);
return nextState || state;
}
export default navReducer;
在以前版本里,我是把 firstAction 和 initialNavState 注释掉了,如果不注释掉会在 getStateForAction 时报 undefined
错误
解决方案多种:
一种是将 TabNavigator 放在单纯的 Component 中作为 StackNavigator 的 screen,这样就可以使用 initialNavState了,弊端是不方便从其它页面跳转到 TabNavigator 的指定 Tab 页。
另一种就是我现在使用的方案了。
如果你有更好的解决方案请告诉我!!
在新版本中不再出现上述问题,而是出现代码中提到的 null 问题
3. 整合 Reducer
1 | import { combineReducers } from 'redux'; |
配置 Store
1 | import { createStore, applyMiddleware } from 'redux'; |
自定义 Navigator
1 | import { connect } from 'react-redux'; |
绑定到应用中
在入口文件中绑定 Redux 的 store 管理库
1 | import { Provider } from 'react-redux'; |
所有源码我已经放到了 GitHub 查看源码