react native - लॉगिन स्क्रीन के साथ रिएक्ट-नेविगेशन




react-native react-navigation (8)

अक्टूबर २०१ 2017 मैंने इसे हास्यास्पद रूप से भ्रामक पाया, इसलिए यहाँ मेरा समाधान ऊपर से शुरू होता है:

मैं एक नई परियोजना शुरू करने की सलाह देता हूं और शाब्दिक रूप से इस सबका पेस्ट करता हूं और इसके बाद अध्ययन करता हूं। मैंने कोड को बड़े समय के लिए टिप्पणी की है, इसलिए यदि आप किसी विशिष्ट क्षेत्र पर फंस गए हैं, तो शायद संदर्भ आपको ट्रैक पर वापस लाने में मदद कर सकता है।

यह पोस्ट दिखाता है:

  1. प्रतिक्रिया-नेविगेशन को चलाने के लिए पूरी तरह से सेटअप रिएक्टिव नेटिव
  2. Redux के साथ ठीक से एकीकृत
  3. Android बैक बटन संभालें
  4. नेस्ट स्टैक नेविगेटर
  5. बच्चे से अभिभावक नाविकों तक नेविगेट करें
  6. नेविगेशन स्टैक को रीसेट करें
  7. बच्चे से माता-पिता (नेस्टेड) ​​तक नेविगेट करते समय नेविगेशन स्टैक को रीसेट करें

index.js

import { AppRegistry } from 'react-native'
import App from './src/App'

AppRegistry.registerComponent('yourappname', () => App)

src / App.js (यह सबसे महत्वपूर्ण फ़ाइल है क्योंकि यह सभी कतरों को एक साथ लाता है)

import React, { Component } from 'react'
// this will be used to make your Android hardware Back Button work
import { Platform, BackHandler } from 'react-native'
import { Provider, connect } from 'react-redux'
import { addNavigationHelpers } from 'react-navigation'
// this is your root-most navigation stack that can nest
// as many stacks as you want inside it
import { NavigationStack } from './navigation/nav_reducer'
// this is a plain ol' store
// same as const store = createStore(combinedReducers)
import store from './store'

// this creates a component, and uses magic to bring the navigation stack
// into all your components, and connects it to Redux
// don't mess with this or you won't get
// this.props.navigation.navigate('somewhere') everywhere you want it
// pro tip: that's what addNavigationHelpers() does
// the second half of the critical logic is coming up next in the nav_reducers.js file
class App extends Component {
    // when the app is mounted, fire up an event listener for Back Events
    // if the event listener returns false, Back will not occur (note that)
    // after some testing, this seems to be the best way to make
    // back always work and also never close the app
    componentWillMount() {
        if (Platform.OS !== 'android') return
        BackHandler.addEventListener('hardwareBackPress', () => {
            const { dispatch } = this.props
            dispatch({ type: 'Navigation/BACK' })
            return true
        })
    }

    // when the app is closed, remove the event listener
    componentWillUnmount() {
        if (Platform.OS === 'android') BackHandler.removeEventListener('hardwareBackPress')
    }

    render() {
        // slap the navigation helpers on (critical step)
        const { dispatch, nav } = this.props
        const navigation = addNavigationHelpers({
            dispatch,
            state: nav
        })
        return <NavigationStack navigation={navigation} />
    }
}

// nothing crazy here, just mapping Redux state to props for <App />
// then we create your root-level component ready to get all decorated up
const mapStateToProps = ({ nav }) => ({ nav })
const RootNavigationStack = connect(mapStateToProps)(App)

const Root = () => (
    <Provider store={store}>
        <RootNavigationStack />
    </Provider>
)

export default Root

src / नेविगेशन / nav_reducer.js

// NavigationActions is super critical
import { NavigationActions, StackNavigator } from 'react-navigation'
// these are literally whatever you want, standard components
// but, they are sitting in the root of the stack
import Splash from '../components/Auth/Splash'
import SignUp from '../components/Auth/SignupForm'
import SignIn from '../components/Auth/LoginForm'
import ForgottenPassword from '../components/Auth/ForgottenPassword'
// this is an example of a nested view, you might see after logging in
import Dashboard from '../components/Dashboard' // index.js file

