Mar*_*rty 1 svelte svelte-component svelte-3
这是我创建苗条上下文的方式:
<script>
import {setContext} from 'svelte'
let layoutWidth
setContext('layout', {layoutWidth})
</script>
<div bind:offsetWidth={layoutWidth}><slot/></div>
Run Code Online (Sandbox Code Playgroud)
如果我尝试getContext在子组件中,那么我得到了undefined但是在父组件中 layoutWidth 总是有价值的。
如何获取offsetHeight苗条的父元素?
我这样使用getContext:
<script>
import {getContext} from 'svelte'
const {layoutWidth} = getContext('layout')
$: console.log(layoutWidth) //undefined
</script>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
而消费者:
<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>
...
Run Code Online (Sandbox Code Playgroud)
旁注:我怀疑bind:offsetWidth会做你想做的事。同样,该值将仅被读取一次。当 div 调整大小时,该值不会更新(因为没有原生 API 来观察元素的大小......)。您可能希望为此效果添加一个resize事件侦听器 window或其他内容(还有一些库可以使用一些技巧来观察元素大小)。
| 归档时间: |
|
| 查看次数: |
488 次 |
| 最近记录: |