Bird
Raised Fist0
React Nativemobile~5 mins

Skeleton loading screens in React Native

Choose your learning style10 modes available
Introduction

Skeleton loading screens show a simple placeholder while content is loading. This helps users know the app is working and improves the experience.

When fetching data from the internet and waiting for it to load
When loading images or large lists in your app
When switching between screens that need time to prepare content
When you want to avoid showing a blank screen during loading
Syntax
React Native
import React from 'react';
import { View, StyleSheet } from 'react-native';

const Skeleton = () => {
  return (
    <View style={styles.skeleton} />
  );
};

const styles = StyleSheet.create({
  skeleton: {
    backgroundColor: '#e1e9ee',
    height: 20,
    borderRadius: 4,
    marginVertical: 5
  }
});

export default Skeleton;

The skeleton is usually a simple gray box or shape that matches the content size.

You can animate the skeleton to shimmer for a nicer effect.

Examples
A simple gray rectangle as a skeleton placeholder.
React Native
const Skeleton = () => <View style={{backgroundColor: '#ccc', height: 20, width: 100, borderRadius: 4}} />;
A circular skeleton, useful for profile pictures or icons.
React Native
const SkeletonCircle = () => <View style={{backgroundColor: '#ddd', height: 50, width: 50, borderRadius: 25}} />;
Multiple skeleton lines to mimic a list loading.
React Native
const SkeletonList = () => (
  <>
    <Skeleton />
    <Skeleton />
    <Skeleton />
  </>
);
Sample App

This app shows a gray skeleton bar for 3 seconds, then displays the loaded text content.

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

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    padding: 20
  },
  skeleton: {
    width: 250,
    height: 20,
    backgroundColor: '#e1e9ee',
    borderRadius: 4
  },
  text: {
    fontSize: 18
  }
});

const Skeleton = () => <View style={styles.skeleton} />;

export default function App() {
  const [loading, setLoading] = useState(true);
  const [data, setData] = useState(null);

  useEffect(() => {
    setTimeout(() => {
      setData('Hello, this is loaded content!');
      setLoading(false);
    }, 3000);
  }, []);

  return (
    <View style={styles.container}>
      {loading ? <Skeleton /> : <Text style={styles.text}>{data}</Text>}
    </View>
  );
}
OutputSuccess
Important Notes

Keep skeleton shapes close to the real content size for better user experience.

Use subtle animations like shimmer to make loading feel smoother.

Don't keep skeletons too long; update UI as soon as data is ready.

Summary

Skeleton screens improve user experience during loading by showing placeholders.

They are simple views styled to look like the content shape.

Use them whenever your app waits for data or images to load.

Practice

(1/5)
1. What is the main purpose of a skeleton loading screen in a React Native app?
easy
A. To show a placeholder UI while content is loading
B. To speed up the app's data fetching process
C. To replace the app's navigation system
D. To permanently hide content from users

Solution

  1. Step 1: Understand skeleton screen purpose

    Skeleton screens are temporary placeholders that mimic the layout of content while data loads.
  2. Step 2: Eliminate incorrect options

    Speeding data fetching, replacing navigation, or hiding content permanently are unrelated to skeleton screens.
  3. Final Answer:

    To show a placeholder UI while content is loading -> Option A
  4. Quick Check:

    Skeleton screens = placeholders during loading [OK]
Hint: Skeleton screens show placeholders, not speed or navigation [OK]
Common Mistakes:
  • Thinking skeleton screens speed up data loading
  • Confusing skeleton screens with navigation components
  • Believing skeleton screens hide content permanently
2. Which of the following is the correct way to create a simple skeleton placeholder using React Native's View component?
easy
A.
B.
C.
D.

Solution

  1. Step 1: Check React Native style syntax

    Styles must be passed as an object with camelCase keys inside double curly braces.
  2. Step 2: Identify correct style properties

    backgroundColor, height, and width are valid style keys; color and bgColor are incorrect.
  3. Final Answer:

    <View style={{backgroundColor: '#ccc', height: 20, width: 100}} /> -> Option C
  4. Quick Check:

    Correct style object syntax = [OK]
