【问题标题】:How to use the <slot> element twice?如何两次使用 <slot> 元素?
【发布时间】:2018-03-24 04:45:32
【问题描述】:

我正在使用 Svelte,我想创建一个组件来允许我执行以下操作:

<CodeDisplay>
    <button class="btn">Button</button>
</CodeDisplay>

CodeDisplay.html 应该如下所示:

<slot></slot>
<code><slot></slot></code>

本质上,我想要的是一个组件,它将首先呈现我放置在组件中的 HTML 代码,然后我想显示代码本身。 (我正在构建一个文档系统。)

似乎你不能多次使用&lt;slot&gt;&lt;/slot&gt;,这是有道理的。

我将如何完成我在这里尝试的事情。对于文档中的每个示例,我真的想避免在我的代码中重复两次 HTML 代码。我只是觉得有一个组件会很好,一般来说,我可以传递一些 HTML,然后组件将呈现 HTML 并显示代码。

编辑: 我刚刚意识到我可以做这样的事情:

{{{html}}}
<pre><code>{{html}}</code></pre>

<script>
  export default {
    data() {
      return {
        html: '',
      }
    }
  };
</script>

并像这样显示它:

<CodeDisplay html='<button class="btn">Button</button>'/>

但是我遇到了一些错误(发生不一致)。

【问题讨论】:

    标签: javascript slot svelte


    【解决方案1】:

    你见过叫&lt;slot&gt;s吗?

    <slot name="slot-one"></slot> // Show rendered HTML
    <slot name="slot-two"></slot> // Show HTML as string
    

    当您使用反引号创建 HTML-sn-p 示例时,您可以在 slot-one 中呈现它并在 slot-two 中将其显示为(格式良好的多行)示例:

    let mySnippet = `<div>
                        <div>
                            <span>Hello</span>
                        </div>
                    </div`;
    

    我不是 SvelteJS 专家,但你 you can test/check here with this example

    【讨论】:

    • 我确实在文档中阅读了该部分。我不相信这能完成我想做的事情。
    • 所以我看到了你的编辑,这让我想到了如何完成我想要的事情。基本上,有一个 JSON 文件,它使用带有反引号的模板字符串存储 HTML 标记,就像你说的那样。然后,我可以在我的模板代码中循环遍历 JSON 并传入一个绑定而不是 。这样我的 CodeDisplay 组件看起来更像:{{html}}{{html}}
    • 再次重申,我希望只需要编写一次 HTML,然后组件将负责呈现 HTML 和 HTML 代码本身。
    • 将数据存储在 JSON 中总是一个好主意,并使用组件来显示一个内容块(保持您的代码干净和可读)。我自己并没有真正使用过 SvelteJS,我只知道 slot 的名称,因为很多 Js 框架都有这些(或类似的东西)。我真的不能再帮你了,但我希望我已经用命名槽和反引号 HTML 为你指明了正确的方向。
    • 我已经编辑了我的问题,以包含另一种方法来完成我想要的。两个花括号和三个花括号之间的区别。 ({{ vs {{{)
    猜你喜欢
    • 1970-01-01
    • 2017-08-10
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多