【问题标题】:react-navigation StackNavigator reset when update Redux statereact-navigation StackNavigator 在更新 Redux 状态时重置
【发布时间】:2018-05-28 06:54:06
【问题描述】:

这里需要一些帮助,我在使用带有反应导航的 redux 时遇到了一些问题。

每当我在 redux 中更新状态时,react-navigation 都会在我的 DrawerNavigator 中重置为 initialRouteName,即 Home

this.props.dispatch 更新 Redux 状态之后,我怎样才能留在该屏幕上?

在将 redux 与 react-navigation 集成时,我应该执行哪些步骤?

非常感谢您的帮助。欣赏它

App.js

这是我声明我的 StackNavigator 的地方,我的 DrawerNavigator 是 嵌套在 StackNavigator

import React, { Component } from "react";
import { connect, Provider } from "react-redux";
import { Platform, BackHandler, View, Text } from "react-native";
import { Root, StyleProvider, StatusBar } from "native-base";
import { StackNavigator, NavigationActions } from "react-navigation";

import Drawer from "./Drawer";
import AuthNavigator from "./components/login/authNavigator";

import Home from "./components/home";
import Settings from "./components/settings";
import UserProfile from "./components/userProfile";

import getTheme from "../native-base-theme/components";


const AppNavigator = token => {
    return StackNavigator(
        {
            Drawer: { screen: Drawer },
            Login: { screen: Login },
            Home: { screen: Home },
            AuthNavigator: { screen: AuthNavigator },
            UserProfile: { screen: UserProfile }
        },
        {
            initialRouteName: token ? "Drawer" : "AuthNavigator",
            stateName: "MainNav",
            headerMode: "none"
        }
    );
};

class App extends Component {
    constructor(props) {
        super(props);

        this.state = {
            isReady: false
        };
    }

    componentDidMount() {
        setTimeout(() => {
            this.setState({ isReady: true });
        }, 500);
    }

    render() {
        let token = null;
        const users = this.props.auth.users;
        const index = this.props.auth.defaultUserIndex;
        if (users.length > 0) {
            token = users[index].token;
        }
        const Layout = AppNavigator(token);
        return (
            <Root>
                <StyleProvider style={getTheme()}>{this.state.isReady ? <Layout /> : <View />}</StyleProvider>
            </Root>
        );
    }
}

var mapStateToProps = state => {
    return {
        auth: state.auth
    };
};

module.exports = connect(mapStateToProps)(App);

Drawer.js

这是我的抽屉,每当我更新 Redux 状态时,应用程序都会弹出 到 DrawerNavigator 的 initialRouteName,即 Home

import React from "react";
import { DrawerNavigator, StackNavigator } from "react-navigation";
import { Dimensions } from "react-native";
import SideBar from "./components/sidebar";

import Home from "./components/home/";
import Settings from "./components/settings/";

const deviceHeight = Dimensions.get("window").height;
const deviceWidth = Dimensions.get("window").width;

const Drawer = DrawerNavigator(
    {
        Home: { screen: Home },
        Settings: { screen: Settings },
        CompanyProfile: { screen: CompanyProfile }
    },
    {
        initialRouteName: "Home",
        contentOptions: {
            activeTintColor: "#e91e63"
        },
        contentComponent: props => <SideBar {...props} />,
        drawerWidth: deviceWidth - 100
    }
);

export default Drawer;

Reducer.js

const defaultState = {
    users: [],
    defaultUserIndex: 0
};

const defaultUserState = {
    phoneNumber: undefined,
    email: undefined,
    name: undefined,
    userId: undefined,
    token: undefined,
    avatar: undefined
};

module.exports = (state = defaultState, action) => {
    console.log("reducer state: ", state);
    switch (action.type) {
        case "AUTH_USER":
        case "UNAUTH_USER":
        case "UPDATE_AVATAR":
        case "UPDATE_PHONENUMBER":
        case "UPDATE_PERSONALDETAILS":
            return { ...state, users: user(state.defaultUserIndex, state.users, action) };

        case "CLEAR_STATE":
            return defaultState;
        default:
            return state;
    }
};

function user(defaultUserIndex, state = [], action) {
    const newState = [...state];
    switch (action.type) {
        case "AUTH_USER":
            return [
                ...state,
                {
                    phoneNumber: action.phoneNumber,
                    name: action.name,
                    email: action.email,
                    userId: action.userId,
                    token: action.token,
                    avatar: action.avatar,
                }
            ];

        case "UNAUTH_USER":
            return state.filter(item => item.token !== action.token);

        case "UPDATE_AVATAR":
            newState[defaultUserIndex].avatar = action.avatar;
            return newState;

        case "UPDATE_PERSONALDETAILS":
            newState[defaultUserIndex].name = action.name;
            newState[defaultUserIndex].email = action.email;
            return newState;
        default:
            return state;
    }
}

【问题讨论】:

    标签: react-native react-redux react-navigation


    【解决方案1】:

    在您的情况下:您在每次渲染调用时创建新的AppNavigator。并且每个实例都有新的导航状态。

    您可以通过将初始化移动到构造函数来修复它,因此每次下一次渲染都会使用相同的对象。

    constructor(props) {
        super(props);
    
        this.state = {
            isReady: false
        };
        const token = //sometihng
        this.navigator =  AppNavigator(token)
    }
    

    另外:探索官方文档https://github.com/react-community/react-navigation/blob/master/docs/guides/Redux-Integration.md中的redux集成示例

    【讨论】:

      猜你喜欢
      • 2020-10-26
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 2020-06-17
      • 1970-01-01
      • 2020-07-27
      相关资源
      最近更新 更多