带有 redux 错误的 React-navigation TabNavigator
React-navigation TabNavigator with redux errors
我正在尝试使用 redux 实现反应导航的 TabNavigator,但我一直 运行 出错。我现在收到以下错误:
undefined 不是对象(正在计算 'navigation.state.routes')
我的index.android.js和index.ios.js都指向我的app.js。
我创建了以下 类:
导航配置
import {
TabNavigator
} from 'react-navigation';
// Default colors class
import colors from '../config/colors';
// Tab-Navigators
import MapScreen from '../screens/MapScreen';
import ScanScreen from '../screens/ScanScreen';
import HomeScreen from '../screens/HomeScreen';
import HistoryScreen from '../screens/HistoryScreen';
import LanguageSelectScreen from '../screens/LanguageSelectScreen';
const routeConfiguration = {
Home: { screen: HomeScreen },
LanguageSelect: { screen: LanguageSelectScreen },
History: { screen: HistoryScreen },
Map: { screen: MapScreen },
Scan: { screen: ScanScreen },
}
const tabBarConfiguration = {
swipeEnabled: false,
animationEnabled: true,
tabBarOptions: {
showLabel: false,
showIcon: true,
inactiveTintColor: colors.grey2,
activeTintColor: colors.selectedTabColor,
}
}
export const TabBar = TabNavigator(routeConfiguration,tabBarConfiguration)
export const tabBarReducer = (state,action) => {
if (action.type === 'JUMP_TO_TAB') {
return { ...state, index:0 }
} else {
return TabBar.router.getStateForAction(action,state)
}
}
TabBarComponent
// React
import React, { Component } from 'react';
// Navigation
import { addNavigationHelpers } from 'react-navigation'
import { TabBar } from '../navigation/NavigationConfiguration'
//Redux
import { connect } from 'react-redux'
const mapStateToProps = (state) => {
return {
navigationState: state.Home,
}
}
class TabBarComponent extends Component {
render() {
return (
<TabBar
navigation={
addNavigationHelpers({
dispatch: this.props.dispatch,
state: this.props.navigationState,
})
}
/>
)
}
}
export default connect(mapStateToProps)(TabBarComponent)
商店
// Redux
import { applyMiddleware, combineReducers, createStore } from 'redux'
import logger from 'redux-logger'
// Navigation
import { TabBar, tabBarReducer } from '../navigation/NavigationConfiguration';
const middleWare = () => {
return applyMiddleware(logger);
}
export default createStore(
combineReducers({
tabBar: tabBarReducer,
}),
middleWare(),
)
主屏幕
// React
import React, { Component } from 'react';
import {
StyleSheet,
Text,
Image,
View
} from 'react-native';
class HomeScreen extends Component {
static navigationOptions = {
tabBar: {
label: 'Home',
icon: ({ tintColor }) => (
<MaterialIcons color={tintColor} name='home' size={26} />
),
},
}
constructor(props) {
super(props);
}
render(){
return (
<View>
</View>
)
}
}
export default HomeScreen;
app.js
// React
import React, { Component } from 'react';
import {
AppRegistry,
View
} from 'react-native';
// Redux
import { Provider } from 'react-redux';
import store from './config/store';
// Navigation
import TabBarComponent from './components/TabBarComponent';
class GeoFort extends Component {
render() {
return (
<Provider store={store}>
<TabBarComponent />
</Provider>
)
}
}
AppRegistry.registerComponent('GeoFort', () => GeoFort);
我终于明白了!在 TabBarComponent 中,我将 mapStateToProps 更改为:
const mapStateToProps = (state) => {
return {
navigationState: state.tabBar,
}
}
我正在尝试使用 redux 实现反应导航的 TabNavigator,但我一直 运行 出错。我现在收到以下错误: undefined 不是对象(正在计算 'navigation.state.routes')
我的index.android.js和index.ios.js都指向我的app.js。
我创建了以下 类:
导航配置
import {
TabNavigator
} from 'react-navigation';
// Default colors class
import colors from '../config/colors';
// Tab-Navigators
import MapScreen from '../screens/MapScreen';
import ScanScreen from '../screens/ScanScreen';
import HomeScreen from '../screens/HomeScreen';
import HistoryScreen from '../screens/HistoryScreen';
import LanguageSelectScreen from '../screens/LanguageSelectScreen';
const routeConfiguration = {
Home: { screen: HomeScreen },
LanguageSelect: { screen: LanguageSelectScreen },
History: { screen: HistoryScreen },
Map: { screen: MapScreen },
Scan: { screen: ScanScreen },
}
const tabBarConfiguration = {
swipeEnabled: false,
animationEnabled: true,
tabBarOptions: {
showLabel: false,
showIcon: true,
inactiveTintColor: colors.grey2,
activeTintColor: colors.selectedTabColor,
}
}
export const TabBar = TabNavigator(routeConfiguration,tabBarConfiguration)
export const tabBarReducer = (state,action) => {
if (action.type === 'JUMP_TO_TAB') {
return { ...state, index:0 }
} else {
return TabBar.router.getStateForAction(action,state)
}
}
TabBarComponent
// React
import React, { Component } from 'react';
// Navigation
import { addNavigationHelpers } from 'react-navigation'
import { TabBar } from '../navigation/NavigationConfiguration'
//Redux
import { connect } from 'react-redux'
const mapStateToProps = (state) => {
return {
navigationState: state.Home,
}
}
class TabBarComponent extends Component {
render() {
return (
<TabBar
navigation={
addNavigationHelpers({
dispatch: this.props.dispatch,
state: this.props.navigationState,
})
}
/>
)
}
}
export default connect(mapStateToProps)(TabBarComponent)
商店
// Redux
import { applyMiddleware, combineReducers, createStore } from 'redux'
import logger from 'redux-logger'
// Navigation
import { TabBar, tabBarReducer } from '../navigation/NavigationConfiguration';
const middleWare = () => {
return applyMiddleware(logger);
}
export default createStore(
combineReducers({
tabBar: tabBarReducer,
}),
middleWare(),
)
主屏幕
// React
import React, { Component } from 'react';
import {
StyleSheet,
Text,
Image,
View
} from 'react-native';
class HomeScreen extends Component {
static navigationOptions = {
tabBar: {
label: 'Home',
icon: ({ tintColor }) => (
<MaterialIcons color={tintColor} name='home' size={26} />
),
},
}
constructor(props) {
super(props);
}
render(){
return (
<View>
</View>
)
}
}
export default HomeScreen;
app.js
// React
import React, { Component } from 'react';
import {
AppRegistry,
View
} from 'react-native';
// Redux
import { Provider } from 'react-redux';
import store from './config/store';
// Navigation
import TabBarComponent from './components/TabBarComponent';
class GeoFort extends Component {
render() {
return (
<Provider store={store}>
<TabBarComponent />
</Provider>
)
}
}
AppRegistry.registerComponent('GeoFort', () => GeoFort);
我终于明白了!在 TabBarComponent 中,我将 mapStateToProps 更改为:
const mapStateToProps = (state) => {
return {
navigationState: state.tabBar,
}
}