Skip to main content

Memo

React

Definition

React.memo is a Higher Order Component (HOC) that prevents unnecessary re-renders of a component by memoizing it. If the component receives the same props, it skips rendering and uses the previously rendered result — improving performance.


Syntax

const MemoizedComponent = React.memo((props) => {
return <div>{props.value}</div>;
});

Example: Using React.memo to avoid unnecessary renders

// App.tsx
import React, { useState } from 'react';
import Counter from './Counter';
import Display from './Display';

const App: React.FC = () => {
const [count, setCount] = useState<number>(0);
const [name, setName] = useState<string>('NBT');

return (
<div>
<h1>React.memo Example</h1>
<Counter count={count} />
<Display name={name} />

<button onClick={() => setCount(count + 1)}>Increment Count</button>
<button onClick={() => setName(name === 'NBT' ? 'Mr.NBT' : 'NBT')}>Toggle Name</button>
</div>
);
};

export default App;
// Counter.tsx
import React from 'react';

type Props = {
count: number;
};

const Counter: React.FC<Props> = React.memo(({ count }) => {
console.log('Rendering Counter...');
return <p>Count: {count}</p>;
});

export default Counter;
// Display.tsx
import React from 'react';

type Props = {
name: string;
};

const Display: React.FC<Props> = React.memo(({ name }) => {
console.log('Rendering Display...');
return <p>Name: {name}</p>;
});

export default Display;

Note

  • When you click Toggle Name, only Display re-renders.
  • When you click Increment Count, only Counter re-renders.
  • This shows how React.memo helps optimize performance by skipping re-renders if props haven’t changed.

Svelte

Definition-Memo

In Svelte, components automatically avoid unnecessary re-renders when props don’t change — similar to what React.memo achieves. No need for explicit memoization like in React.


Svelte Advantage

  • No need for memo().
  • Reactive assignments optimize rendering.
  • Components update only when reactive values change.

Example: Svelte version of React.memo demo


src/
├── routes/
│ ├── +page.svelte → App (main logic)
│ ├── Counter.svelte → Tracks `count`
│ └── Display.svelte → Tracks `name`

<!-- +page.svelte -->
<script lang="ts">
import Counter from './Counter.svelte';
import Display from './Display.svelte';

let count: number = 0;
let name: string = 'NBT';

const increment = () => count += 1;
const toggleName = () => name = name === 'NBT' ? 'MrNBT' : 'NBT';
</script>

<h1>Svelte Memo-like Behavior</h1>

<Counter {count} />
<Display {name} />

<button on:click={increment}>Increment Count</button>
<button on:click={toggleName}>Toggle Name</button>
<!-- Counter.svelte -->
<script lang="ts">
export let count: number;

console.log('Rendering Counter...');
</script>

<p>Count: {count}</p>
<!-- Display.svelte -->
<script lang="ts">
export let name: string;

console.log('Rendering Display...');
</script>

<p>Name: {name}</p>


note

  • When you click Toggle Name, only Display.svelte logs a re-render.
  • When you click Increment Count, only Counter.svelte logs a re-render.
  • This shows how Svelte’s reactivity system is already optimized — no extra memoization needed.