Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.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
Javascript 使用Redux创建带有React导航的受保护路线(第3版或第4版)_Javascript_Reactjs_React Native_Redux_React Navigation - Fatal编程技术网

Javascript 使用Redux创建带有React导航的受保护路线(第3版或第4版)

Javascript 使用Redux创建带有React导航的受保护路线(第3版或第4版),javascript,reactjs,react-native,redux,react-navigation,Javascript,Reactjs,React Native,Redux,React Navigation,我们如何使用redux在react导航中创建受保护的路由 假设我有一个包含以下状态的redux存储 const mapStateToProps = state => { return { isAuthenticated: state.profileInfo.isAuthenticated, isLoaded: state.profileInfo.isLoaded, googleProfileLoading: state.profileInfo.googlePro

我们如何使用redux在react导航中创建受保护的路由

假设我有一个包含以下状态的redux存储

const mapStateToProps = state => {
  return {
    isAuthenticated: state.profileInfo.isAuthenticated,
    isLoaded: state.profileInfo.isLoaded,
    googleProfileLoading: state.profileInfo.googleProfileLoading
  }
};
我使用React导航来导航用户

const loginNavigation = createStackNavigator(
  {
    login: {
      screen: Login
    },
    signup: {
      screen: Signup
    }
  },
  {
    headerMode: "none"
  }
)

const allRoutes = createSwitchNavigator(
  {
    home: {
      screen: loginNavigation
    },
    user: {
      screen: user

  },
  {
    initialRouteName: "home"
  }
);

const App = createAppContainer(allRoutes);
现在,若用户并没有登录,我想重定向到登录屏幕

在simple react redux中,我通常会这样做:


有人能帮我弄清楚如何在react-native、redux和react-navigation中创建受保护的路由吗

因此您有一个redux状态变量
已验证

在每个屏幕中,您都需要检查此状态,如果未登录,则允许用户登录屏幕并重置导航堆栈

您可以签入第一次运行时将调用的任何生命周期方法

例如,
constructor
componentWillMount
componentDidMount
,等等

对于redux状态检查

if(!this.props.isAuthenticated){
 this.props.logoutAction();
 this.props.navigation.navigate("Login");//Login or whatever your first screen is...
}
为了清除整个堆栈,您需要创建我们在上一节中调用的操作

export const logoutAction = () => {
  return dispatch => dispatch({ type: LOGOUT_SUCCESS });
};
你必须在你写联合收割机代码的文件中修改一些逻辑

const appReducer = combineReducers({
  loginReducers: LoginReducers,
  ...
  ...
});

export default (rootReducer = (state, action) => {
  if (action.type == LOGOUT_SUCCESS) {
    state = undefined;
  }
  return appReducer(state, action);
});
这将重置整个减速器


现在,如果您想设置注销按钮,则按下按钮的
on
,只需将
isAuthenticated
更改为
false
,然后启动导航方法和注销操作即可。

您可以使用react native router flux进行导航

样本:

<Text
    style={alerts.btn}
    onPress={
        () => Actions.question(
            // send data 
            {
                'code': data_1,
            })}>
    Go to Home
</Text>
Actions.question(
//发送数据
{
“代码”:数据_1,
})}>
回家

react导航具有
createSwitchNavigator
,完全适用于此类情况

您必须将受保护的路由分组到一个主堆栈中。使用
createStackNavigator

const MainStack = createStackNavigator(
  {
    home: { screen: HomeScreen },
    events: { screen: EventsScreen },
    profile: { screen: ProfileScreen },
    ...
  {
    initialRouteName: "home"
  }
);
const AuthStack = createStackNavigator({
    login: { screen: LoginScreen },
    register: { screen: RegisterScreen },
    forgot: { screen: ForgottenPasswordScreen },
    ...
});
然后,再次使用
createStackNavigator
配置身份验证堆栈:

const MainStack = createStackNavigator(
  {
    home: { screen: HomeScreen },
    events: { screen: EventsScreen },
    profile: { screen: ProfileScreen },
    ...
  {
    initialRouteName: "home"
  }
);
const AuthStack = createStackNavigator({
    login: { screen: LoginScreen },
    register: { screen: RegisterScreen },
    forgot: { screen: ForgottenPasswordScreen },
    ...
});
现在是
createSwitchNavigator
-加载
MainStack
堆栈或
AuthStack

const Routes = createSwitchNavigator({
    initialLoading: InitialLoadingScreen,
    auth: AuthStack,
    all: MainStack,
}, {
    initialRouteName: 'initialLoading',
});

export default createAppContainer(Routes);
createSwitchNavigator
将加载
InitialLoadingScreen
,如果用户是否经过身份验证,该屏幕将保存逻辑:

class InitialLoadingScreen extends React.Component {
    constructor(props) {
        super(props);
        this.bootstrapAsync();
    }

    bootstrapAsync = async () => {
        // Load the home screen for the logged in users 
        if (this.props.isAuthenticated) {
            return this.props.navigation.navigate('home');
        }

        // load the Auth screen if the user is NOT logged in
        this.props.navigation.navigate('login');
    }

    // Render any loading content that you like here
    render() {
        return (
            <View style={styles.container}>
                <ActivityIndicator />
            </View>
        );
    }
}

const mapStateToProps = ({ settings }) => ({
    isAuthenticated: state.profileInfo.isAuthenticated,
    isLoaded: state.profileInfo.isLoaded,
    googleProfileLoading: state.profileInfo.googleProfileLoading
});

export default connect(mapStateToProps)(InitialLoadingScreen);
类初始化加载屏幕扩展React.Component{
建造师(道具){
超级(道具);
this.bootstrapAsync();
}
bootstrapAsync=async()=>{
//加载登录用户的主屏幕
如果(此.props.isAuthenticated){
返回此.props.navigation.navigate('home');
}
//如果用户未登录,请加载验证屏幕
this.props.navigation.navigate('login');
}
//在此处呈现您喜欢的任何加载内容
render(){
返回(
);
}
}
常量mapStateToProps=({settings})=>({
isAuthenticated:state.profileInfo.isAuthenticated,
isLoaded:state.profileInfo.isLoaded,
googleProfileLoading:state.profileInfo.googleProfileLoading
});
导出默认连接(MapStateTops)(初始加载屏幕);

如您所见,您可以将
InitialLoadingScreen
连接到redux存储,以访问任何数据并将其用于路由逻辑:)

此外,值得注意的是,在许多情况下,使用switch navigator实际上更好。因为它将卸载非聚焦路由,从而释放内存。@Hristo,每当我的redux状态改变时,我的类InitialLoadingScreen不会重新呈现吗?因此,在每次状态更改时,是否会重定向到
返回此.props.navigation.navigate('home')
此.props.navigation.navigate('login'),我的意思是从你的例子中考虑<代码> const Mead Stuts,当我的ReDux状态发生变化时,它不会重定向到初始屏幕(即home)吗?@ Ziyo,请你通过上面的评论,看看你是否能帮助我OutNO,它不应该重新渲染。当您在每个redux状态下加载它时,switch组件只会执行一次,更改
render()
方法将被调用。不,您不会被重定向,因为
bootstrapAsync
方法是从
构造函数调用的。组件实例化时调用构造函数(一次)。