【问题标题】:Svelte JS: what is the purpose of the onDestroy implementation inside another methodSvelte JS:在另一个方法中实现 onDestroy 的目的是什么
【发布时间】:2020-06-19 07:21:26
【问题描述】:

我正在学习 Svelte JS。在这个REPL 中,想知道在组件Tabs 的定义中添加onDestroy 方法的目的是什么。我知道这是管理组件被销毁时发生的事情的方法,但我从未见过它在另一个方法中定义。

tab => {
        tabs.push(tab);
        selectedTab.update(current => current || tab);

        onDestroy(() => {
            const i = tabs.indexOf(tab);
            tabs.splice(i, 1);
            selectedTab.update(current => current === tab ? (tabs[i] || tabs[tabs.length - 1]) : current);
        });
    },

【问题讨论】:

    标签: javascript components svelte ondestroy


    【解决方案1】:

    onDestroy这样的生命周期函数有一个简单的规则:它们必须在组件初始化期间调用,即它们必须在组件的<script>标签中同步调用。

    <script>
      import { onDestroy } from 'svelte'
    
      onDestroy(..) // ok
    
      {
        onDestroy(..) // ok
      }
    
      (() => {
        onDestroy(..) // ok
      })()
    
      const fn = callback => {
        onDestroy(callback)
      }
    
      fn() // ok
    
      setTimeout(() => {
        onDestroy(..) // NOT OK !!!
        fn() // NOT OK
      })
    </script>
    

    重要的是调用的时间,而不是它在代码中的位置。生命周期回调将附加到当前正在初始化的组件,无论调用来自何处。

    如果你愿意,你可以把onDestroy放在一个函数中,这只是意味着这个函数的用户必须在一个组件的初始化过程中调用它,并且回调会在this 组件被销毁。

    在您链接的示例中,上下文用作包含onDestroy 的函数的传输。上下文也必须在组件的初始化阶段同步解决,所以我们很好。组件从上下文中获取函数,它立即调用它,并且该函数可以在组件不知道的情况下注册一些对组件的清理。这是很好的封装。

    【讨论】:

    • 感谢您的回答,它完美地回答了我的问题。是的,我认为这也是一个很好的封装:)
    【解决方案2】:

    调用onDestroy 会添加一个回调,该回调将在 svelte 组件被销毁时调用。您可以根据需要添加任意数量的回调,并随时调用该方法。

    在这里,开发人员似乎希望针对不同的上下文使用不同的清理例程。

    【讨论】:

    • 感谢您的回答!但是这个onDestroy 位于一个函数内部,而该函数本身又位于setContext 内部。是不是说无论你在哪里实现onDestroy,都会被使用父函数的组件播放?
    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2011-09-09
    • 2012-12-07
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    相关资源
    最近更新 更多