Master all 3 SignalForge hooks: useSignal, useSignalValue, and useSignalEffect
useSignal() - Create reactive state (most common)useSignalValue() - Read signals without setter (read-only)useSignalEffect() - React to signal changes (side effects)| Hook | Returns | Use When |
|---|---|---|
| useSignal(val) | [value, setValue] | You need to read AND write |
| useSignalValue(sig) | value (read-only) | You only need to read |
| useSignalEffect(fn) | void | Run side effects on changes |
const [count, setCount] = useSignal(10); setCount(count + 1) // update
const [doubled, setDoubled] = useSignal(0);
useSignalEffect(() => {
setDoubled(count * 2);
});useSignalEffect(() => {
// Automatically tracks count changes
const doubled = count * 2;
console.log('Doubled:', doubled);
});| Hook | Returns | Use Case |
|---|---|---|
| useSignal | Signal object | When you need to read AND write |
| useSignalValue | Raw value | When you only need to read (optimized) |
| useSignalEffect | void | Run side effects when signals change |
Create reactive state. Just like useState but better!
Read a signal created elsewhere. Read-only access.
Run code when signals change. Auto-tracks dependencies!
import { useSignal, useSignalValue, useSignalEffect } from 'signalforge/react';
import { createSignal } from 'signalforge';
// Global signal (outside component)
const globalCounter = createSignal(0);
function ParentComponent() {
// Local signal with useSignal
const [name, setName] = useSignal('Guest');
return (
<div>
<input
value={name}
onChange={(e) => setName(e.target.value)}
/>
<ChildComponent />
</div>
);
}
function ChildComponent() {
// Read global signal with useSignalValue
const count = useSignalValue(globalCounter);
// Effect runs when count changes
useSignalEffect(() => {
console.log(`Count changed to: ${count}`);
// Cleanup (optional)
return () => {
console.log('Cleaning up...');
};
});
return (
<div>
<p>Count: {count}</p>
<button onClick={() => globalCounter.set(globalCounter.get() + 1)}>
Increment Global Counter
</button>
</div>
);
}
// ✨ Key Benefits:
// • useSignal for local state
// • useSignalValue for reading global state
// • useSignalEffect for side effects
// • All auto-track dependencies!Perfect for component-specific state like form inputs, toggles, counters.
When you have a global signal and only need to read it (not write).
API calls, logging, timers, subscriptions. Always return cleanup functions!
SignalForge automatically tracks what signals you use. Zero boilerplate!
const [count, setCount] = useSignal(0);
<button onClick={() => setCount(count + 1)}>const user = useSignalValue(userSignal);
<h1>{user.name}</h1>useSignalEffect(() => {
fetchData(userId);
});const [count] = useState(signal(0));
// Use useSignal instead!Now you know all the hooks! Try building something: