Glimmer.js 如何在不使用构造函数的情况下将跟踪 属性 重置为初始值

Glimmer.js how to reset tracked property to initial value without using the constructor

在 Glimmer.js 中,不使用构造函数将跟踪的 属性 重置为初始值的最佳方法是什么?

注意:无法使用构造函数,因为它仅在初始页面呈现时调用一次,并且在后续页面点击时不再调用。

这个答案有两个部分,但它们之间的共同主题是它们强调从 强制性 风格(在生命周期挂钩中明确设置值)切换到 declarative 风格(使用真正的 one-way 数据流 and/or 使用装饰器清楚地表明你在哪里根据参数对本地状态进行某种转换)。

  1. 您确定需要这样做吗?很多时候人们认为他们这样做了,他们实际上应该只是重组他们的数据流。例如,在 Ember Classic 中的大部分时间,人们使用 didInsertElementdidReceiveAttrs 等钩子来达到“分叉”数据的模式。在 Glimmer 组件中(无论是在 Ember Octane 中还是在独立的 Glimmer.js 中),它是惯用的,而不是简单地在数据所有者中管理您的更新:really doing data-down-actions-up.

  2. 有时,在组件中创建跟踪数据的本地副本确实有意义——例如,当您希望在来自 API 和您处理表单数据的方式(因为 user interfaces are API boundaries!). In those scenarios, the @localCopy and @trackedReset decorators from tracked-toolbox 是很好的解决方案。

    • @localCopy 大致如其名。它创建通过参数传入的数据的本地副本,您可以通过操作在本地更改它,但如果参数值更改,它也会切换回参数。

    • @trackedReset 创建一些本地状态,当参数更新时,该状态 重置 。与@localCopy不同,状态不是参数的副本,它只需要在参数更新时重置。

使用这两种方法中的任何一种,您最终都会得到比旧 Ember 经典方法更具“声明性”的数据流:“分叉”数据是通过装饰器完成的(方法 2),并且很多时候你根本不会分叉它,因为你只是将更改推回到原始数据的所有者 (1)。