Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
React native 无法访问react navigation v3选项卡导航器中的redux道具(获取此.props时出错。<;function\u name>;不是函数)_React Native_Redux_React Navigation - Fatal编程技术网

React native 无法访问react navigation v3选项卡导航器中的redux道具(获取此.props时出错。<;function\u name>;不是函数)

React native 无法访问react navigation v3选项卡导航器中的redux道具(获取此.props时出错。<;function\u name>;不是函数),react-native,redux,react-navigation,React Native,Redux,React Navigation,我无法将选项卡导航器(从React Navigation v3)连接到redux提供程序。 这就是我的react导航和redux的配置方式: app/ /react-redux provider /app-container (this is the AppContainer of the main SwitchNavigator) /welcome-screen /login-screen /register-screen /home

我无法将选项卡导航器(从React Navigation v3)连接到redux提供程序。 这就是我的react导航和redux的配置方式:

app/
  /react-redux provider
    /app-container (this is the AppContainer of the main SwitchNavigator)
      /welcome-screen
      /login-screen
      /register-screen
      /home-navigator (this is the TabNavigator that is inside the SwitchNavigator)
Home navigator保留用户登录时指向的屏幕。在前3个屏幕(欢迎、登录和注册)中,我可以通过标准mapDispatchToProps访问从redux“连接”到屏幕的功能

这是应用程序组件:

/**
 * Entry point for the app
 */

import React, { Component } from "react";

// redux
import { Provider } from "react-redux";
import { createStore, applyMiddleware } from "redux";
import reduxThunk from "redux-thunk";
import { composeWithDevTools } from "redux-devtools-extension";
import main_app_reducer from "./modules/core/reducers/main_app_reducer";

// create redux store
const create_store = composeWithDevTools(applyMiddleware(reduxThunk))(createStore);
export const store = create_store(main_app_reducer);

// navigation
import AppContainer from "./modules/core/components/AppNavigator";

import { configure_axios } from "./helpers/axios_config";
configure_axios();

class App extends Component {
    render() {
        return (
            <Provider store={store}>
                <AppContainer />
            </Provider>
        );
    }
}

export default App;

import { createBottomTabNavigator } from "react-navigation";
import { HomeScreen } from "../screens/HomeScreen";
import { DashboardScreen } from "../screens/DashboardScreen";

const HomeNavigator = createBottomTabNavigator(
    {
        Home: { screen: HomeScreen },
        Dashboard: { screen: DashboardScreen },
    },
    {
        navigationOptions: ({ navigation }) => {
            const { routeName } = navigation.state.routes[navigation.state.index];
            return {
                headerTitle: routeName,
            };
        },
    },
);

export default HomeNavigator;
上面的所有代码都工作正常,没有错误,问题发生在下面的HomeNavigator组件中。 这是HomeNavigator组件:

/**
 * Entry point for the app
 */

import React, { Component } from "react";

// redux
import { Provider } from "react-redux";
import { createStore, applyMiddleware } from "redux";
import reduxThunk from "redux-thunk";
import { composeWithDevTools } from "redux-devtools-extension";
import main_app_reducer from "./modules/core/reducers/main_app_reducer";

// create redux store
const create_store = composeWithDevTools(applyMiddleware(reduxThunk))(createStore);
export const store = create_store(main_app_reducer);

// navigation
import AppContainer from "./modules/core/components/AppNavigator";

import { configure_axios } from "./helpers/axios_config";
configure_axios();

class App extends Component {
    render() {
        return (
            <Provider store={store}>
                <AppContainer />
            </Provider>
        );
    }
}

export default App;

import { createBottomTabNavigator } from "react-navigation";
import { HomeScreen } from "../screens/HomeScreen";
import { DashboardScreen } from "../screens/DashboardScreen";

const HomeNavigator = createBottomTabNavigator(
    {
        Home: { screen: HomeScreen },
        Dashboard: { screen: DashboardScreen },
    },
    {
        navigationOptions: ({ navigation }) => {
            const { routeName } = navigation.state.routes[navigation.state.index];
            return {
                headerTitle: routeName,
            };
        },
    },
);

export default HomeNavigator;
HomeNavigator中的所有屏幕均未连接到Redux Alt,尽管它们的定义方式与AppContainer文件中的屏幕相同。要进行比较,请参见AppContainer的登录屏幕和HomeNavigator的主屏幕:

登录筛选:

import React, { Component } from "react";
import { View, Text } from "react-native";
import { connect } from "react-redux";
import { get_user_servers } from "../actions/core_actions";

export class LoginScreen extends Component {
    componentDidMount() {
        this.props.get_user_servers(); // this function works absolutely fine
    }

    render() {
        return (
            <View>
                <Text> LoginScreen </Text>
            </View>
        );
    }
}

