Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

A bindable array-type prop that uses a non-array prop to build its default value results in non-reactivity for the bindable property #11425

Open
kran6a opened this issue May 2, 2024 · 7 comments
Labels
Milestone

Comments

@kran6a
Copy link

kran6a commented May 2, 2024

Describe the bug

let {min = 0, max = 100, value = $bindable([min])} = $props();

Results in value not being reactive

Reproduction

https://svelte-5-preview.vercel.app/#H4sIAAAAAAAACkWOQarDMAxEryJEFykY6m7z40LPEWfhJmoRxIqxndIScvePsulu9AbNzIZPnqlg228oIRK2eE8JDdZv0qO8aa6EBsuy5lFJV8bMqd68-DpThS2ygANrIIYPOLhaa-Ad5pXAwenBMoXHTE0fWYbzrizlJZXm_KcJJ5aSaKzN8aGsu_wKpEtHz3a4vR129ZV1LGmtoCudxxzkRR4hsjiPVlX4OI9Xq1o3tEeC-wVdbmgwLhM_mSZsa15pH_Z_rDIG3w8BAAA=

Logs

No response

System Info

Does not matter

Severity

annoyance

@paoloricciuti
Copy link
Contributor

Even worst, it's actually every "complex" prop like objects or array. It's treated as immutable.

@paoloricciuti
Copy link
Contributor

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.

@paoloricciuti
Copy link
Contributor

Behavior in Svelte 4

@dummdidumm
Copy link
Member

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.

@dummdidumm dummdidumm added this to the 5.0 milestone May 2, 2024
@paoloricciuti
Copy link
Contributor

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>

@7nik
Copy link

7nik commented May 6, 2024

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.

@dummdidumm dummdidumm added the bug label May 16, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants