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