【问题标题】:LitElement SVG children as slotLitElement SVG 子作为插槽
【发布时间】:2019-07-12 03:18:10
【问题描述】:

我正在尝试将 Lit-Element 与由 SVG 元素包裹的单个插槽一起使用。

但似乎位于<svg> 中的<slot> 不接受渲染给定的SVG 元素。

什么在自定义组件中不起作用:

render() {
  return html`
  <svg>
    <slot><circle id="defaultCircle" cx=... cy=...></circle></slot>
  </svg>`
}

这里是一个例子:https://stackblitz.com/edit/wy6bhj?file=index.html

知道为什么吗?有什么选择吗?

2019-02-18 评论

Justin Fagnani 建议使用&lt;foreignObject&gt; 将 HTML(即插槽)与 SVG 混合。不幸的是,这不起作用,因为在插槽中它仍然是 SVG 元素。

2019-02-19 更新

使用 render() 函数中的 JavaScript 表达式,我尝试使用 this.children 迭代并在模板中添加子项。现在,使用检查器,它在 DOM 中正确显示,但 SVG 元素没有呈现任何内容。我迷路了,不明白为什么没有渲染圆圈。

https://stackblitz.com/edit/wy6bhj-hne7wl?file=my-element.js

2019-02-19 UPADTE2

我终于明白,我不可能按照最初想要的方式做到这一点。 我选择按原样传递 SVG 容器。

<my-element>
  <svg> ... </svg>
</my-element>

然后&lt;my-element&gt; 使用

const SVG_CONTAINER = this.children[0]
const NODES = SVG_CONTAINERS.children

计算事物。瞧!

【问题讨论】:

  • 为什么在&lt;slot&gt; 中包含任何内容?
  • 如果组件中没有传递任何内容,则插槽内的 是默认值。
  • 更新:我现在正在尝试使用 JavaScript 来遍历传递的子元素并将它们添加到自定义元素中
  • 也许可以创建一个官方的 rfc svg 规范请求以允许 svg 中的插槽元素并将其链接到此处。

标签: javascript svg web-component lit-element


【解决方案1】:

我认为你不能在 SVG 中使用 &lt;slot&gt;

简化您的代码只是为了看看什么是有效的。

下面是一个原生自定义元素,可让您嵌入内部内容。内部内容是 SVG。我在 SVG 中添加了值以使其工作。

class MyElement extends HTMLElement {
  constructor() {
    super();
    const s = this.attachShadow({mode:'open'});
    s.innerHTML = `<div>Your SVG</div>
      <div style="border:1px solid blue;width:20px;height:20px;"><slot></slot></div>`;
  }
}
customElements.define('my-element', MyElement);
<my-element>
<svg height="20" width="20">
<circle cx=10 cy=10 r=10 fill=red></circle>
</svg>
</my-element>

现在让我们尝试使用 svg 而不是 div:

class MyElement extends HTMLElement {
  constructor() {
    super();
    const s = this.attachShadow({mode:'open'});
    s.innerHTML = `<div>Your SVG</div>
      <svg height="20" width="20" style="border:1px solid blue;"><slot></slot></svg>`
  }
}
customElements.define('my-element', MyElement);
<my-element>
<circle cx=10 cy=10 r=10 fill=red></circle>
</my-element>

如果您深入研究开发工具,您会发现 SVG 拒绝接受作为子项的插槽标签。我不认为 SVG 允许 &lt;slot&gt; 并且我不确定。我只是不认为你可以按照你想要的方式做到这一点。

【讨论】:

  • 这是正确的,这就是我遵循的路径。我正在尝试寻找替代解决方案,但我意识到不可能在 SVG 中包含 。我不知道这是因为 LitElement 还是因为浏览器。我尝试过使用 svg 文字(它也不起作用,这很有意义)。
【解决方案2】:

svg 需要渲染的时间。这是您问题的替代方法。您可以使用生命周期来解决。但理想情况下,您需要采取另一种方法。每个 svg 都应该被竞争,并且 svg 可以有多个 svg。例如,您可以将 svg 作为图标。一盏 svgs 是一个图标集,它是您的组件。

Attached image

【讨论】:

  • 请将您图片中代码的相关部分转录成您答案中的代码块,并为您的图片链接提供适当的描述。
  • 我终于做到了。虽然我不确定包含大量 paths 的 SVG 的性能。这是聚合物生成器图标使用的好方法
猜你喜欢
  • 2021-03-19
  • 2021-10-29
  • 2019-07-17
  • 2018-02-21
  • 2021-02-19
  • 2019-04-25
  • 1970-01-01
  • 2018-11-11
  • 2020-04-29
相关资源
最近更新 更多