![](/img/trans.png)
[英]How can I make a text box in React which allows only numbers or an empty value, which triggers the number keypad on mobile?
[英]Why can't I save a number with decimal values in my input box? It only allows integers to be updated?
我的表單上有一個文本輸入框,當表單最初顯示時,它會顯示帶有小數點的價格,如910.01
。
const initialState: OrderWindowState = {
price1: 910.01,
price2: 911.33,
}
const [state, setState] = useState<OrderWindowState>(initialState);
<input type="text" name="price1" value={state.price1} onChange={price1OnChange} />
const price1OnChange = (event: React.ChangeEvent<HTMLInputElement>) => {
event.preventDefault();
console.log("price1OnChange called:" + event.target.value);
setState({
...state,
price1: +event.target.value
})
};
當我開始更新數字時,如果我輸入小數點.
我可以在我的console.log
消息中看到它,但是存儲在我的 state 中並且在我的文本輸入中可見的數字只顯示 integer 值(沒有十進制值)。
為什么要這樣做?
當您執行+event.target.value
時,字符串值將轉換為數字 - 並且數字沒有尾隨.
s。 因此,當組件重新渲染時,之前鍵入的.
不會反映在 state 中,因此也不會在受控組件的值中看到。
一種方法是將字符串輸入保留在 state 中,並僅在以后需要時將其轉換為數字。 例如:
const App = () => { const [price1, setPrice1] = React.useState(910.01); const price1OnChange = (event) => { setPrice1(event.target.value); }; const price1Number = Number(price1); return ( <div> <input type="text" name="price1" value={price1} onChange={price1OnChange} /> <div> Number value: {Number.isNaN(price1Number)? 'Not a number - correct your input': price1Number} </div> </div> ); }; ReactDOM.createRoot(document.querySelector('.react')).render(<App />);
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script> <div class='react'></div>
以上是在 JS 中,以便可以輕松運行代碼段,但同樣的方法適用於 TypeScript - 將OrderWindowState
更改為接受字符串而不是數字,並將 price1 price1: +event.target.value
更改為 price1 price1: event.target.value
。
因為 price1 和 price2 的值是分開的,所以您可以考慮為它們使用不同的狀態(就像我在上面所做的那樣,並且按照 React 的建議)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.