在 Svelte 5 中,组件的生命周期只包含两部分:其创建和其销毁。介于两者之间的一切——当某些状态更新时——与组件整体无关;只有需要响应状态变化的那些部分会被通知。这是因为底层最小的变化单位实际上不是组件,而是组件在初始化时设置的(渲染)效果。因此,不存在“更新前”/“更新后”的钩子。 ## `挂载` The `onMount` 函数在组件被挂载到 DOM 后立即调度一个回调函数。它必须在组件的初始化期间调用(但不需要位于组件内部*中*;它可以从外部模块调用)。 `onMount` 不在服务器上渲染的组件内部运行。 ```svelte ``` 如果从 `onMount` 返回一个函数,当组件卸载时将调用该函数。 ```svelte ``` > \[注意\] 此行为仅在传递给 `onMount`*同步* 返回值的函数时才有效。 `异步` 函数始终返回一个 `Promise`,因此不能 *同步* 返回一个函数。 ## `onDestroy` 安排在组件卸载前立即运行的回调。 从 `onMount`、`beforeUpdate`、`afterUpdate` 和 `onDestroy` 中,这是唯一一个在服务器端组件内部运行的。 ```svelte ``` ## `tick` 虽然没有“更新后”的钩子,您可以使用`tick`来确保在继续之前 UI 已更新。`tick`返回一个承诺,一旦任何挂起的状态更改已应用,或者在下一次微任务中如果没有挂起的任务,则承诺解决。 ```svelte ``` ## 弃用: `beforeUpdate` / `afterUpdate` Svelte 4 包含在组件整体更新前后运行的钩子。为了向后兼容,这些钩子在 Svelte 5 中被模拟,但不在使用 runes 的组件内部可用。 ```svelte ``` 而不是`beforeUpdate`,请使用`$effect.pre`,而不是`afterUpdate`,请使用`$effect`——这些符文提供了更细粒度的控制,并且只对您真正感兴趣的更改做出反应。 ### 聊天窗口示例 要实现一个当新消息出现时自动滚动到最底部的聊天窗口(但仅在你已经 *滚动到最底部* 的情况下),我们需要在更新之前测量 DOM。 在 Svelte 4 中,我们用`beforeUpdate`来做这件事,但这是一种有缺陷的方法——它会在*每次*更新之前触发,无论是否相关。在下面的例子中,我们需要引入像`updatingMessages`这样的检查,以确保在有人切换暗黑模式时,我们不会弄乱滚动位置。 使用符文,我们可以使用`$effect.pre`,它的行为与`$effect`相同,但会在 DOM 更新之前运行。只要我们在效果体内部显式引用`messages`,它就会在`messages`更改时运行,但*不会*在`theme`更改时运行。 `beforeUpdate`,以及其同样麻烦的对应项 `afterUpdate`,因此在 Svelte 5 中已被弃用。 * [ 在](/playground/untitled#H4sIAAAAAAAAE31WXa_bNgz9K6yL1QmWOLlrC-w6H8MeBgwY9tY9NfdBtmlbiywZkpyPBfnvo2zLcZK28AWuRPGI5OGhkEuQc4EmiL9eAskqDOLg97oOZoE9125jDigs0t6oRqfOsjap5rXd7uTO8qpW2sIFEsyVxn_qjFmcAcstar-xPN3DFXKtKgi768IVgQku0ELj3Lgs_kZjWIEGNpAzYXDlHWyJFZI1zJjeh4O5uvl_DY8oUkVeVoFuJKYls-_CGYS25Aboj0EtWNqel0wWoBoLTGZgmdgDS9zW4Uz4NsrswPHoyutN4xInkylstnBxdmIhh8m7xzqmoNE2Wq46n1RJQzEbq4g-JQSl7e-HDx-GdaTy3KD9E3lRWvj5Zu9QX1QN20dj7zyHz8s-1S6lW7Cpz3RnXTcm04hIlfdFuO8p2mQ5-3a06cqjrn559bF_2NHOnRZ5I1PLlXQNyQT-hedMHeUEDyjtdMxsa4n2eIbNhlTwhyRthaOKOmYtniwF6pwt0wXa6MBEg0OibZec27gz_dk3UrZ6hB2LLYoiv521Yd8Gt-foTrfhiCDP0lC9VUUhcDLU49Xe_9943cNvEArHfAjxeBTovvXiNpFynfEDpIIZs9kFbg52QbeNHWZzebz32s7xHco3nJAJl1nshmhz8dYOQJDyZetnbb2gTWe-vEeWlrfpZMavr56ldb29eNt6UXvgwgFbp_WC0tl2RK25rGk6lYz3nUI2lzvBXGHhPZPGWmKUXFNBKqdaW259wl_aHbiqoVIZdpE60Nax6IOujT0LbFFxIVTCxCRR2XloUcYNvSbnGHKBp763jHoj59xiZWJI0Wm0P_m3MSS985xkasn-cFq20xTDy3J5KFcjgUTD69BHdcHIjz431z28IqlxGcPSfdFnrGDZn6gD6lyo45zyHAD-btczf-98nhQxHEvKfeUtOVkSejD3q-9X7JbzjGtsdUxlKdFU8qGsT78uaw848syWMXz85Waq2Gnem4mAn3prweq4q6Y3JEpnqMmnPoFRgmd3ySW0LLRqSKlwYHriCvJvUs2yjMaaoA-XzTXLeGMe45zmhv_XAno3Mj0xF7USuqNvnE9H343QHlq-eAgxpbTPNR9yzUkgLjwSR0NK4wKoxy-jDg-9vy8sUSToakzW-9fX13Em9Q8T6Z26uZhBN36XUYo5q7ggLXBZoub2Ofv7g6GCZfTxe034NCjiudXj7Omla0eTfo7QBPOcYxbE7qG-vl3_B1G-_i_JCAAA) * [After](/playground/untitled#H4sIAAAAAAAAE31WXa-jNhD9K7PsdknUQJLurtRLPqo-VKrU1327uQ8GBnBjbGSb5KZR_nvHgMlXtyIS9njO-MyZGZRzUHCBJkhez4FkNQZJ8HvTBLPAnhq3MQcUFmlvVKszZ1mbTPPGbndyZ3ndKG3hDJZne7hAoVUNYY8JV-RBPgIt2AprhA18MpZZnIQ50_twuvLHNRrDSjRXj9fwiCJTBLIKdCsxq5j9EM4gtBU3QD8GjWBZd14xWYJqLTCZg2ViDyx1W4cz4dv0hsiB49FRHkyfsCgws3GjcTKZwmYLZ2feWc9o1W8zJQ2Fb62i5JUQRNRHgs-fx3WsisKg_RN5WVn4-WrvUd9VA9tH4-AcwbfFQIpkLWByvWzqSe2sk3kyjUlOec_XPU-3TRaz_75tuvKoi19e3OvipSpamVmupJM2F_gXnnJ1lBM8oLQjHceys8R7PMFms4HwD2lRhzeEe-EsvluSrHe2TJdo4wMTLY48XKwPzm0KGm2r5ajFtRYU4TWOY7-ddWHfxhDP0QkQhnf5PWRnVVkKnIx8fZsOb5dR16nwG4TCCRdCMphWQ7z1_DoOcp3zA2SCGbPZBa5jd0G_TRxmc36Me-mG6A7l60XIlMs8ce2-OXtrDyBItdz6qVjPadObzx-RZdV1nJjx64tXad1sz962njceOHfAzmk9JzrbXqg1lw3NkZL7vgE257t-uMDcO6attSSokpmgFqVMO2U93e_dDlzOUKsc-3t6zNZp6K9cG3sS2KGSUqiUiUmq8tNYoJwbmvpTAoXA96GyjCojI26xNglk6DpwOPm7NdRYp4ia0JL94bTqRiGB5WJxqFY37RGPoz3c6i4jP3rcUA7wmhqNywQW7om_YQ2L4UQdUBdCHSPiOQJ8bFcxHzeK0jKBY0XcV95SkCWlD9t-9eOM3TLKucauiyktJdpaPqT19ddF4wFHntsqgS-_XE01e48GMwnw02AtWZP02QyGVOkcNfk072CU4PkduZSWpVYt9SkcmJ64hPwHpWF5ziVls3wIFmmW89Y83vMeGf5PBxjcyPSkXNy10J18t3x6-a6CDtBq6SGklNKeazFyLahB3PVIGo2UbhOgGi9vKjzW_j6xVFFD17difXx5ebll0vwvkcGpn4sZ9MN3vqFYsJoL6gUuK9TcPrO_PxgzWMRfflSEr2NHPJf6lj1957rRpH8CNMG84JgHidUtXt4u_wK21LXERAgAAA==) ```svelte
{#each messages as message}

{message}

{/each}
```