Skip to content

Commit 42a6c35

Browse files
authored
Merge pull request #7182 from JerryWu1234/v2v2v2
fix: input's value is string when passing number
2 parents cae8268 + 96c0105 commit 42a6c35

File tree

6 files changed

+106
-14
lines changed

6 files changed

+106
-14
lines changed

.changeset/neat-maps-tickle.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@qwik.dev/core': patch
3+
---
4+
5+
fix: input's value is string when passing number

packages/docs/src/routes/docs/(qwik)/components/rendering/index.mdx

+6
Original file line numberDiff line numberDiff line change
@@ -180,11 +180,17 @@ The `bind:` is compiled away by the Qwik optimizer to a property set and an even
180180
import { component$, useSignal } from '@qwik.dev/core';
181181

182182
export default component$(() => {
183+
const count = useSignal(0);
183184
const firstName = useSignal('');
184185
const acceptConditions = useSignal(false);
185186

186187
return (
187188
<form>
189+
{/* For number inputs, use `valueAsNumber` instead of `value` to get the numeric value directly */}
190+
<input type="number"
191+
value={count.value}
192+
onInput$={(_, el) => count.value = el.valueAsNumber }
193+
/>
188194
<input type="text"
189195
value={firstName.value}
190196
onInput$={(_, el) => firstName.value = el.value }

packages/qwik/src/core/shared/jsx/types/jsx-generated.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -596,7 +596,7 @@ type SpecialAttrs = {
596596
* For type: HTMLInputTypeAttribute, excluding 'button' | 'reset' | 'submit' | 'checkbox' |
597597
* 'radio'
598598
*/
599-
'bind:value'?: Signal<string | undefined>;
599+
'bind:value'?: Signal<string | undefined | number>;
600600
enterKeyHint?: 'enter' | 'done' | 'go' | 'next' | 'previous' | 'search' | 'send' | undefined;
601601
height?: Size | undefined;
602602
max?: number | string | undefined;

packages/qwik/src/core/tests/use-signal.spec.tsx

+39
Original file line numberDiff line numberDiff line change
@@ -651,5 +651,44 @@ describe.each([
651651
</Component>
652652
);
653653
});
654+
655+
// help me to get a description
656+
it('should update the sum when input values change', async () => {
657+
const AppTest = component$(() => {
658+
const a = useSignal(1);
659+
const b = useSignal(2);
660+
return (
661+
<div>
662+
{a.value} + {b.value} = {a.value + b.value}
663+
<input type="number" id="input1" bind:value={a} />
664+
<input type="number" id="input2" bind:value={b} />
665+
</div>
666+
);
667+
});
668+
669+
const { document } = await render(<AppTest />, { debug: debug });
670+
671+
await expect(document.querySelector('div')).toMatchDOM(
672+
<div>
673+
1 + 2 = 3
674+
<input type="number" id="input1" value="1" />
675+
<input type="number" id="input2" value="2" />
676+
</div>
677+
);
678+
679+
const input1 = document.querySelector('#input1')! as HTMLInputElement;
680+
681+
input1.value = '10';
682+
input1.valueAsNumber = 10;
683+
684+
await trigger(document.body, input1, 'input');
685+
await expect(document.querySelector('div')).toMatchDOM(
686+
<div>
687+
10 + 2 = 12
688+
<input type="number" id="input1" value="10" />
689+
<input type="number" id="input2" value="2" />
690+
</div>
691+
);
692+
});
654693
});
655694
});

packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_input_bind.snap

+3-3
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export const Greeter = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl(()=>{
4242
"value": value,
4343
"onInput$": /*#__PURE__*/ inlinedQrl((_, elm)=>{
4444
const [value] = useLexicalScope();
45-
return value.value = elm.value;
45+
return value.value = elm.type == "number" ? elm.valueAsNumber : elm.value;
4646
}, "s_6IZeYpXCNXA", [
4747
value
4848
])
@@ -51,7 +51,7 @@ export const Greeter = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl(()=>{
5151
"checked": checked,
5252
"onInput$": /*#__PURE__*/ inlinedQrl((_, elm)=>{
5353
const [checked] = useLexicalScope();
54-
return checked.value = elm.checked;
54+
return checked.value = elm.type == "number" ? elm.valueAsNumber : elm.checked;
5555
}, "s_JPI3bLCVnso", [
5656
checked
5757
])
@@ -60,7 +60,7 @@ export const Greeter = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl(()=>{
6060
"stuff": stuff,
6161
"onChange$": /*#__PURE__*/ inlinedQrl((_, elm)=>{
6262
const [stuff] = useLexicalScope();
63-
return stuff.value = elm.stuff;
63+
return stuff.value = elm.type == "number" ? elm.valueAsNumber : elm.stuff;
6464
}, "s_eyREJ0lZTFw", [
6565
stuff
6666
])

packages/qwik/src/optimizer/core/src/transform.rs

+52-10
Original file line numberDiff line numberDiff line change
@@ -1311,17 +1311,59 @@ impl<'a> QwikTransform<'a> {
13111311
),
13121312
),
13131313
op: ast::AssignOp::Assign,
1314-
right: Box::new(ast::Expr::Member(
1315-
ast::MemberExpr {
1316-
obj: Box::new(ast::Expr::Ident(elm)),
1317-
prop: ast::MemberProp::Ident(
1318-
ast::IdentName::new(
1319-
prop_name, DUMMY_SP,
1320-
),
1321-
),
1314+
right: Box::new(ast::Expr::Cond(ast::CondExpr {
1315+
test: Box::new(ast::Expr::Bin(ast::BinExpr {
1316+
left: Box::new(ast::Expr::Member(
1317+
ast::MemberExpr {
1318+
obj: Box::new(ast::Expr::Ident(
1319+
elm.clone(),
1320+
)),
1321+
prop: ast::MemberProp::Ident(
1322+
ast::IdentName::new(
1323+
"type".into(),
1324+
DUMMY_SP,
1325+
),
1326+
),
1327+
span: DUMMY_SP,
1328+
},
1329+
)),
13221330
span: DUMMY_SP,
1323-
},
1324-
)),
1331+
op: ast::BinaryOp::EqEq,
1332+
right: Box::new(ast::Expr::Lit(
1333+
ast::Lit::Str(ast::Str {
1334+
value: "number".into(),
1335+
span: DUMMY_SP,
1336+
raw: None,
1337+
}),
1338+
)),
1339+
})),
1340+
cons: Box::new(ast::Expr::Member(
1341+
ast::MemberExpr {
1342+
obj: Box::new(ast::Expr::Ident(
1343+
elm.clone(),
1344+
)),
1345+
prop: ast::MemberProp::Ident(
1346+
ast::IdentName::new(
1347+
"valueAsNumber".into(),
1348+
DUMMY_SP,
1349+
),
1350+
),
1351+
span: DUMMY_SP,
1352+
},
1353+
)),
1354+
alt: Box::new(ast::Expr::Member(
1355+
ast::MemberExpr {
1356+
obj: Box::new(ast::Expr::Ident(elm)),
1357+
prop: ast::MemberProp::Ident(
1358+
ast::IdentName::new(
1359+
prop_name, DUMMY_SP,
1360+
),
1361+
),
1362+
span: DUMMY_SP,
1363+
},
1364+
)),
1365+
span: DUMMY_SP,
1366+
})),
13251367
span: DUMMY_SP,
13261368
}),
13271369
))),

0 commit comments

Comments
 (0)