如何在 Svelte 中使用 LeaderLine?

How to use LeaderLine with Svelte?

我是 Svelte and I'm trying to use LeaderLine Svelte 应用程序的新手。我设法用 import LeaderLine from 'leader-line'; 导入它,但不幸的是,包页面上给出的示例不起作用:

<script>
  import LeaderLine from 'leader-line';

  new LeaderLine(
    document.getElementById('start'),
    document.getElementById('end')
  );    
</script>

<div id="start">start</div>
<div id="end">end</div>

在浏览器控制台中我收到此错误:Uncaught (in promise) Error: start and end are required.

我认为这是因为 getElementById 的使用,如果我是对的,我们通常不想在 Svelte 中这样做。所以我想问问你们是否知道如何将 LeaderLine + Svelte 运行 组合在一起。任何想法表示赞赏!

您需要将 LeaderLine 初始化包装在 onMount 中。脚本标记运行s 中的代码在组件之前已添加到DOM,因此document.getElementById('start') returns 为空。 onMount 将 运行 组件添加到 DOM 后。

<script>
  import LeaderLine from 'leader-line';
  import { onMount } from 'svelte';

  onMount(() => {
    new LeaderLine(
      document.getElementById('start'),
      document.getElementById('end')
    );
  });
</script>

虽然您可以在 Svelte 中使用 getElementId,但绑定到开始和结束元素会更 Svelte。

<script>
  import LeaderLine from 'leader-line';
  import { onMount } from 'svelte';

  let start, end;
  onMount(() => {
    new LeaderLine(start, end);
  });
</script>

<div bind:this={start}>start</div>
<div bind:this={end}>end</div>

此外,如果您遇到“需要开始和结束”错误,我假设您已经解决了这个问题,但我不得不使用 @rollup/plugin-legacy 和以下 Rollup 配置来构建应用程序,因为 leader-line 没有'导出任何东西。

export default {
  // ... other config
  plugins: [
    // ... other plugins
    legacy({ 'node_modules/leader-line/leader-line.min.js': 'LeaderLine' }),
  ]
};