【问题标题】:How to get a reference to a Svelte component from within the component如何从组件中获取对 Svelte 组件的引用
【发布时间】:2022-01-02 22:47:17
【问题描述】:

有一种简单的方法可以从父作用域获取对子组件实例的引用,如 in the tutorial 所示。

我想要的是从组件本身中获取对组件的引用。因此,如果我们查看上面链接的官方 Svelte 演示,我的意思是我希望从 InputField 实例中引用 InputField 实例,而不是从 App.svelte。

(我想要这个的原因:我需要实例来触发外部 JS 库的钩子,这些库将以编程方式与实例交互。)

教程中的代码副本(为了方便和长寿)

App.svelte:

<script>
    import InputField from './InputField.svelte';
    let field;
</script>
<InputField bind:this={field}/>
<button on:click={() => field.focus()}>Focus field</button>

InputFiled.svelte:

<script>
    let input;
    export function focus() {
        input.focus();
    }

    // Somewhere here, I want a var, like you might imagine the following to do:
    let myself = this;
</script>
<input bind:this={input} />

【问题讨论】:

    标签: javascript svelte svelte-3


    【解决方案1】:

    您可以从父母那里获得参考并将其传递给孩子:

    <script>
        import InputField from './InputField.svelte';
        let field;
    </script>
    
    <InputField bind:this={field} {field}/>
    
    <button on:click={() => field.focus()}>Focus field</button>
    

    一旦你得到该字段,就将它传递给输入

    <script>
        let input;
            export let field;
        export function focus() {
            input.focus();
        }
            let myself;
            $:if(field) myself = field;
    </script>
    <input bind:this={input} />
    

    你可以在上下文中使用它。

    【讨论】:

    • 我确实认为这可能是一种选择(尽管必须这样做似乎很奇怪!)。 “您可以在上下文中使用它”是什么意思?
    • @artfulrobot 在输入中使用字段和 usecontext 创建上下文,这只是一种整理事物的方式,不会奇怪地将其传递给组件并能够在任何地方使用它。
    • 啊,是的,好的,非常感谢。
    【解决方案2】:

    将在父级中设置的引用作为道具传递给子级时,可以在组件本身内部使用它> REPL

    App.svelte
    <script>
        import Component from './Component.svelte';
        
        let reference
            
    </script>
    
    <Component bind:this={reference} {reference}/>
    
    Component.svelte
    <script>
        
        export let reference;
        
        $: reference && console.log('reference in component', reference)
    
    </script>
    

    【讨论】:

    • 谢谢,但这和谢里夫的回答不一样吗? stackoverflow.com/a/70098315/623519
    • @artfulrobot 关于程序,是的。但我发现有一些不必要的代码行和不必要的重新分配使得更难看到这个概念。我考虑过编辑,但感觉几乎要更改整个答案,所以我决定简单地用 Repl 发布替代方案
    • @Corrl 没有多余的代码行,这些行在原始代码本身中,没有添加任何多余的功能进行编辑。
    • @SherifSalah 将field 重新分配给myself 怎么样?为什么不直接导出“我自己”并将myself={field} 作为道具传递?使用其他代码(焦点功能、按钮、输入),OP 解释了他正在寻找的功能(获取对子组件而不是父组件的引用) - 这对保留答案很重要吗?我会说不,因为我发现代码越少越容易阅读和理解
    猜你喜欢
    • 2020-10-26
    • 2019-01-02
    • 2021-07-20
    • 1970-01-01
    • 2020-09-28
    • 2020-10-24
    • 2021-07-23
    • 2016-08-03
    • 2020-02-12
    相关资源
    最近更新 更多