Hone logo
Hone
Problems

Measuring Element Dimensions with useLayoutEffect

The useLayoutEffect hook in React is a powerful tool for performing DOM measurements and mutations synchronously after all DOM mutations but before the browser paints. This challenge asks you to implement a component that uses useLayoutEffect to measure the width of a dynamically sized div and display it. Understanding useLayoutEffect is crucial for avoiding flickering or incorrect measurements when dealing with DOM manipulations that affect layout.

Problem Description

You need to create a React component called DynamicDivDimensions that displays the width of a dynamically sized div. The div's width will be controlled by a state variable widthPercentage, which represents the width as a percentage of its parent container. The component should use useLayoutEffect to measure the div's actual width after the DOM has been updated but before the browser paints, ensuring the displayed width is accurate and avoids visual glitches.

Key Requirements:

  • The component must accept a widthPercentage prop (number between 0 and 100).
  • The div's width should be set based on the widthPercentage prop.
  • useLayoutEffect must be used to measure the actual width of the div after it's rendered.
  • The measured width should be displayed in the component.
  • The component should handle the initial render and subsequent updates to widthPercentage correctly.

Expected Behavior:

When the component mounts or widthPercentage changes, the div's width should update accordingly. useLayoutEffect should then measure the actual width of the div and update the state with this value. The component should display the measured width without any noticeable flickering or incorrect values.

Edge Cases to Consider:

  • Initial render: The component should correctly measure the width on the first render.
  • Rapid changes in widthPercentage: The component should handle frequent updates to widthPercentage smoothly.
  • Zero width: The component should handle cases where widthPercentage is 0.
  • 100% width: The component should handle cases where widthPercentage is 100.

Examples

Example 1:

Input: widthPercentage = 50
Output: Displays "Measured Width: [actual width of the div, e.g., 200px]"
Explanation: The div's width is set to 50% of its parent. useLayoutEffect measures the actual width and displays it.

Example 2:

Input: widthPercentage = 100
Output: Displays "Measured Width: [actual width of the div, e.g., 400px]"
Explanation: The div's width is set to 100% of its parent. useLayoutEffect measures the actual width and displays it.

Example 3:

Input: widthPercentage = 0
Output: Displays "Measured Width: 0px"
Explanation: The div's width is set to 0%. useLayoutEffect measures the actual width (which is 0) and displays it.

Constraints

  • widthPercentage will always be a number between 0 and 100 (inclusive).
  • The parent container of the div should have a defined width for accurate percentage calculations. Assume the parent container has a width of 400px for this exercise.
  • The component should be performant and avoid unnecessary re-renders.
  • The solution must be written in TypeScript.

Notes

  • Remember that useLayoutEffect runs synchronously after all DOM mutations.
  • Consider using a state variable to store the measured width.
  • The useRef hook can be helpful for accessing the DOM element directly.
  • Avoid using useEffect as it runs asynchronously, which can lead to incorrect measurements and flickering.
  • Focus on accurately measuring the width and displaying it without visual artifacts.
Loading editor...
typescript