const WeLoggedIn = StackNavigator({
    LandingPad: {             // if you don't specify an initial route,
        screen: Dashboard     // the first-declared one loads first
    }
}, {
    headerMode: 'none'
    initialRouteName: LandingPad // if you had 5 components in this stack,
})                               // this one would load when you do
                                 // this.props.navigation.navigate('WeLoggedIn')

// notice we are exporting this one. this turns into <RootNavigationStack />
// in your src/App.js file.
export const NavigationStack = StackNavigator({
    Splash: {
        screen: Splash
    },
    Signup: {
        screen: SignUp
    },
    Login: {
        screen: SignIn
    },
    ForgottenPassword: {
        screen: ForgottenPassword
    },
    WeLoggedIn: {
        screen: WeLoggedIn  // Notice how the screen is a StackNavigator
    }                       // now you understand how it works!
}, {
    headerMode: 'none'
})

// this is super critical for everything playing nice with Redux
// did you read the React-Navigation docs and recall when it said
// most people don't hook it up correctly? well, yours is now correct.
// this is translating your state properly into Redux on initialization    
const INITIAL_STATE = NavigationStack.router.getStateForAction(NavigationActions.init())

// this is pretty much a standard reducer, but it looks fancy
// all it cares about is "did the navigation stack change?"    
// if yes => update the stack
// if no => pass current stack through
export default (state = INITIAL_STATE, action) => {
    const nextState = NavigationStack.router.getStateForAction(action, state)

    return nextState || state
}

src / स्टोर / index.js

// remember when I said this is just a standard store
// this one is a little more advanced to show you
import { createStore, compose, applyMiddleware } from 'redux'
import thunk from 'redux-thunk'
import { persistStore, autoRehydrate } from 'redux-persist'
import { AsyncStorage } from 'react-native'
// this pulls in your combinedReducers
// nav_reducer is one of them
import reducers from '../reducers'

const store = createStore(
    reducers,
    {},
    compose(
        applyMiddleware(thunk),
        autoRehydrate()
    )
)

persistStore(store, { storage: AsyncStorage, whitelist: [] })

// this exports it for App.js    
export default store

src / reducers.js

// here is my reducers file. i don't want any confusion
import { combineReducers } from 'redux'
// this is a standard reducer, same as you've been using since kindergarten
// with action types like LOGIN_SUCCESS, LOGIN_FAIL
import loginReducer from './components/Auth/login_reducer'
import navReducer from './navigation/nav_reducer'

export default combineReducers({
    auth: loginReducer,
    nav: navReducer
})

src / घटकों / प्रमाणीकरण / SignUpForm.js

मैं आपको यहां एक नमूना दिखाऊंगा। यह मेरा नहीं है, मैंने इस विकृति StackOverflow संपादक में आपके लिए इसे टाइप किया है। अगर आप इसकी सराहना करते हैं तो कृपया मुझे अंगूठा दें :)

import React, { Component } from 'react'
import { View, Text, TouchableOpacity } from 'react-native

// notice how this.props.navigation just works, no mapStateToProps
// some wizards made this, not me
class SignUp extends Component {
    render() {
        return (
            <View>
                <Text>Signup</Text>
                <TouchableOpacity onPress={() => this.props.navigation.navigate('Login')}>
                    <Text>Go to Login View</Text>
                </TouchableOpacity>
            </View>
        )
    }
}

export default SignUp

src / घटकों / प्रमाणीकरण / LoginForm.js

मैं तुम्हें एक गूंगा शैली एक भी दिखाऊंगा, सुपर डोप बैक बटन के साथ

import React from 'react'
import { View, Text, TouchableOpacity } from 'react-native

// notice how we pass navigation in
const SignIn = ({ navigation }) => {
    return (
        <View>
            <Text>Log in</Text>
            <TouchableOpacity onPress={() => navigation.goBack(null)}>
                <Text>Go back to Sign up View</Text>
            </TouchableOpacity>
        </View>
    )
}

export default SignIn

src / घटकों / प्रमाणीकरण / Splash.js

यहाँ एक स्प्लैश स्क्रीन है जिसके साथ आप खेल सकते हैं। मैं इसे उच्च-क्रम घटक की तरह उपयोग कर रहा हूं:

