From 0fd9503a53ad6836ac445d7d384b8f153b93a158 Mon Sep 17 00:00:00 2001 From: Marvin Hagemeister Date: Tue, 29 Jul 2025 13:37:21 +0200 Subject: [PATCH] fix: make prefresh hmr integration easier The callback to `useMemo` is assumed to be pure during HMR and will be re-triggered. This in turn broke the `useSignal` hooks HMR as they used side-effectful callbacks. --- .changeset/odd-tigers-remember.md | 5 +++++ packages/preact/src/index.ts | 9 ++++----- 2 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 .changeset/odd-tigers-remember.md diff --git a/.changeset/odd-tigers-remember.md b/.changeset/odd-tigers-remember.md new file mode 100644 index 000000000..dc713a33c --- /dev/null +++ b/.changeset/odd-tigers-remember.md @@ -0,0 +1,5 @@ +--- +"@preact/signals": patch +--- + +Fix prefresh HMR not working with `useSignal`. diff --git a/packages/preact/src/index.ts b/packages/preact/src/index.ts index 466b957ae..58b59ca11 100644 --- a/packages/preact/src/index.ts +++ b/packages/preact/src/index.ts @@ -1,5 +1,5 @@ import { options, Component, isValidElement, Fragment } from "preact"; -import { useRef, useMemo, useEffect } from "preact/hooks"; +import { useRef, useMemo, useEffect, useState } from "preact/hooks"; import { signal, computed, @@ -387,10 +387,9 @@ Component.prototype.shouldComponentUpdate = function ( export function useSignal(value: T, options?: SignalOptions): Signal; export function useSignal(): Signal; export function useSignal(value?: T, options?: SignalOptions) { - return useMemo( - () => signal(value, options as SignalOptions), - [] - ); + return useState(() => + signal(value, options as SignalOptions) + )[0]; } export function useComputed(compute: () => T, options?: SignalOptions) {