React
1 Introduction to React
1-1 What is React?
1-2 History and Evolution of React
1-3 Key Features of React
1-4 Setting Up the Development Environment
2 JSX and Components
2-1 Introduction to JSX
2-2 Writing JSX Syntax
2-3 Creating Components
2-4 Functional vs Class Components
2-5 Props and State
3 React State Management
3-1 Understanding State
3-2 Managing State in Functional Components
3-3 Managing State in Class Components
3-4 Lifting State Up
3-5 Context API
4 React Hooks
4-1 Introduction to Hooks
4-2 useState Hook
4-3 useEffect Hook
4-4 useContext Hook
4-5 Custom Hooks
5 React Router
5-1 Introduction to React Router
5-2 Setting Up React Router
5-3 Route, Link, and NavLink
5-4 Nested Routes
5-5 Programmatic Navigation
6 Handling Events in React
6-1 Introduction to Events
6-2 Handling Events in Functional Components
6-3 Handling Events in Class Components
6-4 Synthetic Events
6-5 Event Bubbling and Capturing
7 Forms and Controlled Components
7-1 Introduction to Forms in React
7-2 Controlled Components
7-3 Handling Form Submission
7-4 Form Validation
7-5 Uncontrolled Components
8 React Lifecycle Methods
8-1 Introduction to Lifecycle Methods
8-2 Component Mounting Phase
8-3 Component Updating Phase
8-4 Component Unmounting Phase
8-5 Error Handling
9 React and APIs
9-1 Introduction to APIs
9-2 Fetching Data with useEffect
9-3 Handling API Errors
9-4 Caching API Responses
9-5 Real-time Data with WebSockets
10 React Performance Optimization
10-1 Introduction to Performance Optimization
10-2 React memo and PureComponent
10-3 useCallback and useMemo Hooks
10-4 Lazy Loading Components
10-5 Code Splitting
11 React Testing
11-1 Introduction to Testing in React
11-2 Writing Unit Tests with Jest
11-3 Testing Components with React Testing Library
11-4 Mocking Dependencies
11-5 End-to-End Testing with Cypress
12 Advanced React Patterns
12-1 Higher-Order Components (HOC)
12-2 Render Props
12-3 Compound Components
12-4 Context and Provider Pattern
12-5 Custom Hooks for Reusability
13 React and TypeScript
13-1 Introduction to TypeScript
13-2 Setting Up TypeScript with React
13-3 TypeScript Basics for React
13-4 TypeScript with Hooks
13-5 TypeScript with React Router
14 React and Redux
14-1 Introduction to Redux
14-2 Setting Up Redux with React
14-3 Actions, Reducers, and Store
14-4 Connecting React Components to Redux
14-5 Middleware and Async Actions
15 React and GraphQL
15-1 Introduction to GraphQL
15-2 Setting Up GraphQL with React
15-3 Querying Data with Apollo Client
15-4 Mutations and Subscriptions
15-5 Caching and Optimistic UI
16 React Native
16-1 Introduction to React Native
16-2 Setting Up React Native Development Environment
16-3 Building a Simple App
16-4 Navigation in React Native
16-5 Styling and Animations
17 Deployment and Best Practices
17-1 Introduction to Deployment
17-2 Deploying React Apps to GitHub Pages
17-3 Deploying React Apps to Netlify
17-4 Deploying React Apps to AWS
17-5 Best Practices for React Development
React Native Explained

React Native Explained

Key Concepts

What is React Native?

React Native is a framework for building native mobile applications using JavaScript and React. It allows developers to create mobile apps for iOS and Android with a single codebase.

React Native vs React

React is a JavaScript library for building user interfaces, primarily for web applications. React Native, on the other hand, is a framework that uses React to build native mobile applications. While React renders web components, React Native renders native components.

Components

Components in React Native are the building blocks of the user interface. They can be either functional or class-based. Common components include View, Text, Image, and ScrollView.

Example:

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

        const App = () => {
            return (
                <View>
                    <Text>Hello, React Native!</Text>
                </View>
            );
        };

        export default App;
    

Props

Props (short for properties) are used to pass data from one component to another. They are read-only and help in making components reusable.

Example:

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

        const Greeting = (props) => {
            return (
                <View>
                    <Text>Hello, {props.name}!</Text>
                </View>
            );
        };

        const App = () => {
            return (
                <View>
                    <Greeting name="Alice" />
                    <Greeting name="Bob" />
                </View>
            );
        };

        export default App;
    

State

State is a built-in object in React Native that stores data or information about the component. The state of a component can change over time, and whenever it changes, the component re-renders.

Example:

        import React, { useState } from 'react';
        import { View, Text, Button } from 'react-native';

        const Counter = () => {
            const [count, setCount] = useState(0);

            return (
                <View>
                    <Text>Count: {count}</Text>
                    <Button title="Increment" onPress={() => setCount(count + 1)} />
                </View>
            );
        };

        export default Counter;
    

Styling

Styling in React Native is done using JavaScript objects. Styles are applied to components using the style prop. React Native also supports Flexbox for layout.

Example:

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

        const App = () => {
            return (
                <View style={styles.container}>
                    <Text style={styles.text}>Styled Text</Text>
                </View>
            );
        };

        const styles = StyleSheet.create({
            container: {
                flex: 1,
                justifyContent: 'center',
                alignItems: 'center',
                backgroundColor: '#f5fcff',
            },
            text: {
                fontSize: 20,
                color: '#333',
            },
        });

        export default App;
    

Navigation

Navigation in React Native is handled using libraries like React Navigation. It provides a way to navigate between screens and manage the navigation stack.