import React, { Component } from 'react'
import { StyleSheet, View, Image, Text } from 'react-native'
// https://github.com/oblador/react-native-animatable
// this is a library you REALLY should be using
import * as Animatable from 'react-native-animatable' 
import { connect } from 'react-redux'
import { initializeApp } from './login_actions'

class Splash extends Component {
    constructor(props) {
        super(props)
        this.state = {}
    }

    componentWillMount() {
        setTimeout(() => this.props.initializeApp(), 2000)
    }

    componentWillReceiveProps(nextProps) {
        // if (!nextProps.authenticated) this.props.navigation.navigate('Login')
        if (nextProps.authenticated) this.props.navigation.navigate('WeLoggedIn')
    }

    render() {
        const { container, image, text } = styles
        return (
            <View style={container}>
                    <Image
                        style={image}
                        source={require('./logo.png')}
                    />

                    <Animatable.Text
                        style={text}
                        duration={1500}
                        animation="rubberBand"
                        easing="linear"
                        iterationCount="infinite"
                    >
                        Loading...
                    </Animatable.Text>
                    <Text>{(this.props.authenticated) ? 'LOGGED IN' : 'NOT LOGGED IN'}</Text>
            </View>
        )
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F0F0F0'
    },
    image: {
        height: 110,
        resizeMode: 'contain'
    },
    text: {
        marginTop: 50,
        fontSize: 15,
        color: '#1A1A1A'
    }
})

// my LOGIN_SUCCESS action creator flips state.auth.isAuthenticated to true    
// so this splash screen just watches it
const mapStateToProps = ({ auth }) => {
    return {
        authenticated: auth.isAuthenticated
    }
}

export default connect(mapStateToProps, { initializeApp })(Splash)

src / घटकों / प्रमाणीकरण / login_actions.js

मैं आपको initializeApp () दिखाने जा रहा हूं ताकि आपको कुछ विचार मिलें:

import {
    INITIALIZE_APP,
    CHECK_REMEMBER_ME,
    TOGGLE_REMEMBER_ME,
    LOGIN_INITIALIZE,
    LOGIN_SUCCESS,
    LOGIN_FAIL,
    LOGOUT
} from './login_types'

//INITIALIZE APP
// this isn't done, no try/catch and LOGIN_FAIL isn't hooked up
// but you get the idea
// if a valid JWT is detected, they will be navigated to WeLoggedIn
export const initializeApp = () => {
    return async (dispatch) => {
        dispatch({ type: INITIALIZE_APP })

        const user = await AsyncStorage.getItem('token')
            .catch((error) => dispatch({ type: LOGIN_FAIL, payload: error }))

        if (!user) return dispatch({ type: LOGIN_FAIL, payload: 'No Token' })

        return dispatch({
            type: LOGIN_SUCCESS,
            payload: user
        })
        // navigation.navigate('WeLoggedIn')
        // pass navigation into this function if you want
    }
}

अन्य उपयोग के मामलों में, आप उच्च-क्रम घटक को पसंद कर सकते हैं। वे वेब के लिए रिएक्ट के समान ही काम करते हैं। उडेमी पर स्टीफन ग्राइडर के ट्यूटोरियल सर्वश्रेष्ठ, अवधि हैं।

src / अस्थायी / require_auth.js

import React, { Component } from 'react'
import { connect } from 'react-redux'

export default function (ComposedComponent) {
    class Authentication extends Component {

        componentWillMount() {
            if (!this.props.authenticated) this.props.navigation.navigate('Login')
        }

        componentWillUpdate(nextProps) {
            if (!nextProps.authenticated) this.props.navigation.navigate('Login')
        }

        render() {
            return (
                <ComposedComponent {...this.props} />
            )
        }
    }

    const mapStateToProps = ({ auth }) => {
        return {
            authenticated: auth.isAuthenticated
        }
    }

    return connect(mapStateToProps)(Authentication)
}

आप इसे इस तरह से उपयोग करते हैं:

import requireAuth from '../HOC/require_auth'

class RestrictedArea extends Component {
    // ... normal view component
}

//map state to props

export default connect(mapStateToProps, actions)(requireAuth(RestrictedArea))

वहाँ, वह सब कुछ है जो मेरी इच्छा है कि किसी ने मुझे बताया और दिखाया।

