Skip to content

Commit 60a205e

Browse files
fix: don't set selected option(s) if value is unbound or not passed (#8329)
fix: #5644 --------- Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com>
1 parent b56dfe5 commit 60a205e

File tree

7 files changed

+59
-1
lines changed

7 files changed

+59
-1
lines changed

src/compiler/compile/render_dom/wrappers/Element/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -858,8 +858,9 @@ export default class ElementWrapper extends Wrapper {
858858
}
859859

860860
block.chunks.mount.push(b`
861-
(${data}.multiple ? @select_options : @select_option)(${this.var}, ${data}.value);
861+
'value' in ${data} && (${data}.multiple ? @select_options : @select_option)(${this.var}, ${data}.value);
862862
`);
863+
863864
block.chunks.update.push(b`
864865
if (${block.renderer.dirty(Array.from(dependencies))} && 'value' in ${data}) (${data}.multiple ? @select_options : @select_option)(${this.var}, ${data}.value);
865866
`);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export default {
2+
test({ assert, component, target }) {
3+
const options = target.querySelectorAll('option');
4+
5+
assert.equal(options[0].selected, true);
6+
assert.equal(options[1].selected, false);
7+
8+
component.value = ['2'];
9+
assert.equal(options[0].selected, false);
10+
assert.equal(options[1].selected, true);
11+
}
12+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<script>
2+
import Select from './select.svelte';
3+
4+
export let value = ['1'];
5+
export let other = {};
6+
</script>
7+
8+
<Select {value} {other} />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<script>
2+
export let value;
3+
export let other;
4+
</script>
5+
6+
<select multiple bind:value {...other}>
7+
<option value="1">option 1</option>
8+
<option value="2">option 2</option>
9+
</select>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
export default {
2+
test({ assert, component, target }) {
3+
const options = target.querySelectorAll('option');
4+
5+
assert.equal(options[0].selected, true);
6+
assert.equal(options[1].selected, false);
7+
8+
// Shouldn't change the value because the value is not bound.
9+
component.value = ['2'];
10+
assert.equal(options[0].selected, true);
11+
assert.equal(options[1].selected, false);
12+
}
13+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<script>
2+
import Select from './select.svelte';
3+
4+
export let attrs = { value: ['1'] };
5+
</script>
6+
7+
<Select {attrs} />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<script>
2+
export let attrs;
3+
</script>
4+
5+
<select multiple {...attrs}>
6+
<option value="1">option 1</option>
7+
<option value="2">option 2</option>
8+
</select>

0 commit comments

Comments
 (0)