fix: ensure legacy props cache last value when destroyed

pull/14043/head
Dominic Gannaway 2 years ago
parent 3fe278a8c3
commit 999b8e5ea0

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: ensure legacy props cache last value when destroyed

@ -324,12 +324,23 @@ export function prop(props, key, flags, fallback) {
} else {
// Svelte 4 did not trigger updates when a primitive value was updated to the same value.
// Replicate that behavior through using a derived
var derived_getter = with_parent_branch(() =>
(immutable ? derived : derived_safe_equal)(() => /** @type {V} */ (props[key]))
);
var derived_getter = with_parent_branch(() => {
return (immutable ? derived : derived_safe_equal)(() => /** @type {V} */ (props[key]));
});
// Connect the derived getter to the parent branch effect
get(derived_getter);
derived_getter.f |= LEGACY_DERIVED_PROP;
/** @type {V} */
var last_value;
getter = () => {
// Emulate the Svelte 4 behaviour of returning the last known value
if ((derived_getter.f & DESTROYED) !== 0) {
return last_value;
}
var value = get(derived_getter);
last_value = value;
if (value !== undefined) fallback_value = /** @type {V} */ (undefined);
return value === undefined ? fallback_value : value;
};

@ -0,0 +1,9 @@
<script>
import { onDestroy } from 'svelte';
export let data;
onDestroy(() => {
data;
});
</script>

@ -0,0 +1,10 @@
import { flushSync } from 'svelte';
import { test } from '../../test';
export default test({
test({ assert, logs, target }) {
target.querySelector('button')?.click();
flushSync();
assert.deepEqual(logs, ['should fire once']);
}
});

@ -0,0 +1,17 @@
<script>
import Child from './Child.svelte';
let active = true;
let data = { example: 'This is some example data' };
function log(data) {
console.log('should fire once');
return data;
}
</script>
<button on:click={() => active = false}>Hide</button>
{#if active}
<Child data={log(data)} />
{/if}
Loading…
Cancel
Save