createEffect

Creates a reactive effect that automatically re-executes when its dependencies change.

Signature

function createEffect(fn: Subscriber): Dispose;

Parameters

  • fn: Subscriber - A function to execute. Can optionally return a cleanup function.

Returns

  • Dispose - A function to manually detach the effect from its dependencies

Type Definition

type Subscriber = () => void;
type Cleanup = () => void;
type Dispose = () => void;

Example

const [count, setCount] = createSignal(0);

createEffect(() => {
  console.log("Count is:", count());
});

// Effect with cleanup
createEffect(() => {
  const value = count();
  console.log("Count is:", value);

  // Return cleanup function
  return () => {
    console.log("Count was:", value);
  };
});

// Effect with dispose
const disposeEffect = createEffect(() => {
  const value = count();

  return () => {
    console.log("Count was:", value);
  };
});

setCount(21); // Logs: Count was 0, Count is 21
disposeEffect(); // Log: Count is 21
setCount(42); // Nothing...

Advanced Usage

Idioms and Patterns: Reactive Patterns

Effect with conditional dependencies:

const [isAuthenticated, setIsAuthenticated] = createSignal(false);
const [user, setUser] = createSignal<User | null>(null);

createEffect(() => {
  if (isAuthenticated()) {
    fetchUserData().then((data) => {
      setUser(data);
    });

    return () => {
      setUser(null);
    };
  }
});

Effect for DOM manipulation:

const [title, setTitle] = createSignal("Hello World!");

createEffect(() => {
  document.title = title();
});

Effect with timer:

const [count, setCount] = createSignal(0);

createEffect(() => {
  const timer = setInterval(() => {
    console.log("Count:", count());
  }, 1000);

  return () => {
    clearInterval(timer);
  };
});

Behavior

  • Automatically tracks all signals accessed within the effect function

  • Re-executes whenever any tracked signal changes

  • Cleanup functions are called before the effect re-runs or when the effect is disposed

  • Effects run immediately when created

  • Side effects like DOM manipulation, API calls, or logging should be done in effects

Best Practices

  • Use effects for side effects, not for computing values (use createComputed instead)

  • Always clean up resources like intervals, subscriptions, or event listeners

  • Keep effects focused on a single responsibility

  • Avoid infinite loops by not updating signals that the effect depends on

Last updated