TLDR App.js , और nav_reducer.js फ़ाइलें सही पाने के लिए सबसे महत्वपूर्ण हैं। बाकी पुराना परिचित है। मेरे उदाहरणों को आपको एक विशाल उत्पादकता मशीन में तेजी लाना चाहिए।

[संपादित करें] यहां मेरा लॉगआउट एक्शन क्रिएटर है। आप इसे बहुत उपयोगी पाएंगे यदि आप अपने नेविगेशन स्टैक को मिटा देना चाहते हैं तो उपयोगकर्ता एंड्रॉइड हार्डवेयर बैक बटन को दबा नहीं सकता है और एक स्क्रीन पर वापस जा सकता है जिसे प्रमाणीकरण की आवश्यकता होती है:

//LOGOUT
export const onLogout = (navigation) => {
    return async (dispatch) => {
        try {
            await AsyncStorage.removeItem('token')

            navigation.dispatch({
                type: 'Navigation/RESET',
                index: 0,
                actions: [{ type: 'Navigate', routeName: 'Login' }]
            })

            return dispatch({ type: LOGOUT })
        } catch (errors) {
            // pass the user through with no error
            // this restores INITIAL_STATE (see login_reducer.js)
            return dispatch({ type: LOGOUT })
        }
    }
}

// login_reducer.js
    case LOGOUT: {
        return {
            ...INITIAL_STATE,
            isAuthenticated: false,
        }
    }

[बोनस एडिट] मैं एक बच्चे के स्टैक नेविगेटर से एक मूल स्टैक नेविगेटर में कैसे नेविगेट करूं?

यदि आप अपने बच्चे के स्टैक नेविगेटर में से एक को नेविगेट करना चाहते हैं और स्टैक को रीसेट करना चाहते हैं, तो यह करें:

  1. एक घटक जोड़ने वाले कोड के अंदर रहें, जहां आपके पास यह है। this.props.navigation उपलब्ध है
  2. एक घटक बनाएं जैसे <Something />
  3. इसमें नेविगेशन पास करें, जैसे: <Something navigation={this.props.navigation} />
  4. उस घटक के कोड में जाएं
  5. ध्यान दें कि आपके पास इस चाइल्ड कंपोनेंट के अंदर यह कैसे है
  6. अब आप कर रहे हैं, बस इसे कॉल करें this.props.navigation.navigate('OtherStackScreen') और आपको प्रतिक्रिया मूल निवासी को समस्या के बिना जादुई तरीके से वहां जाना चाहिए

लेकिन, मैं मूल स्टैक पर नेविगेट करते समय पूरे स्टैक को सुरक्षित करना चाहता हूं

  1. एक्शन क्रिएटर या ऐसा कुछ कहें (चरण 6 से शुरू): this.props.handleSubmit(data, this.props.navigation)
  2. एक्शन क्रिएटर में जाएं और इस कोड को देखें जो वहां हो सकता है:

actionCreators.js

// we need this to properly go from child to parent navigator while resetting
// if you do the normal reset method from a child navigator:
this.props.navigation.dispatch({
    type: 'Navigation/RESET',
    index: 0,
    actions: [{ type: 'Navigate', routeName: 'SomeRootScreen' }]
})

// you will see an error about big red error message and
// screen must be in your current stack 
// don't worry, I got your back. do this
// (remember, this is in the context of an action creator):
import { NavigationActions } from 'react-navigation'

// notice how we passed in this.props.navigation from the component,
// so we can just call it like Dan Abramov mixed with Gandolf
export const handleSubmit = (token, navigation) => async (dispatch) => {
    try {
        // lets do some operation with the token
        await AsyncStorage.setItem('[email protected]', token)
        // let's dispatch some action that doesn't itself cause navigation
        // if you get into trouble, investigate shouldComponentUpdate()
        // and make it return false if it detects this action at this moment
        dispatch({ type: SOMETHING_COMPLETE })

        // heres where it gets 100% crazy and exhilarating
        return navigation.dispatch(NavigationActions.reset({
            // this says put it on index 0, aka top of stack
            index: 0,
            // this key: null is 9001% critical, this is what
            // actually wipes the stack
            key: null,
            // this navigates you to some screen that is in the Root Navigation Stack
            actions: [NavigationActions.navigate({ routeName: 'SomeRootScreen' })]
        }))
    } catch (error) {
        dispatch({ type: SOMETHING_COMPLETE })
        // User should login manually if token fails to save
        return navigation.dispatch(NavigationActions.reset({
            index: 0,
            key: null,
            actions: [NavigationActions.navigate({ routeName: 'Login' })]
        }))
    }
}

