Skip to content

Commit c2e805f

Browse files
authored
fix: consistently set value to blank string when value attribute is undefined (#15057)
Fixes #4467
1 parent 8bba70b commit c2e805f

File tree

4 files changed

+65
-2
lines changed

4 files changed

+65
-2
lines changed

.changeset/dirty-sloths-move.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"svelte": patch
3+
---
4+
5+
fix: consistently set value to blank string when value attribute is undefined

packages/svelte/src/internal/client/dom/elements/attributes.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,14 @@ export function set_value(element, value) {
6868
// treat null and undefined the same for the initial value
6969
value ?? undefined) ||
7070
// @ts-expect-error
71-
// `progress` elements always need their value set when its `0`
71+
// `progress` elements always need their value set when it's `0`
7272
(element.value === value && (value !== 0 || element.nodeName !== 'PROGRESS'))
7373
) {
7474
return;
7575
}
7676

7777
// @ts-expect-error
78-
element.value = value;
78+
element.value = value ?? '';
7979
}
8080

8181
/**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { test, ok } from '../../test';
2+
import { flushSync } from 'svelte';
3+
4+
export default test({
5+
mode: ['client'],
6+
7+
async test({ assert, target }) {
8+
/**
9+
* @type {HTMLInputElement | null}
10+
*/
11+
const input = target.querySelector('input[type=text]');
12+
/**
13+
* @type {HTMLButtonElement | null}
14+
*/
15+
const setString = target.querySelector('#setString');
16+
/**
17+
* @type {HTMLButtonElement | null}
18+
*/
19+
const setNull = target.querySelector('#setNull');
20+
/**
21+
* @type {HTMLButtonElement | null}
22+
*/
23+
const setUndefined = target.querySelector('#setUndefined');
24+
25+
ok(input);
26+
ok(setString);
27+
ok(setNull);
28+
ok(setUndefined);
29+
30+
// value should always be blank string when value attribute is set to null or undefined
31+
32+
assert.equal(input.value, '');
33+
setString.click();
34+
flushSync();
35+
assert.equal(input.value, 'foo');
36+
37+
setNull.click();
38+
flushSync();
39+
assert.equal(input.value, '');
40+
41+
setString.click();
42+
flushSync();
43+
assert.equal(input.value, 'foo');
44+
45+
setUndefined.click();
46+
flushSync();
47+
assert.equal(input.value, '');
48+
}
49+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<script>
2+
let value = $state();
3+
</script>
4+
5+
<input type="text" {value} />
6+
7+
<button id="setString" onclick={() => {value = "foo";}}></button>
8+
<button id="setNull" onclick={() => {value = null;}}></button>
9+
<button id="setUndefined" onclick={() => {value = undefined;}}></button>

0 commit comments

Comments
 (0)