const mapStateToProps = (state) => ({});

const mapDispatchToProps = { get_user_servers };

export default connect(
    mapStateToProps,
    mapDispatchToProps,
)(LoginScreen);

import React,{Component}来自“React”;
从“react native”导入{View,Text};
从“react redux”导入{connect};
从“./actions/core\u actions”导入{get\u user\u servers};
导出类LoginScreen扩展组件{
componentDidMount(){
this.props.get_user_servers();//这个函数工作得非常好
}
render(){
返回(
登录屏幕
);
}
}
常量mapStateToProps=(状态)=>({});
const mapDispatchToProps={get_user_servers};
导出默认连接(
MapStateTops,
mapDispatchToProps,
)(登录屏幕);
主屏幕:

import React, { Component } from "react";
import { View, Text } from "react-native";
import { connect } from "react-redux";
import { get_user_servers } from "../actions/core_actions";

export class HomeScreen extends Component {
    componentDidMount() {
        this.props.get_user_servers();
// the same function as in LoginScreen but here the function does not work
// I'm getting an error = TypeError: this.props.get_user_servers is not a function (see picture below)
    }

    render() {
        return (
            <View>
                <Text> HomeScreen </Text>
            </View>
        );
    }
}

const mapStateToProps = (state) => ({});

const mapDispatchToProps = { get_user_servers };

export default connect(
    mapStateToProps,
    mapDispatchToProps,
)(HomeScreen);
import React,{Component}来自“React”;
从“react native”导入{View,Text};
从“react redux”导入{connect};
从“./actions/core\u actions”导入{get\u user\u servers};
导出类主屏幕扩展组件{
componentDidMount(){
this.props.get_user_servers();
//与LoginScreen中的函数相同,但此处该函数不起作用
//我得到一个error=TypeError:this.props.get\u user\u服务器不是一个函数(见下图)
}
render(){
返回(
主屏幕
);
}
}
常量mapStateToProps=(状态)=>({});
const mapDispatchToProps={get_user_servers};
导出默认连接(
MapStateTops,
mapDispatchToProps,
)(主屏幕);


该功能(get_user_servers)定义正确,在LoginScreen中运行良好。

假设它与您导入的功能相同,请尝试从LoginScreen和HomeScreen两个屏幕检查get_user_servers功能的导入。根据您的代码,它看起来像LoginScreen(../../../auth/screens/LoginScreen”)和HomeScreen(../screens/HomeScreen”)不在同一路径中。

如上文所述,您可以检查文件路径,或发布它,以便我们提供帮助。您还可以打开远程调试器,并在componentWillMount内放置:

console.log(this.props)

检查主屏幕是否具有道具内部的功能。

感谢所有花时间帮助我的人,最后我忽略了我的错误。如果您查看此问题中的第三个代码块,您可以看到我像这样导入组件:

import { HomeScreen } from "../screens/HomeScreen";
import { DashboardScreen } from "../screens/DashboardScreen";
这是错误的,我将其更改为:

import HomeScreen from "../screens/HomeScreen";
import DashboardScreen from "../screens/DashboardScreen";

现在一切正常,再次感谢:)

忘记添加。。。有人能帮我解决这个错误吗。这是我第一次使用react导航,我真的不明白为什么我有两个相同的组件,但一个工作,另一个不工作。谢谢:)你好,威廉,是的,功能相同,导入路径正确。这个问题中的第一个代码块只是应用程序中所有“容器”的一个示例。我试着让你们更容易理解我的问题。主屏幕位于“modules/core/screens/HomeScreen.js”登录屏幕位于“modules/core/screens/LoginScreen.js”功能位于“modules/core/actions/core_actions.js”我刚刚发现功能get_user_服务器不在组件主屏幕的道具中。见下面我给Jonatas的评论。这是HomeScreen.js中componentWillMount()中console.log(This.props)的输出:我已经找到了答案,请检查下面的答案。谢谢你的帮助:)你好,Jonatas,路径是正确的。有趣的是,主屏幕没有得到道具的功能。这是componentWillMount()中console.log(This.props)的输出:好的,您可以尝试像这样执行函数吗。get_user_servers(),没有props,一旦这个函数像一个动作而不是redux的道具一样出现。如果出于好奇,你能展示一下LoginScreen中的console.log(this.props)吗?是的,当我尝试这个.get_user_servers()时,我得到了相同的错误(TypeError:this.get_user_servers不是一个函数),这是LoginScreen.js中componentWillMount()中console.log(this.props)的输出,如您所见,get_user_servers函数位于LoginScreen中的道具中,但它不在主屏幕中的道具中。很明显,我的HomeNavigator配置有问题。我已经解决了,请检查下面的答案。谢谢你的帮助:)