【问题标题】:How to call destroy on a component from inside the component?如何从组件内部调用组件的销毁?
【发布时间】:2020-09-19 10:09:35
【问题描述】:

我有一个模态组件,我希望能够在用户单击 x 按钮时将其销毁,我还有一个通知弹出窗口,它会在一段时间后自行销毁,但我想让用户能够也可以用 x 按钮关闭它。 我知道我可以将事件传递给组件,但我认为如果组件是自毁的会更好。 对于这种情况,也可能有更好的设计,但我就是这么想的,其他指针将不胜感激。

【问题讨论】:

  • 为了说明更多,也许像 this.destroy() 这样的东西?

标签: svelte svelte-component


【解决方案1】:

如果破坏是指从 DOM 中删除节点,那么您需要做的就是使用 Svelte 的 bind:this 获取对组件中最顶层元素的引用,然后使用 Node.removeChild() 删除所述元素:

<script>
  let nodeRef
</script>

<div bind:this={nodeRef}>
  <h3>Hey I'm a component</h3>
  <button on:click={() => nodeRef.parentNode.removeChild(nodeRef)}>
    Remove me :(
  </button>
</div>

Demo REPL

编辑

我错过了建议不同方法的重点。由于模态或通知的显示将由父组件触发(无论是来自用户操作还是作为程序响应),所以对我来说更自然的是,父组件也会处理模态或通知的解除。

您不必使用事件来处理关闭模式或通知,您可以简单地将关闭处理程序作为道具传递。这也将使您不必自己处理节点删除(或节点创建/附加)。

类似下面的东西会更“苗条”:

App.svelte

<script>
  import MyModal from './MyModal.svelte'

  let showModal = false
</script>

<div>
  {#if showModal}
    <MyModal onClose={() => showModal = false} />
  {/if}
  <button on:click={() => showModal = true}>Show Modal</button>
</div>

MyModal.svelte

<script>
  export let onClose
</script>

<div>
  <h3>Hi I'm a modal <span on:click={onClose}>X</span></h3>
</div>  

Demo 2 REPL

【讨论】:

  • 谢谢,我使用的是第二种方法,但觉得可能有更好的方法,很高兴知道我的想法还没有走得太远。
  • 请注意,如果您的模态/通知组件不是处理显示/关闭逻辑的父级的直接子级,则可能值得使用存储来保存 showModalshowNotification 布尔值所以您不必通过多层嵌套组件传递关闭处理程序。
  • 明白了!当然会记住这一点,我只是试着把自己放在一个我不必为 UI 使用商店的位置,只有数据:)
  • 我听到了,我大体上同意,但将这些组件保留为直接子级并不总是可能(或可取的),坦率地说,在这些情况下,有一个专门用于跟踪 UI 状态的存储是一个非常简单有效的解决方案。祝你的开发者好运! :)
  • 我对此表示怀疑,因为没有调用 onDestroy。请查看您更新的 Demo 1 REPL 控制台日志svelte.dev/repl/49dc7605f26c4b32939d1223317158b2?version=3.23.0
猜你喜欢
  • 2017-11-30
  • 2018-01-27
  • 2019-03-16
  • 2019-07-28
  • 2015-10-19
  • 1970-01-01
  • 2017-11-20
  • 2019-01-28
  • 2021-04-19
相关资源
最近更新 更多