在 React 中将商品添加到购物车时无法输入输入字段
Unable to type in an input field when adding item to cart in React
我在这里尝试应用的逻辑可能是完全错误的。这是我第一次
尝试做这样的事情(尝试使用输入字段来获取要添加到购物车的商品数量的值)。我无法在输入字段中输入内容。
const [qty, setQty] = useState(1)
const submitHandler = (e) => {
e.preventDefault()
if(e.target.value <=product.countInStock && e.target.value > 0){
setQty(e.target.value)
history.push(`/cart/${match.params.id}?qty=${qty}`)
}else{
alert("Insifficient Quantity in Stock")
}
}
========================================
<Row>
<Col sm={4}>Qty</Col>
<Col sm={8}>
<Form onSubmit={submitHandler}>
<Form.Control
type="number"
min="0"
max={product.countInStock}
value={qty}
onchange={checkInput}
/>
<Button
onClick={addToCartHandler}
size="lg"
disabled={product.countInStock === 0}
type='button'>
Add to Cart
</Button>
</Form>
</Col>
</Row>
我该如何解决?好像是一个很热门的问题,有人在网上提问,但我的还是找不到解决方案
您的事件处理程序似乎有问题。由于您将 value={qty}
传递给输入字段,因此您创建了一个 controlled component。但是,在更新输入时,您不会更新父级的状态,因此最终输入的值不会改变。
在你的输入上尝试这样的事情:
<Form.Control
type="number"
min={0}
max={product.countInStock}
value={qty}
onchange={(e) => setQty(e)}/>
(我假设 onChange returns 新值是数字。如果不是,则需要相应地转换返回的数据,然后再在提交事件处理程序中检查它.)
同时将 submitHandler
更新为:
const submitHandler = (e) => {
e.preventDefault()
if (qty <= product.countInStock && qty > 0) {
history.push(`/cart/${match.params.id}?qty=${qty}`)
} else {
alert('Insufficient Quantity in Stock')
}
}
Daniel 的回答是正确的,受控输入字段不会更改其值,除非您更改控制它的状态变量。因此,您真正需要的是将 setQty(e.target.value)
放入 checkInput
函数中。这应该可以解决问题。
您还可以使用 useRef 来控制表单。这样就不需要每次输入字段发生变化时都重新渲染元素。如果您有兴趣了解您的情况,请告诉我。
我在这里尝试应用的逻辑可能是完全错误的。这是我第一次 尝试做这样的事情(尝试使用输入字段来获取要添加到购物车的商品数量的值)。我无法在输入字段中输入内容。
const [qty, setQty] = useState(1)
const submitHandler = (e) => {
e.preventDefault()
if(e.target.value <=product.countInStock && e.target.value > 0){
setQty(e.target.value)
history.push(`/cart/${match.params.id}?qty=${qty}`)
}else{
alert("Insifficient Quantity in Stock")
}
}
========================================
<Row>
<Col sm={4}>Qty</Col>
<Col sm={8}>
<Form onSubmit={submitHandler}>
<Form.Control
type="number"
min="0"
max={product.countInStock}
value={qty}
onchange={checkInput}
/>
<Button
onClick={addToCartHandler}
size="lg"
disabled={product.countInStock === 0}
type='button'>
Add to Cart
</Button>
</Form>
</Col>
</Row>
我该如何解决?好像是一个很热门的问题,有人在网上提问,但我的还是找不到解决方案
您的事件处理程序似乎有问题。由于您将 value={qty}
传递给输入字段,因此您创建了一个 controlled component。但是,在更新输入时,您不会更新父级的状态,因此最终输入的值不会改变。
在你的输入上尝试这样的事情:
<Form.Control
type="number"
min={0}
max={product.countInStock}
value={qty}
onchange={(e) => setQty(e)}/>
(我假设 onChange returns 新值是数字。如果不是,则需要相应地转换返回的数据,然后再在提交事件处理程序中检查它.)
同时将 submitHandler
更新为:
const submitHandler = (e) => {
e.preventDefault()
if (qty <= product.countInStock && qty > 0) {
history.push(`/cart/${match.params.id}?qty=${qty}`)
} else {
alert('Insufficient Quantity in Stock')
}
}
Daniel 的回答是正确的,受控输入字段不会更改其值,除非您更改控制它的状态变量。因此,您真正需要的是将 setQty(e.target.value)
放入 checkInput
函数中。这应该可以解决问题。
您还可以使用 useRef 来控制表单。这样就不需要每次输入字段发生变化时都重新渲染元素。如果您有兴趣了解您的情况,请告诉我。