मैं एक एंटरप्राइज़-ग्रेड रिएक्ट नेटिव ऐप के अंदर इस कोड का उपयोग कर रहा हूं, और यह खूबसूरती से काम करता है।

react-navigation कार्यात्मक प्रोग्रामिंग की तरह है। यह छोटे "शुद्ध नेविगेशन" टुकड़ों में संभाला जाने के लिए डिज़ाइन किया गया है जो एक साथ अच्छी तरह से रचना करते हैं। यदि आप ऊपर वर्णित रणनीति को नियोजित करते हैं, तो आप अपने आप को फिर से प्रयोग करने योग्य नेविगेशन लॉजिक बना पाएंगे, जिसे आप केवल आवश्यकतानुसार पेस्ट कर सकते हैं।

मैं एक प्रारंभिक LOGIN स्क्रीन बनाने के लिए रिएक्शन-नेविगेशन का उपयोग करने की कोशिश कर रहा हूं, जिसमें कोई टैब्बर और हेडर नहीं है, और एक बार उपयोगकर्ता सफलतापूर्वक प्रमाणित हो जाने के बाद LISTRECORD नामक दूसरी स्क्रीन पर नेविगेट करेगा जिसमें एक टैब्बर, हेडर और कोई बैक बटन विकल्प नहीं है। किसी को भी इस में अनुभव है और साझा कर सकते हैं?

सारांश में, क्या प्रतिक्रिया-नेविगेशन के साथ प्राप्त करने की कोशिश कर रहा नीचे वर्णित है ...

स्क्रीन 1: लॉगिन स्क्रीन (कोई हेडर और टैबबार नहीं)
प्रमाणीकृत ...
स्क्रीन 2: LISTRECORD (हेडर, टैब्बर और नो बैक बटन)
टैबबार में स्क्रीन 3, स्क्रीन 4 पर नेविगेशन के लिए अन्य टैब भी हैं ...


मुझे इसकी आवश्यकता थी, लेकिन किसी भी अन्य समाधान ने मेरे लिए काम नहीं किया। तो यहाँ एक दराज के साथ एक लॉगिन के लिए मेरा समाधान है (बाद में उचित प्रमाणीकरण के बाद ही पहुँचा जा सकता है, और अंदर के प्रत्येक स्क्रीन का अपना नेविगेशन है)। मेरे कोड में एक DrawerNavigator है, लेकिन उसी का उपयोग TabNavigator (createBottomTabNavigator) के लिए किया जा सकता है।

wrapScreen = stackNavigator =>
  createStackNavigator(stackNavigator, {
    defaultNavigationOptions: ({ navigation }) => ({
      headerStyle: { backgroundColor: "white" },
      headerLeft: MenuButton(navigation)
    })
  });

const DrawerStack = createDrawerNavigator(
  {
    // Menu Screens
    firstSection: wrapScreen({ FirstScreen: FirstScreen }),
    secondSection: wrapScreen({
      SecondHomeScreen: SecondHomeScreen,
      SecondOptionScreen: SecondOptionScreen
    }),
    settingSection: wrapScreen({ SettingScreen: SettingScreen }),
    aboutSection: wrapScreen({ AboutScreen: AboutScreen })
  },
  {
    initialRouteName: "firstSection",
    gesturesEnabled: false,
    drawerPosition: "left",
    contentComponent: DrawerContainer
  }
);

const PrimaryNav = createSwitchNavigator(
  {
    loginStack: LoginScreen,
    appStack: DrawerStack
  },
  { initialRouteName: "loginStack" }
);

export default createAppContainer(PrimaryNav);

मुझे उम्मीद है कि यह दूसरों की मदद कर सकता है।


इस प्रकार मैंने इस कार्यक्षमता को प्राप्त किया।

फ़ाइल 0) index.android.js

'use strict'

import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View
} from 'react-native';

import Root from 'src/containers/Root'


AppRegistry.registerComponent('Riduk', () => Root);

फाइल 1) माय रूट.जेएस

