Bird
Raised Fist0
React Nativemobile~20 mins

Skeleton loading screens in React Native - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Skeleton Screen Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ ui_behavior
intermediate
2:00remaining
What will this skeleton loader display?
Consider this React Native component that uses a simple skeleton loader. What will the user see while the data is loading?
React Native
import React from 'react';
import { View, StyleSheet } from 'react-native';

export default function SkeletonLoader() {
  return (
    <View style={styles.container}>
      <View style={styles.skeletonBox} />
      <View style={styles.skeletonLine} />
      <View style={styles.skeletonLine} />
    </View>
  );
}

const styles = StyleSheet.create({
  container: { padding: 20 },
  skeletonBox: { width: 100, height: 100, backgroundColor: '#ccc', borderRadius: 8, marginBottom: 10 },
  skeletonLine: { height: 20, backgroundColor: '#ddd', borderRadius: 4, marginBottom: 6 }
});
AA white box with two colored buttons below it.
BAn image loaded with text below it.
CA gray square box with two gray horizontal bars below it, simulating loading content.
DA blank screen with no visible elements.
Attempts:
2 left
💡 Hint
Look at the backgroundColor and shapes used in the styles.
❓ lifecycle
intermediate
1:30remaining
When should you hide the skeleton screen?
In a React Native app, when is the best time to stop showing the skeleton loading screen and display the actual content?
AAfter the data has finished loading and is ready to display.
BOnly after a fixed timeout of 5 seconds, ignoring data state.
CAs soon as the component mounts, regardless of data loading state.
DWhen the user taps the screen.
Attempts:
2 left
💡 Hint
Think about when the real content is ready to replace the placeholder.
📝 Syntax
advanced
2:30remaining
Which code correctly animates a skeleton loader's opacity?
Which option correctly uses React Native's Animated API to create a pulsing opacity effect for a skeleton loader?
React Native
import React, { useEffect, useRef } from 'react';
import { Animated, View, StyleSheet } from 'react-native';

export default function PulsingSkeleton() {
  const opacity = useRef(new Animated.Value(1)).current;

  useEffect(() => {
    Animated.loop(
      Animated.sequence([
        Animated.timing(opacity, { toValue: 0.3, duration: 700, useNativeDriver: true }),
        Animated.timing(opacity, { toValue: 1, duration: 700, useNativeDriver: true })
      ])
    ).start();
  }, [opacity]);

  return <Animated.View style={[styles.skeleton, { opacity }]} />;
}

const styles = StyleSheet.create({
  skeleton: { width: 100, height: 20, backgroundColor: '#ccc', borderRadius: 4 }
});
AUses Animated.loop with Animated.sequence of two Animated.timing calls changing opacity between 1 and 0.3.
BUses setInterval to change opacity state every 700ms without Animated API.
CUses Animated.timing once without loop or sequence, so opacity changes only once.
DUses Animated.spring to animate opacity from 1 to 0.3 repeatedly.
Attempts:
2 left
💡 Hint
Look for the use of Animated.loop and Animated.sequence for continuous animation.
❓ navigation
advanced
2:30remaining
How to keep skeleton screen visible during navigation?
In a React Native app using React Navigation, you want to show a skeleton loader on a screen while fetching data. Which approach ensures the skeleton screen remains visible during navigation transitions until data loads?
AShow skeleton in the screen component and fetch data in useEffect; skeleton hides after data loads.
BUse a modal overlay with skeleton that blocks navigation until data loads.
CNavigate to a blank screen first, then navigate again to the data screen after loading completes.
DFetch data in a parent navigator component and pass data as props; screen shows skeleton until props arrive.
Attempts:
2 left
💡 Hint
Think about where data is fetched and how props control rendering.
🧠 Conceptual
expert
2:00remaining
Why prefer skeleton loaders over spinners in mobile apps?
Which reason best explains why skeleton loading screens are often better than simple spinners for mobile app user experience?
ASpinners use less battery and are easier to implement.
BSkeleton loaders show approximate layout, reducing perceived wait time and layout shifts.
CSkeleton loaders require no styling and are faster to code.
DSpinners provide more detailed information about loading progress.
Attempts:
2 left
💡 Hint
Consider how users perceive waiting and content stability.

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