Comments (7)
On discord another example was brought up where it's completely unexpected that a prop is frozen.
if you pass in
$state.frozen
it won't work aswell, and we can't really know if the property is intended to be used with$state
or$state.frozen
.
You can pass a non-reactive object and reactivity won't work either.
Knowing that props are reactive, I'd expect the fallback value also to be reactive in a regular way ($state). Otherwise, it must be documented, and a way to change this behaviour must be provided.
from svelte.
If you're not using the fallback value and instead pass something bound in, the value is reactive - playground example. So I think maybe we should proxify the default value? On the other hand, if you pass in
$state.frozen
it won't work aswell, and we can't really know if the property is intended to be used with$state
or$state.frozen
. This is an edge case with no clear right answer.
But also it's a byproduct of every prop being immutable
in svelte 5. And if you use immutable in svelte 4 the behavior is the same. I can't remember the reason why immutable={true}
was chosen as the only option but this would kinda negate that.
On the other hand it does seems a bit of a smell. What if you could also use $state
and $state.frozen
for the fallback value?
<script>
let { value: $state([0]), other_value: $state.frozen([0]), min: 0 } = $props();
</script>
from svelte.
The problem is not even $bindable
is just the array itself
from svelte.
Even worst, it's actually every "complex" prop like objects or array. It's treated as immutable.
from svelte.
I'll try to investigate a bit further later but in the meantime i'll send my findings:
by being immutable
by default in runes mode mutating prop.something
or prop[something]
is not recognized as a "reassignment". The problem is there even for legacy mode with immutable
option set to true via svelte:options
. However this is by design so i'm not sure this is actually a bug.
The fact that svelte treat this as immutable also mean that trying to modify a prop deeply will not work because the equality fn will just involve the top level.
from svelte.
Behavior in Svelte 4
from svelte.
If you're not using the fallback value and instead pass something bound in, the value is reactive - playground example. So I think maybe we should proxify the default value? On the other hand, if you pass in $state.frozen
it won't work aswell, and we can't really know if the property is intended to be used with $state
or $state.frozen
. This is an edge case with no clear right answer.
from svelte.
Related Issues (20)
- $derived rune on Set object does not re-render on update HOT 2
- Svelte 5: Cannot specify `this`' type in TypeScript HOT 3
- Accessibility warning: href shouldn't be required when aria-disabled="true"
- Svelte 5: confusing behaviour with syntactically invalid attribute expressions HOT 2
- Add rune to more easily combine reactive values and state objects HOT 5
- Passing a Writable as prop to a component doesn't allow "$" access HOT 2
- Svelte 5: dynamic class name not supported on SVG
- Svelte 5: Monkeypatching introduced in #11610 has broken array_prototype.lastIndexOf()
- Svelte version @5.0.0-next.140 breaks Svelte-dnd-action HOT 9
- DOM does not update when using array of objects in $state.frozen() HOT 4
- Svelte 5: onanimationend event doesn't get called under these specific circumstances. HOT 1
- Svelte v5 (maybe v4 too?) incorrectly removes CSS selectors alleging they are unused HOT 9
- Disable paste rather then copy in the tutorial. HOT 2
- Immer JS doesn't work with svelte runes HOT 5
- 5.0.0-next.138 breaks nested global CSS-attribute selectors
- 5.0.0-next.140 blocks pre-render capabilities of $effect.pre() HOT 6
- Svelte action update doesn't trigger on classes HOT 4
- Svelte 5: CSS custom property wrapper is implemented incorrectly HOT 5
- svelte 5: gotpointercapture and lostpointercapture not paresed correctly
- Anchor Tags Triggering Old URLs in Android Chrome HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from svelte.