class Root extends Component {
    constructor(props) {
      super(props);
      this.state = {
        authenticated:false,
        isLoading:true,
        store: configureStore(() => this.setState({isLoading: false})),
      };
  }

  componentDidMount() {
    //you can do check with authentication with fb, gmail and other right here
   /* firebase.auth().onAuthStateChanged((user) => {
      if (user) {
        api.resetRouteStack(dispatch, "UserProfile");
        console.log("authenticated", user);
      } else {
        api.resetRouteStack(dispatch, "Landing");
        console.log("authenticated", false);
      }
    });*/

  }

  render() {
    if (this.state.isLoading) {  //checking if the app fully loaded or not, splash screen can be rendered here
        return null;
      }
      return (

        <Provider store={this.state.store}>
          <App/>
        </Provider>

      );
  }
}
module.exports = Root;

2) App.js

import AppWithNavigationState,{AppBeforeLogin} from './AppNavigator';

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

    render(){
        let {authenticated} = this.props;
        if(authenticated){
            return <AppWithNavigationState/>;
        }
        return <AppBeforeLogin/>


    }
}

export default connect(state =>({authenticated: state.user.authenticated}))(App);

3) AppNavigator.js

'use strict';

import React, {Component} from 'react';
import { View, BackAndroid, StatusBar,} from 'react-native';
import {
  NavigationActions,
  addNavigationHelpers,
  StackNavigator,
} from 'react-navigation';
import { connect} from 'react-redux';

import LandingScreen from 'src/screens/landingScreen';
import Login from 'src/screens/login'
import SignUp from 'src/screens/signUp'
import ForgotPassword from 'src/screens/forgotPassword'
import UserProfile from 'src/screens/userProfile'
import Drawer from 'src/screens/drawer'



const routesConfig = {
  //Splash:{screen:SplashScreen},
  Landing:{screen:LandingScreen},
  Login: { screen: Login },
  SignUp: { screen: SignUp },
  ForgotPassword: { screen: ForgotPassword },
  UserProfile:{screen:UserProfile},
};


export const AppNavigator = StackNavigator(routesConfig, {initialRouteName:'UserProfile'}); //navigator that will be used after login

निर्यात कांस्टेबल AppBeforeLogin = StackNavigator (pathConfig); // प्रवेश करने से पहले नाविक

class AppWithNavigationState extends Component{
  constructor(props) {
    super(props);
    this.handleBackButton = this.handleBackButton.bind(this);
  }

  componentDidMount() {
    BackAndroid.addEventListener('hardwareBackPress', this.handleBackButton);
  }

  componentWillUnmount() {
    BackAndroid.removeEventListener('hardwareBackPress', this.handleBackButton);
  }

  //added to handle back button functionality on android
  handleBackButton() {
    const {nav, dispatch} = this.props;

    if (nav && nav.routes && nav.routes.length > 1) {
      dispatch(NavigationActions.back());
      return true;
    }
    return false;
  }

  render() {
    let {dispatch, nav} = this.props;

    return (
          <View style={styles.container}>
            {(api.isAndroid()) &&
              <StatusBar
                  backgroundColor="#C2185B"
                  barStyle="light-content"
              />
            }
            <AppNavigator navigation={addNavigationHelpers({ dispatch, state: nav })}/>
          </View>
    );
  }
};
export default connect(state =>({nav: state.nav}))(AppWithNavigationState);
//module.exports = AppWithNavigationState;

टैब्बर और हेडर को अलग-अलग कंपोनेंट बनाएं और केवल उन्हें अन्य कंपोनेंट्स में शामिल करें। "BACK" को अक्षम करने के बारे में, डॉक्स में "अवरुद्ध नेविगेशन क्रियाओं" के बारे में एक अनुभाग है: https://reactnavigation.org/docs/routers/

आपको स्क्रीन 2 के लिए इसका उपयोग करने में सक्षम होना चाहिए।


यह अच्छा है कि आप प्रतिक्रिया-नेविगेशन का उपयोग कर रहे हैं, जिसमें आपके एप्लिकेशन के लिए अधिकांश सुविधाओं का एक अच्छा समर्थन है। मेरी सलाह का समर्थन करता है

1) प्रमाणीकरण पर

