Replies: 1 comment 2 replies
-
I'm also discovering these paradigms as I update from Svelte 4 to 5 and search the new docs. It's helpful to have them in one place, thanks. For number 2, I think it works the opposite way though, is that correct? E.g. an update to a store inside a $derived rune triggers an update? |
Beta Was this translation helpful? Give feedback.
2 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
These is a collection of non-obvious details about Svelte 5 Runes, they are quite important when working with Runes and are scattered across the docs, GitHub issues/discussions and Reddit or just my own learnings. I update this list from time to time and you are welcome to contribute. You should know the very basics of Runes before reading this list.
$derived
: The use of$derived
and$derived.by
is quite restricted since it can only be used as a variable declaration initializer or a class field; instead you can just use a function, e.g.() => someRuneState
, it works everywhere, often requires less mental overhead and it is way less verbose; do not forget to call the function when using, contrary to$derived
; still,$derived
can be quite handy, in particular as variable declaration initializer in components where I still use itderived
store (so the one without $), Runes within do not trigger updates; so oldderived
stores need to to be migrated as well (besides, you can't import derived anymore once in Rune mode using the new $derived, except you rename the old derived import)$derived
,$derived.by
,$effect
and within a called function (1); outside of components use the fromStore function.ts
files to.svelte.ts
when you use Runes, you do not need to do so when importing a function which contains Runes, e.g.,count
(a$state
Rune) orderivedCount
(a function, not a$derived
Rune) fromcount.svelte.js
can be imported toanotherFile.ts
and used there; so you need to rename only when Runes are used explicitelylet anotherVar = someSpring
, you can't do this with primitive $staates where you'd need $derived; while obvious, bugs can be easily introduced, in particular in classes with nested primitive $statesobject
Runes: Check this post which gives a detailed overview, tl;dr is, default to $state objects and functions instead of $derivedSpring
class, check the docs but also this PR for more detailed docs, e.g.,Spring.of
is a handy way to create a derived Spring without the need of the need of$derived
$state
as class fields: $state() as class fields turns them into private fields with auto-generated getters and setters, and, e.g., $state.snapshot() uses .toJSON() as part of its functionality, which can’t see private fields; so, you might run into hard-to-detect bugs, more in this Reddit post; this might also affect$derived
, see also again (1)Beta Was this translation helpful? Give feedback.
All reactions