mirror of https://github.com/sveltejs/svelte
fix: do no rerun the each block when array change from empty to empty (#13553)
* do no rerun the each block when array change from empty to empty * rename empty yo was_empty * add test * fix nullable array on SSR * format * rewrite * chore: add changeset --------- Co-authored-by: Paolo Ricciuti <ricciutipaolo@gmail.com>pull/13559/head
parent
6776947ae8
commit
531ff6243c
@ -0,0 +1,5 @@
|
||||
---
|
||||
"svelte": patch
|
||||
---
|
||||
|
||||
fix: do no rerun the each block when array change from empty to empty
|
@ -0,0 +1,80 @@
|
||||
import { flushSync } from 'svelte';
|
||||
import { test } from '../../test';
|
||||
|
||||
// https://github.com/sveltejs/svelte/issues/13550
|
||||
// https://github.com/sveltejs/svelte/pull/13553
|
||||
export default test({
|
||||
html: `<button>clicks: 0</button><button>undefined</button><button>null</button><button>empty</button><button>[1,2,3]</button><ul><li>count = <span>0</span></li></ul>`,
|
||||
|
||||
async test({ assert, target }) {
|
||||
const [increment, set_undefined, set_null, set_empty, set_list] =
|
||||
target.querySelectorAll('button');
|
||||
|
||||
let [span] = target.querySelectorAll('span');
|
||||
|
||||
// initial value
|
||||
assert.exists(span);
|
||||
assert.equal(span.innerHTML, '0');
|
||||
|
||||
// increment value
|
||||
flushSync(() => increment.click());
|
||||
assert.equal(span.innerHTML, '1');
|
||||
|
||||
// change collection to undefined
|
||||
flushSync(() => set_undefined.click());
|
||||
// increment value
|
||||
flushSync(() => increment.click());
|
||||
assert.equal(span.innerHTML, '2');
|
||||
|
||||
// change collection to null
|
||||
flushSync(() => set_null.click());
|
||||
// increment value
|
||||
flushSync(() => increment.click());
|
||||
assert.equal(span.innerHTML, '3');
|
||||
|
||||
// change collection to empty
|
||||
flushSync(() => set_empty.click());
|
||||
// increment value
|
||||
flushSync(() => increment.click());
|
||||
assert.equal(span.innerHTML, '4');
|
||||
|
||||
// change collection to undefined
|
||||
flushSync(() => set_undefined.click());
|
||||
// increment value
|
||||
flushSync(() => increment.click());
|
||||
assert.equal(span.innerHTML, '5');
|
||||
|
||||
// change collection to [1,2,3]
|
||||
flushSync(() => set_list.click());
|
||||
[span] = target.querySelectorAll('span');
|
||||
assert.notExists(span);
|
||||
assert.equal(target.querySelectorAll('li').length, 3);
|
||||
|
||||
// change collection to undefined
|
||||
flushSync(() => set_undefined.click());
|
||||
[span] = target.querySelectorAll('span');
|
||||
assert.exists(span);
|
||||
assert.equal(span.innerHTML, '5');
|
||||
|
||||
// increment value
|
||||
flushSync(() => increment.click());
|
||||
assert.equal(span.innerHTML, '6');
|
||||
|
||||
// change collection to null
|
||||
flushSync(() => set_null.click());
|
||||
// increment value
|
||||
flushSync(() => increment.click());
|
||||
assert.equal(span.innerHTML, '7');
|
||||
|
||||
// change collection to empty
|
||||
flushSync(() => set_empty.click());
|
||||
// increment value
|
||||
flushSync(() => increment.click());
|
||||
assert.equal(span.innerHTML, '8');
|
||||
|
||||
assert.htmlEqual(
|
||||
target.innerHTML,
|
||||
`<button>clicks: 8</button><button>undefined</button><button>null</button><button>empty</button><button>[1,2,3]</button><ul><li>count = <span>8</span></li></ul>`
|
||||
);
|
||||
}
|
||||
});
|
@ -0,0 +1,22 @@
|
||||
<script>
|
||||
let list = $state()
|
||||
let count = $state(0);
|
||||
|
||||
function increment() {
|
||||
count += 1;
|
||||
}
|
||||
</script>
|
||||
|
||||
<button onclick={increment}>clicks: {count}</button>
|
||||
<button onclick={()=>list=undefined}>undefined</button>
|
||||
<button onclick={()=>list=null}>null</button>
|
||||
<button onclick={()=>list=[]}>empty</button>
|
||||
<button onclick={()=>list=[1,2,3]}>[1,2,3]</button>
|
||||
|
||||
<ul>
|
||||
{#each list as a}
|
||||
<li>item : {a}</li>
|
||||
{:else}
|
||||
<li>count = <span>{count}</span></li>
|
||||
{/each}
|
||||
</ul>
|
Loading…
Reference in new issue