Javascript Svelte JS:在另一个方法中实现onDestroy的目的是什么

Javascript Svelte JS:在另一个方法中实现onDestroy的目的是什么,javascript,components,svelte,ondestroy,Javascript,Components,Svelte,Ondestroy,我在学习苗条JS。在本文中,我们想知道在组件选项卡的定义中添加的ondestory方法的目的是什么。我知道这是一种管理组件被破坏时发生的事情的方法,但我从未见过在另一个方法中定义它 tab => { tabs.push(tab); selectedTab.update(current => current || tab); onDestroy(() => { const i = tabs.indexOf(

我在学习苗条JS。在本文中,我们想知道在组件
选项卡
的定义中添加的
ondestory
方法的目的是什么。我知道这是一种管理组件被破坏时发生的事情的方法,但我从未见过在另一个方法中定义它

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);
        });
    },

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


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

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


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

对于生命周期函数,有一个简单的规则,如
ondestory
:必须在组件初始化期间调用它们,即必须在组件的
标记中同步调用它们

<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>

从“svelte”导入{onDestroy}
onDestroy(..)//好的
{
onDestroy(..)//好的
}
(() => {
onDestroy(..)//好的
})()
const fn=回调=>{
onDestroy(回调)
}
fn()//好的
设置超时(()=>{
onDestroy(..)//不正常!!!
fn()//不正常
})
重要的是调用的时间,而不是它在代码中的位置。生命周期回调将附加到当前正在初始化的组件,无论调用来自何处

如果需要,可以将
ondestory
放入函数中,这只意味着此函数的用户必须在组件初始化期间调用它,并且在销毁此组件时将运行回调


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

对于生命周期函数,如
onDestroy
,有一个简单的规则:必须在组件初始化期间调用它们,即必须在组件的
标记中同步调用它们

<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>

从“svelte”导入{onDestroy}
onDestroy(..)//好的
{
onDestroy(..)//好的
}
(() => {
onDestroy(..)//好的
})()
const fn=回调=>{
onDestroy(回调)
}
fn()//好的
设置超时(()=>{
onDestroy(..)//不正常!!!
fn()//不正常
})
重要的是调用的时间,而不是它在代码中的位置。生命周期回调将附加到当前正在初始化的组件,无论调用来自何处

如果需要,可以将
ondestory
放入函数中,这只意味着此函数的用户必须在组件初始化期间调用它,并且在销毁此组件时将运行回调


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

谢谢您的回答!但是这个
ondestory
在一个函数中,而这个函数本身就在一个
setContext
中。这是否意味着无论您在何处实现
onDestroy
,它都将由使用父函数的组件播放?谢谢您的回答!但是这个
ondestory
在一个函数中,而这个函数本身就在一个
setContext
中。这是否意味着无论您在何处实现
onDestroy
,它都将始终由使用父函数的组件播放?感谢您的回答,它完美地回答了我的问题。是的,我也认为这是一个很好的封装:)谢谢你的回答,它完美地回答了我的问题。是的,我也认为这是一个很好的封装:)