mirror of https://github.com/sveltejs/svelte
fix: improve handling of unowned derived signals (#10842)
parent
1fc41730a1
commit
117082b039
@ -0,0 +1,5 @@
|
||||
---
|
||||
"svelte": patch
|
||||
---
|
||||
|
||||
fix: improve handling of unowned derived signals
|
@ -0,0 +1,30 @@
|
||||
import { flushSync } from 'svelte';
|
||||
import { test } from '../../test';
|
||||
|
||||
export default test({
|
||||
async test({ assert, target }) {
|
||||
let [btn1, btn2] = target.querySelectorAll('button');
|
||||
|
||||
flushSync(() => {
|
||||
btn1.click();
|
||||
});
|
||||
|
||||
flushSync(() => {
|
||||
btn2.click();
|
||||
});
|
||||
|
||||
assert.htmlEqual(
|
||||
target.innerHTML,
|
||||
`<button>Activate</button><button>Toggle</button>\nneighba\nneighba`
|
||||
);
|
||||
|
||||
flushSync(() => {
|
||||
btn2.click();
|
||||
});
|
||||
|
||||
assert.htmlEqual(
|
||||
target.innerHTML,
|
||||
`<button>Activate</button><button>Toggle</button>\nzeeba\nzeeba`
|
||||
);
|
||||
}
|
||||
});
|
@ -0,0 +1,49 @@
|
||||
<script>
|
||||
import { untrack } from 'svelte';
|
||||
|
||||
class Model {
|
||||
data = $state();
|
||||
|
||||
constructor(data) {
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
name = $derived(this.data?.name);
|
||||
source = $derived(this.data?.source);
|
||||
|
||||
toggle() {
|
||||
this.data.name = this.data.name === 'zeeba' ? 'neighba' : 'zeeba';
|
||||
}
|
||||
}
|
||||
|
||||
let model = $state(new Model({ name: 'zeeba', source: 'initial' }));
|
||||
|
||||
let setModel = (source) => {
|
||||
let next = new Model({ name: 'zeeba', source });
|
||||
model = next;
|
||||
}
|
||||
|
||||
let needsSet = $state(false);
|
||||
|
||||
$effect(() => {
|
||||
if(needsSet) {
|
||||
setModel('effect');
|
||||
untrack(() => {
|
||||
needsSet = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
let setWithEffect = () => {
|
||||
needsSet = true;
|
||||
};
|
||||
|
||||
let toggle = () => {
|
||||
model.toggle();
|
||||
}
|
||||
</script>
|
||||
|
||||
<button onclick={setWithEffect}>Activate</button>
|
||||
<button onclick={toggle}>Toggle</button>
|
||||
{model.name}
|
||||
{model.data.name}
|
Loading…
Reference in new issue