gpt4 book ai didi

javascript - react : Number input with no negative, 十进制,或零值

转载 作者:太空狗 更新时间:2023-10-29 15:12:46 24 4
gpt4 key购买 nike

考虑一个number类型的输入,我希望这个数字输入只允许用户输入一个正数非零 , 整数(无小数)数字。使用 minstep 的简单实现如下所示:

class PositiveIntegerInput extends React.Component {
render () {
return <input type='number' min='1' step='1'></input>
}
}

ReactDOM.render(
<PositiveIntegerInput />,
document.getElementById('container')
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<p>
Try to input a decimal or negative number or zero:
</p>
<div id="container"></div>

如果用户坚持只点击数字输入中的向上/向下箭头,上面的代码可以正常工作,但是一旦用户开始使用键盘,他们输入像 -42 3.140

好的,让我们尝试添加一些 onKeyDown 处理来阻止这个漏洞:

class PositiveIntegerInput extends React.Component {
constructor (props) {
super(props)
this.handleKeypress = this.handleKeypress.bind(this)
}

handleKeypress (e) {
const characterCode = e.key
if (characterCode === 'Backspace') return

const characterNumber = Number(characterCode)
if (characterNumber >= 0 && characterNumber <= 9) {
if (e.currentTarget.value && e.currentTarget.value.length) {
return
} else if (characterNumber === 0) {
e.preventDefault()
}
} else {
e.preventDefault()
}
}

render () {
return (
<input type='number' onKeyDown={this.handleKeypress} min='1' step='1'></input>
)
}
}

ReactDOM.render(
<PositiveIntegerInput />,
document.getElementById('container')
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<p>
Try to input a decimal or negative number or zero:
</p>
<div id="container"></div>

现在一切似乎都按预期工作了。但是,如果用户突出显示文本输入中的所有数字,然后使用 0 覆盖此选择,则输入将允许将 0 作为值输入。

为了解决这个问题,我添加了一个 onBlur 函数来检查输入值是否为 0,如果是,则将其更改为 1:

class PositiveIntegerInput extends React.Component {
constructor (props) {
super(props)
this.handleKeypress = this.handleKeypress.bind(this)
this.handleBlur = this.handleBlur.bind(this)
}

handleBlur (e) {
if (e.currentTarget.value === '0') e.currentTarget.value = '1'
}

handleKeypress (e) {
const characterCode = e.key
if (characterCode === 'Backspace') return

const characterNumber = Number(characterCode)
if (characterNumber >= 0 && characterNumber <= 9) {
if (e.currentTarget.value && e.currentTarget.value.length) {
return
} else if (characterNumber === 0) {
e.preventDefault()
}
} else {
e.preventDefault()
}
}

render () {
return (
<input
type='number'
onKeyDown={this.handleKeypress}
onBlur={this.handleBlur}
min='1'
step='1'
></input>
)
}
}

ReactDOM.render(
<PositiveIntegerInput />,
document.getElementById('container')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<p>
Try to input a decimal or negative number or zero:
</p>
<div id="container"></div>

有没有更好的方法来使用这种类型的标准来实现数字输入? 将所有这些开销写成只允许正数的输入似乎很疯狂,非零整数...必须有更好的方法。

最佳答案

如果您将它作为组件状态中的值的受控输入来执行,则可以在它不符合您的条件时阻止更新状态 onChange。例如

class PositiveInput extends React.Component {
state = {
value: ''
}

onChange = e => {
//replace non-digits with blank
const value = e.target.value.replace(/[^\d]/,'');

if(parseInt(value) !== 0) {
this.setState({ value });
}
}

render() {
return (
<input
type="text"
value={this.state.value}
onChange={this.onChange}
/>
);
}
}

关于javascript - react : Number input with no negative, 十进制,或零值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48711743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com