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 explicitelyobject
Runes: You can't reassign$state
once exported if it contains primitives, you can work-around by using anobject
; defaulting to objects might seem over-eager and verbose, on the other side, one decision less every time you use them and you can add actions right away, so it might be good to default to objects outside of components since then, you would need to import them anyway; I am not yet decided if it is good to use also a default property key, e.g..value
Spring
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