【问题标题】:Is it possible to dynamically load a Svelte template at runtime?是否可以在运行时动态加载 Svelte 模板?
【发布时间】:2018-05-11 20:59:17
【问题描述】:

我查看了[<svelte:component>] (here) 的文档,但看起来我必须在编译时import 所有可能的模板。

是否可以在 Svelte 中根据用户操作从 fetch() 调用中加载任意数量的任意模板?然后往里面注入数据?

如果我打算在初始加载后更新它,那么使用 <slot> 会不会效率低下?

【问题讨论】:

    标签: svelte


    【解决方案1】:

    从源文本创建组件在技术上是可行的——例如the REPL does it——因为编译器并不关心它是在 Node 中运行还是在浏览器中运行。但绝对不推荐! (它会破坏使用 Svelte 的目标,因为编译器有点大。)

    相反,如果您使用 Rollup(使用 experimentalDynamicImportexperimentalCodeSplitting)或 webpack,您可以动态导入组件本身:

    <button on:click="loadChatbox()">
      chat to a customer service representative
    </button>
    
    {#if ChatBox}
      <svelte:component this={ChatBox}/>
    {/if}
    
    <script>
      export default {
        methods: {
          async loadChatbox() {
            const { default: Chatbox } = await import('./Chatbox.html');
            this.set({ Chatbox });
          }
        }
      };
    </script>
    

    【讨论】:

    • 如果动态组件只指定为字符串怎么办?例如“聊天框”?
    • 打包程序在构建时需要 import('x') 中的“x”,以便他们可以创建必要的代码拆分块。传统的解决方案是有一个加载器的地图,比如{A: () =&gt; import('./A.svelte'), B: () =&gt; import('./B.svelte'), ...}
    • @RichHarris 我们有点需要这样的东西来内省组件为文档(而不是生产)公开的道具。有没有办法做到这一点?我理想的解决方案是包装另一个组件,然后吐出从插槽中取出的孩子的道具。这是一件事,还是像巫术? ;)(记录在案:过去构建设计系统的一个巨大问题是必须手动编辑文档更新,因此我们试图避免这种情况,并从组件本身自动生成我们所能做的一切)谢谢前进!
    猜你喜欢
    • 1970-01-01
    • 2011-10-15
    • 2012-06-09
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    相关资源
    最近更新 更多