Open
Description
Describe the bug
If you mount a component to the DOM programmatically using mount
, and pass in a $state
object via context. reactivity to the state with {#if}
statements does not work correctly.
Playground:
https://svelte.dev/playground/63a37aca753544ba9c2f96dd5bd4cd3a?version=5.28.2
In this snippet I show something like:
{#if value === true}
{value}
{/if}
but the rendered HTML shows both "true" and "false".
Some more observations
- Duplicating this if block in the template twice makes it work
- There are problems with $derived not reacting to changing state as well
Reproduction
App.svelte
<script>
import { setContext, getContext, onMount } from 'svelte';
import { contextTest } from './service.svelte.js';
const stateObjectFromContext = getContext('stateContext')
let element = undefined
onMount(() => {
contextTest(element)
})
</script>
<div bind:this={element}></div>
service.svelte.js
import { setContext, getContext, mount } from 'svelte';
import NestedComponent from './NestedComponent.svelte'
export const contextTest = (target) => {
const stateObject = $state({
showText: true
})
mount(NestedComponent, {target, context: new Map([['stateContext', stateObject]]), props: {}})
setInterval(() => {
stateObject.showText = !stateObject.showText
}, 1000)
}
NestedComponent.svelte
<script>
import { setContext, getContext } from 'svelte';
import { ContextTest } from './service.svelte.js';
const stateObjectFromContext = getContext('stateContext')
</script>
<p>Following text is inside an 'if' statement and should only ever be able to show 'true'</p>
{#if stateObjectFromContext.showText === true}
<h1>{stateObjectFromContext.showText}</h1>
{/if}
Logs
System Info
System:
OS: Linux 5.15 Ubuntu 22.04.5 LTS 22.04.5 LTS (Jammy Jellyfish)
CPU: (20) x64 12th Gen Intel(R) Core(TM) i7-12700H
Memory: 9.89 GB / 15.49 GB
Container: Yes
Shell: 5.1.16 - /bin/bash
Binaries:
Node: 22.2.0 - ~/.nvm/versions/node/v22.2.0/bin/node
Yarn: 1.22.22 - /usr/bin/yarn
npm: 10.7.0 - ~/.nvm/versions/node/v22.2.0/bin/npm
pnpm: 10.10.0 - /usr/bin/pnpm
npmPackages:
svelte: ^5.28.2 => 5.28.2
Severity
blocking all usage of svelte