获取 Svelte 中组件根元素的引用

Nao*_*aor 8 javascript svelte svelte-component

我知道我可以使用以下方法获取对 DOM 元素的引用bind:this

<script>
  import { onMount } from "svelte";

  let root;

  onMount(() => {
    // root is div
  });
</script>

<div bind:this="{root}">
  content
</div>
Run Code Online (Sandbox Code Playgroud)

如何获取组件根元素的 DOM 节点的引用?

Wrapper.svelte:
<div class="root">
  <slot />
</div>

App.svelte:
<script>
  import { onMount } from "svelte";

  let root;

  onMount(() => {
    // root is not div :(
  });
</script>

<Wrapper bind:this="{root}">
  content
</Wrapper>
Run Code Online (Sandbox Code Playgroud)

rix*_*ixo 10

Svelte 不强制使用根组件。

<p>I am valid component.</p>
<p>With multiple roots.<p>
Run Code Online (Sandbox Code Playgroud)
<script>
  console.log('No root is valid too')
</script>
Run Code Online (Sandbox Code Playgroud)

因此,没有快捷语法来获取根元素,您需要手动“代理”要公开的元素:

Wrapper.svelte

<script>
  export let root
</script>

<div bind:this={root}>...</div>
Run Code Online (Sandbox Code Playgroud)

App.svelte

<script>
  import Wrapper from './Wrapper.svelte'
  let el
</script>

<Wrapper bind:root={el} />
Run Code Online (Sandbox Code Playgroud)

使用一些奇特的 JS 语法,bind:this如果您愿意,您还可以复制该语法:

Wrapper.svelte

<script>
  let root
  export { root as this }
</script>

<div bind:this={root} />
Run Code Online (Sandbox Code Playgroud)

App.svelte

<script>
  import Wrapper from './Wrapper.svelte'
  let root
</script>

<Wrapper bind:this={root} />
Run Code Online (Sandbox Code Playgroud)