Skip to content

Commit

Permalink
[fix] Prevent rerender when route state did not change (#5654)
Browse files Browse the repository at this point in the history
* [fix] Prevent rerender when route state did not change

Fixes #3732

* adjust code to fix only session case, tests

* format

* fix test expectation

Co-authored-by: Simon Holthausen <simon.holthausen@vercel.com>
  • Loading branch information
dummdidumm and dummdidumm committed Jul 25, 2022
1 parent 66d17af commit 8cba6ba
Show file tree
Hide file tree
Showing 6 changed files with 69 additions and 2 deletions.
5 changes: 5 additions & 0 deletions .changeset/red-rivers-approve.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/kit': patch
---

Prevent rerender when route state did not change
3 changes: 3 additions & 0 deletions packages/kit/src/runtime/client/client.js
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,9 @@ export function create_client({ target, session, base, trailing_slash }) {
if (!ready) return;
session_id += 1;

const current_load_uses_session = current.branch.some((node) => node?.uses.session);
if (!current_load_uses_session) return;

update(new URL(location.href), [], true);
});
ready = true;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<script context="module">
/** @type {import('@sveltejs/kit').Load} */
export async function load() {
return {
props: {
// Needs to be an object, else Svelte will do by-value-comparison and skip rerender
obj: {}
}
};
}
</script>

<script>
import { session } from '$app/stores';
/** @type {any} */
export let obj;
let count = 0;
$: obj && count++;
</script>

<h2>{count}</h2>
<button on:click={() => ($session.calls = 123)}>Update $session</button>
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<script context="module">
/** @type {import('@sveltejs/kit').Load} */
export async function load({ session }) {
session;
return {
props: {
// Needs to be an object, else Svelte will do by-value-comparison and skip rerender
obj: {}
}
};
}
</script>

<script>
import { session } from '$app/stores';
/** @type {any} */
export let obj;
let count = 0;
$: obj && count++;
</script>

<h2>{count}</h2>
<button on:click={() => ($session.calls = 123)}>Update $session</button>
12 changes: 12 additions & 0 deletions packages/kit/test/apps/basics/test/client.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,18 @@ test.describe('Load', () => {
expect(await page.textContent('h2')).toBe('x: b: 2');
});

test('load function is only called on session change when used in load', async ({ page }) => {
await page.goto('/load/change-detection/session/used');
expect(await page.textContent('h2')).toBe('1');
await page.click('button');
expect(await page.textContent('h2')).toBe('2');

await page.goto('/load/change-detection/session/unused');
expect(await page.textContent('h2')).toBe('1');
await page.click('button');
expect(await page.textContent('h2')).toBe('1');
});

test('accessing url.hash from load errors and suggests using page store', async ({ page }) => {
await page.goto('/load/url-hash#please-dont-send-me-to-load');
expect(await page.textContent('#message')).toBe(
Expand Down
4 changes: 2 additions & 2 deletions packages/kit/test/apps/basics/test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1079,11 +1079,11 @@ test.describe('$app/stores', () => {
await page.goto('/store');

expect(await page.textContent('h1')).toBe('Test');
expect(await page.textContent('h2')).toBe(javaScriptEnabled ? 'Calls: 2' : 'Calls: 1');
expect(await page.textContent('h2')).toBe('Calls: 1');

await clicknav('a[href="/store/result"]');
expect(await page.textContent('h1')).toBe('Result');
expect(await page.textContent('h2')).toBe(javaScriptEnabled ? 'Calls: 2' : 'Calls: 0');
expect(await page.textContent('h2')).toBe(javaScriptEnabled ? 'Calls: 1' : 'Calls: 0');

const oops = await page.evaluate(() => window.oops);
expect(oops).toBeUndefined();
Expand Down

0 comments on commit 8cba6ba

Please sign in to comment.