0
0
React Nativemobile~20 mins

React.memo and useMemo in React Native - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
React.memo and useMemo Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
ui_behavior
intermediate
2:00remaining
What is the output when using React.memo?
Consider a React Native component wrapped with React.memo. What happens when its parent re-renders but the props do not change?
React Native
const Child = React.memo(({count}) => {
  console.log('Child rendered');
  return <Text>{count}</Text>;
});

function Parent() {
  const [count, setCount] = React.useState(0);
  const [other, setOther] = React.useState(0);

  return (
    <>
      <Child count={count} />
      <Button title="Update Other" onPress={() => setOther(other + 1)} />
    </>
  );
}
AChild component re-renders every time Parent re-renders, regardless of prop changes.
BChild component re-renders only when 'other' changes.
CChild component never re-renders after first render, even if 'count' changes.
DChild component re-renders only when 'count' changes; pressing 'Update Other' does NOT re-render Child.
Attempts:
2 left
💡 Hint
React.memo prevents re-render if props are the same.
ui_behavior
intermediate
2:00remaining
How does useMemo affect expensive calculations?
Given a component that calculates a value using useMemo, when does the calculation run?
React Native
function ExpensiveComponent({num}) {
  const computed = React.useMemo(() => {
    console.log('Calculating...');
    return num * 2;
  }, [num]);

  return <Text>{computed}</Text>;
}
ACalculation runs only when 'num' changes; otherwise cached value is used.
BCalculation runs on every render regardless of 'num'.
CCalculation runs only once when component mounts and never again.
DCalculation never runs because useMemo caches nothing.
Attempts:
2 left
💡 Hint
useMemo caches the result until dependencies change.
lifecycle
advanced
2:00remaining
Why might React.memo not prevent re-rendering?
Why does a React.memo wrapped component still re-render when passed an object prop created inline in the parent?
React Native
const Child = React.memo(({data}) => {
  console.log('Child rendered');
  return <Text>{data.value}</Text>;
});

function Parent() {
  const [count, setCount] = React.useState(0);

  return (
    <>
      <Child data={{value: count}} />
      <Button title="Increment" onPress={() => setCount(count + 1)} />
    </>
  );
}
ABecause the object prop is a new reference each render, React.memo sees it as changed and re-renders Child.
BReact.memo only works with primitive props, not objects.
CReact.memo is broken and does not prevent any re-renders.
DChild re-renders because 'count' is a state variable.
Attempts:
2 left
💡 Hint
Objects created inline are new every render.
📝 Syntax
advanced
2:00remaining
What is the output of this useMemo code snippet?
What will be logged and displayed when this component renders and the button is pressed twice?
React Native
function Counter() {
  const [count, setCount] = React.useState(0);
  const doubled = React.useMemo(() => {
    console.log('Calculating doubled');
    return count * 2;
  }, [count]);

  return (
    <>
      <Text>{doubled}</Text>
      <Button title="Increment" onPress={() => setCount(count + 1)} />
    </>
  );
}
ALogs nothing; displays 0 then 0 after two presses.
BLogs 'Calculating doubled' once; displays 0 then 4 after two presses.
CLogs 'Calculating doubled' three times; displays 2 then 4 after two presses.
DLogs 'Calculating doubled' three times; displays 1 then 2 after two presses.
Attempts:
2 left
💡 Hint
useMemo runs on initial render and when dependencies change.
🔧 Debug
expert
2:00remaining
Why does this React.memo component still re-render unexpectedly?
Identify the reason why the Child component re-renders every time even though it is wrapped with React.memo.
React Native
const Child = React.memo(({onClick}) => {
  console.log('Child rendered');
  return <Button title="Click" onPress={onClick} />;
});

function Parent() {
  const [count, setCount] = React.useState(0);

  return (
    <>
      <Child onClick={() => setCount(count + 1)} />
      <Text>{count}</Text>
    </>
  );
}
AChild re-renders because setCount changes on every render.
BBecause the onClick function is recreated inline on every render, React.memo sees it as a new prop and re-renders Child.
CReact.memo does not work with function props at all.
DChild re-renders because count is passed as a prop.
Attempts:
2 left
💡 Hint
Functions declared inline are new references each render.