Skip to content

Commit 9efb6c1

Browse files
authored
fix #1056 (#1058)
* fix #1056 * add test for #1056
1 parent 01f630e commit 9efb6c1

File tree

2 files changed

+34
-3
lines changed

2 files changed

+34
-3
lines changed

src/use-swr.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -470,9 +470,11 @@ function useSWR<Data = any, Error = any>(
470470
// deep compare to avoid extra re-render
471471
// data changed
472472
newState.data = newData
473-
cache.set(key, newData)
474473
}
475474

475+
if (!config.compare(cache.get(key), newData)) {
476+
cache.set(key, newData)
477+
}
476478
// merge the new state
477479
dispatch(newState)
478480

test/use-swr-suspense.test.tsx

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { act, render, screen } from '@testing-library/react'
1+
import { act, fireEvent, render, screen } from '@testing-library/react'
22
import React, { ReactNode, Suspense, useEffect, useState } from 'react'
33
import useSWR, { mutate } from '../src'
4-
import { sleep } from './utils'
4+
import { createResponse, sleep } from './utils'
55

66
class ErrorBoundary extends React.Component<{ fallback: ReactNode }> {
77
state = { hasError: false }
@@ -192,6 +192,35 @@ describe('useSWR - suspense', () => {
192192
expect(renderedResults).toEqual(['suspense-7', 'suspense-8'])
193193
})
194194

195+
it('should render correctly when key changes (but with same response data)', async () => {
196+
// https://github.com/vercel/swr/issues/1056
197+
const renderedResults = []
198+
function Section() {
199+
const [key, setKey] = useState(1)
200+
const { data } = useSWR(`foo?a=${key}`, () => createResponse('123'), {
201+
suspense: true
202+
})
203+
if (`${data},${key}` !== renderedResults[renderedResults.length - 1]) {
204+
renderedResults.push(`${data},${key}`)
205+
}
206+
return <div onClick={() => setKey(v => v + 1)}>{`${data},${key}`}</div>
207+
}
208+
209+
render(
210+
<Suspense fallback={<div>fallback</div>}>
211+
<Section />
212+
</Suspense>
213+
)
214+
215+
await screen.findByText('123,1')
216+
217+
fireEvent.click(screen.getByText('123,1'))
218+
219+
await screen.findByText('123,2')
220+
221+
expect(renderedResults).toEqual(['123,1', '123,2'])
222+
})
223+
195224
it('should render initial data if set', async () => {
196225
const fetcher = jest.fn(() => 'SWR')
197226

0 commit comments

Comments
 (0)