Closed shining-mind closed 1 week ago
Важный нюанс: в itemStore должна хранится ссылка на объект, между ререндерами ссылка не должна меняться.
Добавил тесты в PR: https://github.com/V4Fire/Client/pull/1289/commits/6cd450ca310120d4413303650363b9efcc2d49f9
При первом mounted в кэше геттера нет значения.
// first render
u14bc48a3b70499 "value" cached = false | canUseCache = false | hook = beforeDataCreate 868 ms
u14bc48a3b70499 "value" = undefined <string> 868 ms
// mounted
// the cache is invalidated due to item change: undefined -> {value: 3.14}
u14bc48a3b70499 invalidateComputedCache "value" 871 ms
u14bc48a3b70499 "value" cached = false | canUseCache = true | hook = mounted 872 ms
u14bc48a3b70499 "value" = 3.14 <string> 872 ms
// re-render
u5a4fffc37f46c "value" cached = false | canUseCache = false | hook = beforeDataCreate 896 ms
u5a4fffc37f46c "value" = undefined <string> 896 ms
// clean memory of previous context
u14bc48a3b70499 clear "rootAttrs" 897 ms
u14bc48a3b70499 clear "sharedMods" 897 ms
u14bc48a3b70499 clear "m" 898 ms
u14bc48a3b70499 clear "db" 898 ms
u14bc48a3b70499 clear "value" 898 ms
// mounted
// the value cache is not invalidated as the item was transfered from previous context
// and didn't change: {value: 3.14} -> {value: 3.14}
u5a4fffc37f46c "value" cached = true | canUseCache = true | hook = mounted 899 ms
Пример в ветке:
Есть функциональный компонент с системым полем
itemStore
, на которое ссылается геттер/сеттерitem
. Далее геттерitem
используется в геттереvalue
. По умолчанию,itemStore
равенundefined
.Как видим выше сценарий не типовой для функционального компонента, однако он встречается. Для разработчика абсолютно неочевидно, что происходит перенос части свойств из старого контекста в новый при пересоздании функционального компонента.
Текущими средствами проблему можно решить так:
itemStore
какunique: true
.mounted
.