Skip to content

Commit c650fbb

Browse files
committed
feat(react): use useEffectEvent for effect event handlers
Extract event handlers in useQueryBasic from inside useEffect to useEffectEvent, reducing the dependency array from 12 entries to 2 (key, subscribe). Bumps react peer dep to ^19.2.0.
1 parent 5cd9644 commit c650fbb

File tree

2 files changed

+55
-67
lines changed

2 files changed

+55
-67
lines changed

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
"build:only": "vite build",
5252
"build": "npm run build:only",
5353
"prebuild": "npm run format:check && npm run lint",
54-
"lint": "oxlint --react-plugin --vitest-plugin",
54+
"lint": "oxlint --deny-warnings",
5555
"format": "oxfmt --write .",
5656
"format:check": "oxfmt --check .",
5757
"dev": "vitest",
@@ -82,8 +82,8 @@
8282
"vitest": "^4.1.0"
8383
},
8484
"peerDependencies": {
85-
"react": "^19.1.0",
86-
"react-dom": "^19.1.0",
85+
"react": "^19.2.0",
86+
"react-dom": "^19.2.0",
8787
"solid-js": "^1.9.0"
8888
},
8989
"peerDependenciesMeta": {

src/react/hooks/useQueryBasic.ts

Lines changed: 52 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect, use, useState, useTransition } from 'react'
1+
import { useEffect, useEffectEvent, use, useState, useTransition } from 'react'
22
import { type ContextValue } from 'query/react:context'
33
import { type Options } from 'query:index'
44
import { useQueryContext } from './useQueryContext'
@@ -74,7 +74,7 @@ export function useQueryBasic<T = unknown>(
7474
useQueryTransitionContext()
7575

7676
const [isLocalPending, startLocalTransition] = useTransition()
77-
const { query, expiration, subscribe } = useQueryInstance(options)
77+
const { query, subscribe } = useQueryInstance(options)
7878
const ignoreTransitionContext = oIgnoreTransitionContext ?? cIgnoreTransitionContext ?? false
7979
const isPending = ignoreTransitionContext ? isLocalPending : (isContextPending ?? isLocalPending)
8080

@@ -94,64 +94,64 @@ export function useQueryBasic<T = unknown>(
9494

9595
const [data, setData] = useState<T>(use(promise))
9696

97-
useEffect(
98-
function () {
99-
function onResolved(event: CustomEventInit<T>) {
100-
startTransition(function () {
101-
setData(event.detail as T)
102-
})
103-
}
97+
const onResolved = useEffectEvent(function (event: CustomEventInit<T>) {
98+
startTransition(function () {
99+
setData(event.detail as T)
100+
})
101+
})
104102

105-
function onMutating(event: CustomEventInit<Promise<T>>) {
106-
startTransition(async function () {
107-
const value = await (event.detail as Promise<T>)
103+
const onMutating = useEffectEvent(function (event: CustomEventInit<Promise<T>>) {
104+
startTransition(async function () {
105+
const value = await (event.detail as Promise<T>)
108106

109-
startTransition(function () {
110-
setData(value)
111-
})
112-
})
113-
}
107+
startTransition(function () {
108+
setData(value)
109+
})
110+
})
111+
})
114112

115-
function onMutated(event: CustomEventInit<T>) {
116-
startTransition(function () {
117-
setData(event.detail as T)
118-
})
119-
}
113+
const onMutated = useEffectEvent(function (event: CustomEventInit<T>) {
114+
startTransition(function () {
115+
setData(event.detail as T)
116+
})
117+
})
120118

121-
function onHydrated(event: CustomEventInit<T>) {
122-
startTransition(function () {
123-
setData(event.detail as T)
124-
})
125-
}
119+
const onHydrated = useEffectEvent(function (event: CustomEventInit<T>) {
120+
startTransition(function () {
121+
setData(event.detail as T)
122+
})
123+
})
126124

127-
function onRefetching(event: CustomEventInit<Promise<T>>) {
128-
startTransition(async function () {
129-
const value = await (event.detail as Promise<T>)
125+
const onRefetching = useEffectEvent(function (event: CustomEventInit<Promise<T>>) {
126+
startTransition(async function () {
127+
const value = await (event.detail as Promise<T>)
130128

131-
startTransition(function () {
132-
setData(value)
133-
})
129+
startTransition(function () {
130+
setData(value)
131+
})
132+
})
133+
})
134+
135+
const onForgotten = useEffectEvent(function () {
136+
if (clearOnForget) {
137+
startTransition(async function () {
138+
const data = await query<T>(key, {
139+
expiration: oExpiration,
140+
fetcher: oFetcher,
141+
stale: oStale,
142+
removeOnError: oRemoveOnError,
143+
fresh: oFresh,
134144
})
135-
}
136145

137-
function onForgotten() {
138-
if (clearOnForget) {
139-
startTransition(async function () {
140-
const data = await query<T>(key, {
141-
expiration: oExpiration,
142-
fetcher: oFetcher,
143-
stale: oStale,
144-
removeOnError: oRemoveOnError,
145-
fresh: oFresh,
146-
})
147-
148-
startTransition(function () {
149-
setData(data)
150-
})
151-
})
152-
}
153-
}
146+
startTransition(function () {
147+
setData(data)
148+
})
149+
})
150+
}
151+
})
154152

153+
useEffect(
154+
function () {
155155
const unsubscribeResolved = subscribe(key, 'resolved', onResolved)
156156
const unsubscribeMutating = subscribe(key, 'mutating', onMutating)
157157
const unsubscribeMutated = subscribe(key, 'mutated', onMutated)
@@ -168,19 +168,7 @@ export function useQueryBasic<T = unknown>(
168168
unsubscribeForgotten()
169169
}
170170
},
171-
[
172-
query,
173-
expiration,
174-
subscribe,
175-
key,
176-
clearOnForget,
177-
oExpiration,
178-
oFetcher,
179-
oStale,
180-
oRemoveOnError,
181-
oFresh,
182-
startTransition,
183-
]
171+
[key, subscribe]
184172
)
185173

186174
return { data, isPending }

0 commit comments

Comments
 (0)