我参考了官方文档
https://chakra-ui.com/docs/components/number-input
示例用户可以单击 inc 和 dec 图标来更改值,也可以直接在文本框中输入。
import {
ChakraProvider,
Stack,
HStack,
Button,
Input,
useNumberInput
} from "@chakra-ui/react";
const { getInputProps, getIncrementButtonProps, getDecrementButtonProps } =
useNumberInput({
step: 0.01,
defaultValue: 0.5,
min: 0.01,
max: 1.0,
precision: 2,
})
const inc = getIncrementButtonProps()
const dec = getDecrementButtonProps()
const input = getInputProps()
return (
<Stack>
<HStack maxW='320px'>
<Button {...inc}>+</Button>
<Input {...input} />
<Button {...dec}>-</Button>
</HStack>
</Stack>
);
然后我想用其他按钮改变值,所以我尝试使用setState
,经过一番尝试发现不能使用defaultValue
in useNumberInput
,所以我使用value
和onChange
。
const [limiInputValue, setLimitInputValue] = useState(0.5);
const { getInputProps, getIncrementButtonProps, getDecrementButtonProps } =
useNumberInput({
step: 0.01,
// defaultValue: limiInputValue,
min: 0.01,
max: 1.0,
precision: 2,
value: limiInputValue,
onChange: value => {
console.log('onChange value', value);
setLimitInputValue(Number(value));
},
})
const inc = getIncrementButtonProps()
const dec = getDecrementButtonProps()
const input = getInputProps()
return (
<Stack>
<HStack maxW='320px'>
<Button {...inc}>+</Button>
<Input {...input} />
<Button {...dec}>-</Button>
</HStack>
<Button onClick={() => setLimitInputValue(0.25)}>Set</Button>
</Stack>
);
一切都很好,但我有一个问题是用户无法Input
直接输入小数点。
如何修复它?
这是我的沙箱示例:
https://codesandbox.io/p/devbox/twk7v6?file=%2Fsrc%2Findex.tsx%3A19%2C18
您遇到的问题是,在您的
onChange
函数中,您立即使用 将该值转换为数字Number(value)
。这可能会在输入十进制数字时产生问题,因为一旦输入小数点(没有后面的数字),如果输入不是有效数字,Number(value)
就会返回0
,这实际上会从输入中删除小数点。要解决此问题,请允许用户输入小数,但不立即将输入值转换为
onChange
处理程序内的数字。仅limiInputValue
当新值是指定范围内的有效数字时才更新状态。请按照以下代码操作:-