Hint: Use style={{backgroundColor: '#ccc', height: 20, width: 100}} [OK]
Common Mistakes:
  • Using invalid style keys like 'color' or 'bgColor'
  • Passing styles as strings instead of objects
  • Missing curly braces around style object
3. Given this React Native code snippet for a skeleton loader, what will be displayed on the screen?
const Skeleton = () => {
  return (
    <View style={{backgroundColor: '#eee', padding: 10}}>
      <View style={{backgroundColor: '#ccc', height: 20, marginBottom: 10}} />
      <View style={{backgroundColor: '#ccc', height: 20, width: 150}} />
    </View>
  );
};
medium
A. Two gray bars stacked vertically with some spacing
B. A single gray bar with padding
C. Two colored circles side by side
D. An empty screen with no visible elements

Solution

  1. Step 1: Analyze the View structure

    The outer View has light gray background and padding. Inside are two Views with gray backgrounds and heights of 20.
  2. Step 2: Understand layout and spacing

    The first inner View has marginBottom 10, so the two bars stack vertically with space between them.
  3. Final Answer:

    Two gray bars stacked vertically with some spacing -> Option A
  4. Quick Check:

    Two stacked bars with margin = Two gray bars stacked vertically with some spacing [OK]
Hint: Look for stacked Views with margin for spacing [OK]
Common Mistakes:
  • Assuming elements are side by side without flex direction
  • Thinking circles appear without borderRadius
  • Ignoring marginBottom spacing
4. Identify the error in this React Native skeleton loader code:
const Skeleton = () => {
  return (
    <View style={{backgroundColor: '#eee', padding: 10}}>
      <View style={{backgroundColor: '#ccc', height: 20, marginBottom: 10}}></View>
      <View style={{backgroundColor: '#ccc', height: 20, width: 150}} />
    </View>
  );
};
medium
A. The style object keys are invalid
B. The first inner View should be self-closing since it has no children
C. The outer View is missing a closing tag
D. The second inner View has incorrect width value

Solution

  1. Step 1: Check JSX syntax for empty Views

    The first inner View has no children but uses opening and closing tags instead of self-closing.
  2. Step 2: Confirm correct self-closing syntax

    In React Native, empty Views should be self-closed like <View ... /> to avoid warnings.
  3. Final Answer:

    The first inner View should be self-closing since it has no children -> Option B
  4. Quick Check:

    Empty View tags must self-close [OK]
Hint: Empty Views must use self-closing tags [OK]
Common Mistakes:
  • Leaving empty Views with separate opening and closing tags
  • Misreading style object keys as invalid
  • Ignoring JSX tag closing rules
5. You want to create a skeleton loading screen that adapts to different content widths dynamically. Which approach best achieves this in React Native?
hard
A. Use images as placeholders instead of Views
B. Set fixed pixel widths for all skeleton bars
C. Render skeleton only after data loads
D. Use Animated.View with width set to a percentage and animate opacity

Solution

  1. Step 1: Understand dynamic width needs

    Using percentage widths allows skeleton bars to adapt to different screen sizes and content widths.
  2. Step 2: Use animation for better UX

    Animating opacity with Animated.View creates a shimmer effect, improving user experience during loading.
  3. Step 3: Eliminate incorrect options

    Fixed widths don't adapt; images are static; rendering after data loads defeats skeleton purpose.
  4. Final Answer:

    Use Animated.View with width set to a percentage and animate opacity -> Option D
  5. Quick Check:

    Dynamic width + animation = Use Animated.View with width set to a percentage and animate opacity [OK]
Hint: Use Animated.View with percent width and opacity animation [OK]
Common Mistakes:
  • Using fixed widths that don't adapt to screen size
  • Using static images instead of Views for placeholders
  • Showing skeleton after data is loaded
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard