diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/RegularElement.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/RegularElement.js index 5a74f5a115..4e906d8817 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/RegularElement.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/RegularElement.js @@ -212,7 +212,8 @@ export function RegularElement(node, context) { /** If true, needs `__value` for inputs */ const needs_special_value_handling = - name === 'option' || name === 'select' || bindings.has('group') || bindings.has('checked'); + !context.state.analysis.custom_renderer && + (name === 'option' || name === 'select' || bindings.has('group') || bindings.has('checked')); if (has_spread) { build_attribute_effect( diff --git a/packages/svelte/tests/custom-renderers/samples/select-option/_config.js b/packages/svelte/tests/custom-renderers/samples/select-option/_config.js new file mode 100644 index 0000000000..7e6e62edd7 --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples/select-option/_config.js @@ -0,0 +1,29 @@ +import { test } from '../../test'; + +export default test({ + html: '
b
', + test({ assert, target, serialize }) { + const select = target.children.find( + (/** @type {any} */ n) => n.type === 'element' && n.name === 'select' + ); + assert.ok(select); + + // The select element should have a value attribute set via the normal attribute path + assert.equal(select.attributes['value'], 'b'); + + // Each option should have its value as a regular attribute + const options = select.children.filter( + (/** @type {any} */ n) => n.type === 'element' && n.name === 'option' + ); + assert.equal(options.length, 3); + assert.equal(options[0].attributes['value'], 'a'); + assert.equal(options[1].attributes['value'], 'b'); + assert.equal(options[2].attributes['value'], 'c'); + + const html = serialize(target); + assert.equal( + html, + 'b
' + ); + } +}); diff --git a/packages/svelte/tests/custom-renderers/samples/select-option/main.svelte b/packages/svelte/tests/custom-renderers/samples/select-option/main.svelte new file mode 100644 index 0000000000..9b6e7e9e33 --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples/select-option/main.svelte @@ -0,0 +1,10 @@ + + + +{selected}