Example:

        import React from 'react';
        import { NavigationContainer } from '@react-navigation/native';
        import { createStackNavigator } from '@react-navigation/stack';
        import HomeScreen from './HomeScreen';
        import DetailsScreen from './DetailsScreen';

        const Stack = createStackNavigator();

        const App = () => {
            return (
                <NavigationContainer>
                    <Stack.Navigator initialRouteName="Home">
                        <Stack.Screen name="Home" component={HomeScreen} />
                        <Stack.Screen name="Details" component={DetailsScreen} />
                    </Stack.Navigator>
                </NavigationContainer>
            );
        };

        export default App;
    

Platform-Specific Code

React Native allows you to write platform-specific code using the Platform module. This is useful when you need to implement different functionality or UI for iOS and Android.

Example:

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

        const App = () => {
            return (
                <View>
                    <Text>Platform: {Platform.OS}</Text>
                </View>
            );
        };

        export default App;
    

Networking

Networking in React Native is done using the Fetch API or libraries like Axios. It allows you to make HTTP requests to fetch or send data to a server.

Example:

        import React, { useState, useEffect } from 'react';
        import { View, Text, ActivityIndicator } from 'react-native';

        const App = () => {
            const [data, setData] = useState([]);
            const [loading, setLoading] = useState(true);

            useEffect(() => {
                fetch('https://api.example.com/data')
                    .then(response => response.json())
                    .then(data => {
                        setData(data);
                        setLoading(false);
                    });
            }, []);

            if (loading) {
                return <ActivityIndicator />;
            }

            return (
                <View>
                    {data.map(item => (
                        <Text key={item.id}>{item.name}</Text>
                    ))}
                </View>
            );
        };

        export default App;
    

AsyncStorage

AsyncStorage is a simple, asynchronous, persistent key-value storage system for React Native. It is used to store data locally on the device.

Example:

        import React, { useState } from 'react';
        import { View, Text, Button } from 'react-native';
        import AsyncStorage from '@react-native-async-storage/async-storage';

        const App = () => {
            const [value, setValue] = useState('');

            const storeData = async () => {
                try {
                    await AsyncStorage.setItem('@storage_Key', 'stored value');
                } catch (e) {
                    console.error(e);
                }
            };

            const getData = async () => {
                try {
                    const value = await AsyncStorage.getItem('@storage_Key');
                    if (value !== null) {
                        setValue(value);
                    }
                } catch (e) {
                    console.error(e);
                }
            };

            return (
                <View>
                    <Button title="Store Data" onPress={storeData} />
                    <Button title="Get Data" onPress={getData} />
                    <Text>Value: {value}</Text>
                </View>
            );
        };

        export default App;
    

Gesture Handling

Gesture handling in React Native is done using the PanResponder API. It allows you to detect and respond to gestures like taps, swipes, and pans.

Example:

        import React, { useRef } from 'react';
        import { View, Text, PanResponder } from 'react-native';

        const App = () => {
            const panResponder = useRef(
                PanResponder.create({
                    onStartShouldSetPanResponder: () => true,
                    onPanResponderGrant: () => {
                        console.log('Gesture started');
                    },
                    onPanResponderRelease: () => {
                        console.log('Gesture ended');
                    },
                })
            ).current;

            return (
                <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
                    <Text {...panResponder.panHandlers}>Gesture Area</Text>
                </View>
            );
        };

        export default App;
    

Animations

Animations in React Native are done using the Animated API. It allows you to create smooth and performant animations.

Example:

        import React, { useRef } from 'react';
        import { Animated, View, Button } from 'react-native';

        const App = () => {
            const fadeAnim = useRef(new Animated.Value(0)).current;

            const fadeIn = () => {
                Animated.timing(fadeAnim, {
                    toValue: 1,
                    duration: 1000,
                    useNativeDriver: true,
                }).start();
            };

            const fadeOut = () => {
                Animated.timing(fadeAnim, {
                    toValue: 0,
                    duration: 1000,
                    useNativeDriver: true,
                }).start();
            };

            return (
                <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
                    <Animated.View style={{ opacity: fadeAnim }}>
                        <View style={{ width: 100, height: 100, backgroundColor: 'blue' }}></View>
                    </Animated.View>
                    <Button title="Fade In" onPress={fadeIn} />
                    <Button title="Fade Out" onPress={fadeOut} />
                </View>
            );
        };

        export default App;
    

Debugging

Debugging in React Native can be done using tools like React Native Debugger and Flipper. These tools provide a way to inspect the component tree, view logs, and set breakpoints.

Performance Optimization

Performance optimization in React Native involves techniques like using PureComponent, memoization, and minimizing re-renders. It also includes optimizing images and using FlatList for large lists.

Third-Party Libraries

Third-party libraries in React Native extend its functionality. Popular libraries include React Navigation for navigation, Redux for state management, and Expo for simplifying development.

Deployment

Deployment of React Native apps involves building the app for the target platform (iOS or Android) and submitting it to the respective app stores. Tools like Fastlane can automate the deployment process.

Analogies

Think of React Native as a universal remote control for mobile apps. Just as a universal remote can control multiple devices, React Native allows you to build apps for multiple platforms using a single codebase. Each button on the remote is like a component in React Native, and the remote's settings are like the styling and state management.

Another analogy is a cross-platform toolkit. Just as a toolkit contains various tools for different tasks, React Native provides a set of components and APIs to build mobile apps for both iOS and Android. Each tool in the toolkit is like a feature in React Native, such as navigation or networking.