Skip to main content

useWebVitals

Description and use case​

useWebVitals provides live Core Web Vitals data and optional metric callbacks for analytics pipelines.

API signature​

function useWebVitals(options?: UseWebVitalsOptions): WebVitalsState;

Parameters​

NameTypeRequiredDescription
options.onMetric(metric: WebVitalMetric) => voidNoCallback fired whenever a metric is updated.
options.enabledbooleanNoSet false to disable subscriptions (useful for SSR/tests).

Return value​

FieldTypeDescription
CLSWebVitalMetric | nullCumulative Layout Shift metric.
LCPWebVitalMetric | nullLargest Contentful Paint metric.
INPWebVitalMetric | nullInteraction to Next Paint metric.
FCPWebVitalMetric | nullFirst Contentful Paint metric.
TTFBWebVitalMetric | nullTime to First Byte metric.

Live interactive demo (StackBlitz)​

GitHub Pages does not serve the isolation headers required for embedded StackBlitz WebContainers. Open the demo in StackBlitz to run it interactively.

Code example​

import { useWebVitals } from 'react-perf-hooks';

export function VitalsOverlay() {
const vitals = useWebVitals({
onMetric: (metric) => {
navigator.sendBeacon('/api/vitals', JSON.stringify(metric));
},
});

return <p>LCP: {vitals.LCP?.value ?? 'waiting'}</p>;
}

Companion article​