प्रतिक्रिया-मूल में यह अच्छा फीचर स्टेट वैरिएबल होता है, जब बदले हुए दृश्य फिर से प्रस्तुत किए जाते हैं। आप अपने एप्लिकेशन के उपयोगकर्ताओं के "राज्य" (प्रमाणित / आगंतुक) को समझने के लिए राज्य चर का उपयोग कर सकते हैं।

यहां एक सरल कार्यान्वयन है जहां एक उपयोगकर्ता लॉगिन बटन दबाकर लॉग इन करता है

उपयोगकर्ता द्वारा लॉग इन करने पर प्रवेश पृष्ठ

import React from 'react';

import Home from './layouts/users/home/Home';
import Login from './layouts/public/login/Login';


class App extends React.Component {

    state = {
        isLoggedIn: false
      }

    componentDidMount() {
        //Do something here like hide splash screen
    }

    render(){
        if (this.state.isLoggedIn)
         return <Home

             />;
     else
         return <Login
         onLoginPress={() => this.setState({isLoggedIn: true})}
             />;

    }
}

export default App;

2) हैडर से लॉगिन करें

लॉगिन दृश्य

import React from 'react';
//Non react-native import
import { TabNavigator } from 'react-navigation'
import Icon from 'react-native-vector-icons/MaterialIcons'
import LoginStyles from './Style'
//Do all imports found in react-native here
import {
    View,
    Text,
    TextInput,
    StyleSheet,
    TouchableOpacity,
} from 'react-native';


class Login extends React.Component {
  render(){

         return (
       <View>
       <Text>
         Login area
       </Text>

       <TouchableOpacity
                style={LoginStyles.touchable}
                onPress={this.props.onLoginPress}   >

                <Text style={LoginStyles.button}>
               Login
                </Text>
                </TouchableOpacity>



       </View>
     );

    }
}

export default Login;

लॉगिन स्क्रीन में शैली की विशेषताओं को हटाने और आयात सहित तुम्हारा जोड़ने के लिए याद रखें, मैं उन्हें वहां छोड़ रहा हूं क्योंकि यह आपकी मदद कर सकता है और विचार कर सकता है कि आप कैसे प्रोजेक्ट को फिर से व्यवस्थित कर सकते हैं

हालाँकि यह अभी भी शैलियों के बिना काम करता है इसलिए आप इन्हें हटा सकते हैं, लॉगिन बटन पर क्लिक करने से आप होम स्क्रीन पर पहुंच जाएंगे, क्योंकि स्थिति बदल गई है और नए राज्य के अनुसार दृश्य को फिर से प्रस्तुत करना होगा

आपकी आवश्यकता के अनुसार लॉगिन स्क्रीन एक हेडर के बिना है

टैब के साथ होम स्क्रीन

3) हेडर के साथ टैब्स इस कार्यक्षमता को प्राप्त करने के लिए सामान्य विधि एक StackNavigator में एक TabNavigator जोड़ने के लिए।

       import React from 'react';
    import {
     DrawerNavigator,
     StackNavigator,
     TabNavigator,
     TabBarBottom,
     NavigationActions
    } from 'react-navigation'
    import Icon from 'react-native-vector-icons/MaterialIcons'


    //Do all imports found in react-native here
    import {
        View,
        Text,
        TextInput,
        StyleSheet,
        TouchableOpacity,
    } from 'react-native';

class PicturesTab extends React.Component {
  static navigationOptions = {
    tabBarLabel: 'Pictures',
    // Note: By default the icon is only shown on iOS. Search the showIcon option below.
    tabBarIcon: ({ tintColor }) =>  (<Icon size={30} color={tintColor} name="photo" />),
  };

  render() { return <Text>Pictures</Text> }
}

class VideosTab extends React.Component {
  static navigationOptions = {
    tabBarLabel: 'Videos',
    tabBarIcon: ({ tintColor }) =>  (<Icon size={30} color={tintColor} name="videocam" />),
  };

