1

这是我创建苗条上下文的方式:

<script>
import {setContext} from 'svelte'
let layoutWidth


setContext('layout', {layoutWidth})

</script>
<div bind:offsetWidth={layoutWidth}><slot/></div>

如果我尝试getContext在子组件中,那么我得到undefined但在父组件中 layoutWidth 总是有价值。

如何offsetHeight在 Svelte 中获取父元素?

getContext这样使用:

<script>
import {getContext} from 'svelte'
const {layoutWidth} = getContext('layout')
$: console.log(layoutWidth) //undefined
</script>
4

1 回答 1

5

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或一些东西来达到这种效果(还有一些库可以监视元素的大小,但有一些技巧)。

于 2020-03-29T19:53:22.943 回答