Контекст Svelte не реактивен. Значение устанавливается один раз, когда вызывается setContext
(что можно сделать только во время инициализации компонента), и оно не отслеживается для последующих изменений.
Если вам нужно передать реактивное значение (то есть, это будет изменить), тогда вам нужно передать хранилище через контекст.
Пример провайдера:
<script>
import { setContext } from 'svelte'
import { writable } from 'svelte/store'
const layoutWidth = writable(null)
setContext('layoutWidth', layoutWidth)
</script>
<div bind:offsetWidth={$layoutWidth}><slot/></div>
И потребитель:
<script>
import { getContext } from 'svelte'
const layoutWidth = getContext('layoutWidth')
// subscribe to the store to get the value
// do this in a reactive expression to keep _layoutWidth in sync
$: _layoutWidth = $layoutWidth
// you can also write back to the store (if it's writable)
$layoutWidth = 400
</script>
...
Примечание: я сомневаюсь bind:offsetWidth
сделает то, что вы хотите. Здесь снова значение будет прочитано только один раз. Значение не будет обновляться при изменении размера div (потому что нет собственного API для наблюдения за размером элементов ...). Возможно, вы захотите добавить resize
прослушиватель событий к window
или что-то в этом роде (также существуют некоторые библиотеки, которые позволяют наблюдать за размером элементов с некоторыми хитростями).