Hooks
React
What is a Hook?
Hooks are special functions that let you “hook into” React features like state, lifecycle, and context in functional components. They avoid the need for class components.
Hooks Covered
1. useState
-
Definition: Lets you add state to functional components.
-
Syntax:
const [state, setState] = useState<type>(initialValue);
2. useEffect
-
Definition: Lets you perform side effects like fetching data, timers, or DOM updates.
-
Syntax:
useEffect(() => {
// effect logic
return () => {
// optional cleanup
};
}, [dependencies]);
3. useContext
-
Definition: Lets you share data (like theme, user) globally without prop drilling.
-
Syntax:
const value = useContext(MyContext);
Example: App with useState
, useEffect
, useContext
// App.tsx
import React, { useState, useEffect, createContext } from 'react';
import UserProfile from './components/UserProfile';
import Counter from './components/Counter';
interface UserContextType {
username: string;
}
export const UserContext = createContext<UserContextType>({ username: 'Guest' });
const App: React.FC = () => {
const [username, setUsername] = useState<string>('NBT');
useEffect(() => {
console.log('App Mounted');
}, []);
return (
<UserContext.Provider value={{ username }}>
<div style={{ padding: '2rem' }}>
<h1>React Hooks Demo</h1>
<UserProfile />
<Counter />
</div>
</UserContext.Provider>
);
};
export default App;
// components/UserProfile.tsx
import React, { useContext } from 'react';
import { UserContext } from '../App';
const UserProfile: React.FC = () => {
const { username } = useContext(UserContext);
return (
<div>
<h2>User Profile</h2>
<p>Username from Context: <strong>{username}</strong></p>
</div>
);
};
export default UserProfile;
// components/Counter.tsx
import React, { useState, useEffect } from 'react';
const Counter: React.FC = () => {
const [count, setCount] = useState<number>(0);
useEffect(() => {
document.title = `Count: ${count}`;
}, [count]);
return (
<div>
<h2>Counter</h2>
<p>Current count: {count}</p>
<button onClick={() => setCount(prev => prev + 1)}>Increment</button>
</div>
);
};
export default Counter;
Svelte
What is a Store and Reactive Statement?
In Svelte, instead of Hooks, you use:
- Reactive statements (
$:
): likeuseEffect
, auto-runs when dependencies change. - Local state: variables inside
<script>
(nouseState
needed). - Context API: similar to
useContext
usingsetContext
andgetContext
. - Writable stores: shared state across components.
Svelte Equivalents
1. Local State (Like useState
)
<script>
let count = 0;
</script>
<button on:click={() => count++}>Increment</button>
2. Reactive Statement (Like useEffect
)
<script>
let count = 0;
$: document.title = `Count: ${count}`;
</script>
3. Context API (Like useContext
)
setContext
: Provide a valuegetContext
: Access the provided value
Example: App with Local State, Reactive Effects, and Context
Folder Structure
src/
├── routes/
│ ├── +page.svelte → Main App
│ ├── components/
│ │ ├── Counter.svelte
│ │ └── UserProfile.svelte
│ └── context.ts
// context.ts
import { setContext, getContext } from 'svelte';
import { writable } from 'svelte/store';
export const USER_CONTEXT = Symbol();
export function initUserContext(username: string) {
const user = writable({ username });
setContext(USER_CONTEXT, user);
}
export function useUserContext() {
return getContext(USER_CONTEXT);
}
<!-- +page.svelte -->
<script lang="ts">
import Counter from './components/Counter.svelte';
import UserProfile from './components/UserProfile.svelte';
import { initUserContext } from './context';
initUserContext('NBT');
</script>
<div style="padding: 2rem">
<h1>Svelte Reactivity + Context Demo</h1>
<UserProfile />
<Counter />
</div>
<!-- components/UserProfile.svelte -->
<script lang="ts">
import { useUserContext } from '../context';
import { derived } from 'svelte/store';
const userStore = useUserContext();
const username = derived(userStore, $u => $u.username);
</script>
<h2>User Profile</h2>
<p>Username from Context: <strong>{$username}</strong></p>
<!-- components/Counter.svelte -->
<script lang="ts">
let count = 0;
$: document.title = `Count: ${count}`;
</script>
<h2>Counter</h2>
<p>Current count: {count}</p>
<button on:click={() => count++}>Increment</button>
In Svelte, you don’t need
useState
oruseEffect
. State is just variables, and reactive logic uses$:
.