You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Svelte父组件宽度并传递给插槽中子组件?

解决Svelte中父组件宽度传递给Slot子组件的问题

为什么直接在组件上用bind:clientWidth无效?

Svelte组件默认不会暴露DOM元素的原生属性,除非组件内部显式导出对应的绑定逻辑。所以直接在自定义组件(比如<Parent>)上使用bind:clientWidth无法生效,这个语法只适用于原生HTML元素。


方案一:父组件通过Slot Props传递宽度(推荐)

在父组件内部绑定根元素的clientWidth,然后通过Slot的props把宽度传递给子组件,无需在父组件外部声明额外变量。

Parent.svelte

<script>
  let parentWidth;
</script>

<!-- 绑定父组件根元素的宽度 -->
<div bind:clientWidth={parentWidth} class="parent-container">
  <!-- 通过slot传递宽度变量 -->
  <slot {parentWidth} />
</div>

<style>
  .parent-container {
    /* 根据需求设置父组件样式 */
    width: 80%;
    margin: 0 auto;
  }
</style>

使用方式

<Parent>
  <!-- 子组件通过let:parentWidth接收宽度 -->
  <Child let:parentWidth />
</Parent>

子组件里可以直接使用parentWidth变量,父组件宽度变化时会自动同步,自带响应式特性。


方案二:子组件直接获取父元素宽度

如果不想依赖父组件传递,子组件可以直接通过DOM API获取父元素的宽度,同时监听窗口resize事件保证响应式更新。

Child.svelte

<script>
  import { onMount } from 'svelte';
  let parentWidth;

  // 更新父组件宽度的方法
  function updateParentWidth() {
    // 这里假设子组件的直接父元素就是目标父组件的根元素
    // 如果有多层嵌套,可以改用this.parentElement.closest('.parent-container')
    const parentElement = this.parentElement;
    if (parentElement) {
      parentWidth = parentElement.clientWidth;
    }
  }

  onMount(() => {
    // 组件挂载后初始化宽度
    updateParentWidth.call(this);
    // 监听窗口resize事件更新宽度
    window.addEventListener('resize', updateParentWidth.bind(this));
    // 组件销毁时移除监听
    return () => window.removeEventListener('resize', updateParentWidth.bind(this));
  });
</script>

<div>父组件当前宽度:{parentWidth}px</div>

注意:这种方法依赖DOM结构,如果父组件的DOM层级变化,需要调整获取父元素的逻辑,稳定性不如方案一。


内容的提问来源于stack exchange,提问作者ICantCode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:12:36