Comments (3)
The problem here is that nullish values (undefined
and null
) are generally mean "remove the attribute", which is what happens in this case for the spread cases. For the reactive variable case it's the "has this value changed" check which results to false
because the initial value of the cache variable is undefined
. Using null
instead fixes the issues except for the spread case.
What's the use case for setting the value of an option to undefined
?
Svelte 4 has the same problem for spread, works in the other cases though.
from svelte.
What's the use case for setting the value of an option to undefined?
I do this in order to set a variable to undefined
using two-way binding. The main reason I ran into this was because of the following scenario:
<script>
let { intent = 'primary', children } = $props();
</script>
<button class="flex ..." class:bg-primary={intent === 'primary'}>
{@render children}
</button>
Somewhere in a docs app there was a preview that uses a select element to switch between the different prop values, something like:
<script>
import { Button } from '...';
let intent;
</script>
<select bind:value={intent}>
<option value={undefined}>Default</option>
<option value="primary">Primary</option>
</select>
<Button {intent}>Button</Button>
The option
with value={undefined}
is used to mimic the default behavior; what happens when no prop is passed. This worked "fine", however, I'm replacing the select and option elements with components, and that's when I started running into problems. I found out that using undefined
as a value was no longer possible, because an option
without value will fall back to using the content as value, <option>Default</option>
results in option.value === 'Default'
.
Using null instead fixes the issues except for the spread case.
After reading this I went back to try it again, and to my confusion it wasn't working, and when I tried to reproduce it in the REPL it was working. In my application the select
element was suddenly "empty" on page load, and the value of the variable was null
, selecting the Default
option set the variable to Default
(the same is true when the value is undefined
). Finally I figured out what the issue was, and why it isn't working in my app. It turns out that adding any kind of spread, even an empty object results in the attribute being removed, and on initial mount the value will remain null
, but the option has a different value, resulting in the option not being selected. You can see a reproduction in the following REPL:
I also started playing around with inputs with bind:group
, and it produces a similar result, only in that case the value ends up being undefined
instead of null
(to add: when using undefined
as value it works fine, which makes sense since it does not have a fallback value like option
elements):
Personally I get why nullish attributes are removed, it makes sense in most cases to provide a convenience API. Though it seems that the "technically correct" way to represent a (edit: on second thought I believe what I'm saying here is not correct)value
attribute with a nullish value would be an empty attribute. At least it seems more in line with how HTML and the DOM work natively.
My main concern isn't what is "technically" correct, but rather the inconsistent behaviour between different scenarios, especially the scenario in the REPLs above seems odd (I would guess that's a bug?). The inconsistency between non-reactive values, reactive values, and spread makes things a bit confusing, at least for me.
from svelte.
I'm currently working around this by using an empty string as a value:
<script>
import { Button } from '...';
let intent = "";
</script>
<select bind:value={intent}>
<option value="">Default</option>
<option value="primary">Primary</option>
</select>
<Button intent={intent || undefined}>Button</Button>
In my opinion not the prettiest, but it works for my specific use case.
from svelte.
Related Issues (20)
- Svelte 5: Whitespace before the closing brace of `{#snippet}` will throw a parse error.
- Svelte 5: cannot use `@render` for $$slots HOT 8
- Low quality animation example HOT 7
- Svelte 5: Snippet Shorthand HOT 2
- Svelte 5: Mutating promise based arrays do not trigger updates HOT 7
- Svelte 5: Document $svelte.is(a,b) using Object.is(a,b). HOT 2
- Imported global styles apply differently in dev and build mode HOT 1
- Svelte 5 migration: erroneous `$state` declaration when `each` block present HOT 1
- Svelte 5 migration: event modifier transformer doesn't respect indentation HOT 2
- Svelte 5 migration: Transformed declarations with TS annotations cause broken output
- Svelte 4/5 incompatibility: exporting the same variable with two names breaks the export. HOT 2
- Addition assignment operator (+=) broken
- "node is null" when manipulating an array state in a Snippet HOT 4
- Styles are not removed after transition slide end HOT 2
- Svelte 5 migration: statements should be reordered
- Svelte 5: leaking private implementation details ($$events, $$slots) HOT 3
- Svelte 5: Snippets aren't deconflicted HOT 5
- Svelte5: snippets components invoked multiple times HOT 4
- The exported names of the reactive Map, Set, and others conflict with platform globals HOT 6
- Svelte 5: non-keyed each blocks do not retain text direction in elements with `dir="auto"` 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.