[英]Is this a valid usage of @cached for autotracking of Ember Octane?
最近我在編寫帶有自動跟蹤功能的 Glimmer 組件時遇到了一個來自tracked-toolbox的@cached
用例。 這是一個示例代碼片段:
import Component from '@glimmer/component';
/**
* Example usage
* <PersonInfo
* @a={{this.objA}}
* @b={{this.stringB}}
* @c={{this.intC}}
* />
* Where objA can be a large object
*/
export default class PersonInfo extends Component {
/**
* I hope @cached here can help avoid re-running output getter in each
* of the other getters, e.g. this.msg, this.link, this.name
* But whenever any input args changes it triggers update
* (i.e. parent run this.objA = newObj)
*/
get output() {
return someExpensiveLogic(this.args.a, this.args.b, this.args.c);
}
get msg() {
return translate(this.output.msg);
}
get link() {
return convert(this.output.link);
}
get name() {
return change(this.output.name);
}
}
{{!-- In the template --}}
<div>
{{this.name}}
{{this.msg}}
{{this.link}}
</div>
在不使用@cached
,上面的代碼在渲染時會執行 3 次output
getter,分別對msg
、 link
和name
。
我還考慮過為output
構建自己的緩存,但它需要我手動跟蹤使用了哪個狀態並對它們進行哈希處理,這可能很昂貴且難以維護。
根據我的理解, @cached
提供的是對自動跟蹤系統中“全局標簽”的訪問,因此我可以依靠該標簽來確定緩存何時需要刷新。
由於我目前從事的公司項目不支持此功能,我希望這種用法可以鼓勵我們以后添加此類支持。
注意:我發現@cached
是方便的包裝器
import { createCache, getValue } from '@glimmer/tracking/primitives/cache';
所以基本上我需要的是@glimmer/tracking/primitives/cache
。
根據離線討論在此處發布跟進。
這是tracked-toolbox 中@cached
實用程序的有效用法。 狹義用例滿足以下要求:
output
吸氣劑很貴。output
的結果在 JS 中的其他 getter 中多次使用。 (如果this.output
僅直接在模板中使用,它在重新運行時已經具有與@cache
完全相同的語義。)output
getter 中使用的值的顯式緩存相比,使用@cache
不會評估參數值的更改,這意味着如果this.args.b
設置為與以前相同的值, output
getter 仍將重新運行. 在這個用例中這不是問題,因為我知道父級不會在輸入參數中設置相同的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.