  render() { return <Text>Videos</Text> }

}

    const HomeTabs = TabNavigator({
      Pictures: {
        screen: PicturesTab,
      },
      Videos: {
        screen: VideosTab,
      },
    }, {
        tabBarComponent: TabBarBottom,
        tabBarPosition: 'bottom',
        tabBarOptions: {
        //Thick teal #094545
        activeTintColor: '#094545',
        showLabel: false,
        activeBackgroundColor: '#094545',
        inactiveTintColor: '#bbb',
        activeTintColor: '#fff',


      }
    });



    const HomeScreen = StackNavigator({
      HomeTabs : { screen: HomeTabs,
        navigationOptions: ({ navigation }) => ({
        // title :'title',
        // headerRight:'put some component here',
        // headerLeft:'put some component here',
         headerStyle: {
           backgroundColor: '#094545'
         }


       })
     },
    });




    export default HomeScreen;

अस्वीकरण: कोड त्रुटियों को वापस कर सकता है क्योंकि कुछ फाइलें गायब हो सकती हैं या कुछ टाइपोस मौजूद हो सकते हैं जिन्हें आपको विवरणों के लिए सावधानीपूर्वक जांचना चाहिए और जहां इस कोड को कॉपी करना है वहां neccesary बदल दें। किसी भी समस्या को टिप्पणी के रूप में चिपकाया जा सकता है। आशा है कि यह किसी की मदद करता है।

आप टैब कॉन्फ़िगरेशन में आइकन भी हटा सकते हैं या प्रतिक्रिया-देशी-वेक्टर आइकन स्थापित कर सकते हैं जो टैब को महान बनाता है!


यह मेरा समाधान @ पर आधारित सिफारिश पर आधारित है:

  1. एक शीर्ष स्तर का नेविगेटर बनाएं और यह एक स्टैक नेविगेटर होना चाहिए जो एक लॉगिन स्क्रीन प्रदान करता है।
  2. इस शीर्ष स्तर के नेविगेटर के भीतर एक और स्क्रीन आपके ऐप का मुख्य-नेविगेटर होना चाहिए।
  3. जब आपकी लॉगिन स्थिति संतुष्ट हो जाती है, तो आप मुख्य स्टैक को सिर्फ मेन-नेविगेटर में रीसेट कर देते हैं।

यह कोड उपरोक्त को पूरा करने के लिए नंगे न्यूनतम करता है।

एक नया प्रतिक्रिया-देशी प्रोजेक्ट बनाएँ, फिर इसे काम करने के लिए index.ios.js और / या index.android.js में नीचे दिए गए कोड की प्रतिलिपि बनाएँ।

import React, { Component } from 'react';
import {
  AppRegistry,
  Text,
  Button
} from 'react-native';
import { StackNavigator, NavigationActions } from 'react-navigation';

const resetAction = NavigationActions.reset({
  index: 0,
  actions: [
    NavigationActions.navigate({ routeName: 'Main' })
  ]
});

class LoginScreen extends Component {
  login() {
    this.props.navigation.dispatch(resetAction);
  }

  render() {
    return <Button title='Login' onPress={() => {this.login()}} />;
  }
}

class FeedScreen extends Component {
  render() {
    return <Text>This is my main app screen after login</Text>;
  }
}

//Create the navigation
const MainNav = StackNavigator({
    Feed: { screen: FeedScreen },
});

const TopLevelNav = StackNavigator({
  Login: { screen: LoginScreen },
  Main: { screen: MainNav },
}, {
  headerMode: 'none',
});


AppRegistry.registerComponent('ReactNav2', () => TopLevelNav);


react-navigation अब एक SwitchNavigator जो नाविकों के बीच वांछित व्यवहार और स्विचिंग में मदद करता है। वर्तमान में इसके बारे में बहुत अधिक दस्तावेज नहीं हैं, लेकिन लाइब्रेरी द्वारा बनाया गया एक बहुत अच्छा उदाहरण स्नैक है जो एक साधारण प्रमाणीकरण प्रवाह कार्यान्वयन दिखाता है। आप इसे here देख सकते here

SwitchNavigator संदर्भ

SwitchNavigator(RouteConfigs, SwitchNavigatorConfig)

डॉक्स से उदाहरण

const AppStack = StackNavigator({ Home: HomeScreen, Other: OtherScreen });
const AuthStack = StackNavigator({ SignIn: SignInScreen });

export default SwitchNavigator(
  {
    AuthLoading: AuthLoadingScreen,
    App: AppStack,
    Auth: AuthStack,
  },
  {
    initialRouteName: 'AuthLoading',
  }
);




react-navigation