gpt4 book ai didi

svelte - 延迟加载组件

转载 作者:行者123 更新时间:2023-12-03 20:51:23 25 4
gpt4 key购买 nike

我正在寻找一个 Svelte“将延迟加载”组件委托(delegate)给另一个“真实”组件。这个组件对于不应该知道有这个“代理”的用户应该是透明的:

  • 延迟加载委托(delegate)(使用动态导入 js 模块的回调)
  • 支持槽(槽准备好后应转发给委托(delegate))
  • 支持事件(通过将订阅转发给委托(delegate))

  • 我认为现在不可能,因为没有为插槽转发或事件转发公开 api。也许通过在 js 中实现相同的内部接口(interface)来实现一个 hack 有一个 slim 的组件?
    编辑
    我正在寻找这种神奇的方法:
    我有一个 Heavy 组件,我想异步加载它
    重. slim :
    <div on:click>
    <slot {secret}/>
    <slot name="footer"/>
    </div>

    <script>
    let secret = 'huhu';
    </script>
    我希望能够像这样导出这个组件:
    模块.js
    import { lazy } from './lazy.js'; // magic method

    export let Heavy = lazy(async () => (await import('./Heavy.svelte')).default)
    然后,消费者可以在不知道它已被包装在这个“高阶”惰性组件中的情况下使用 Heavy。此使用者不必处理/了解有关此包装器的异步行为的任何信息:
    消费者 slim
    <Heavy on:click={() => console.log("clicked")} let:secret>
    <div>{secret}</div>
    <div slot="footer">Footer</div>
    </Heavy>

    <script>
    import { Heavy } from './module.js';
    </script>
    我有一个“工作”解决方案,它不支持“让”,不支持命名插槽,也不支持事件..

    最佳答案

    我能做到的最好的。 bind:* 不起作用,插槽和事件似乎起作用。
    Wrapper.svelte

    <svelte:component this={cpn} {...slotsProps} {...$$restProps} bind:this={instance}/>

    <script>
    import { get_current_component } from 'svelte/internal';

    export let provider;

    const slotsProps = {"$$slots":$$props.$$slots, "$$scope":$$props.$$scope};
    const self = get_current_component();

    let cpn;
    let instance;

    provider().then(result => cpn = result);

    $: if (instance) {
    for (let [type, listeners] of Object.entries(self.$$.callbacks)) {
    instance.$on(type, (e) => {
    listeners.forEach(l => l(e));
    });
    }
    }

    </script>
    懒惰的.js
    import Wrapper from './Wrapper.svelte';

    export function lazy(provider) {
    return function(opts) {
    opts.props = {...opts.props, provider };
    return new Wrapper(opts)
    }
    }
    module.js(用例示例)
    import { lazy } from './lazy.js';

    export let Heavy = lazy(async () => (await import("./Heavy.svelte")).Heavy);

    关于svelte - 延迟加载组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62607182/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com