入力からマイナスとプラスを除外しようとしていますが、間違っています:
handleChange(event) {
const value = event.target.value.replace(/\+|-/ig, '');
this.setState({financialGoal: value});
}
入力コードのレンダリング:
<input style={{width: '150px'}} type="number" value={this.state.financialGoal} onChange={this.handleChange}/>
私はあなたのコードを模倣しようとしましたが、Reactに<input type='number' />
の問題があることに気付きました。回避策については、この例をチェックして、自分で試してください: https://codepen.io/zvona/pen/WjpKJX?editors=001
数字のみのパターンで通常の入力(type = 'text')として定義する必要があります:
<input type="text" pattern="[0-9]*" onInput={this.handleChange.bind(this)} value={this.state.financialGoal} />
そして、入力の有効性を比較するには:
const financialGoal = (evt.target.validity.valid) ? evt.target.value : this.state.financialGoal;
このアプローチの最大の注意点は、モバイルの場合です->キーボードは数字ではなく、通常のアルファベット形式です。
入力を停止するには、onKeyPress
ではなくonChange
を使用します。
onKeyPress
内でevent.preventDefault()
を使用することは、押すイベントを停止することを意味します。
keyPress
ハンドラーはonChange
の前にトリガーされるため、入力の現在の値(event.keyCode
)ではなく、押されたキー(event.target.value
)を確認する必要があります。
onKeyPress(event) {
const keyCode = event.keyCode || event.which;
const keyValue = String.fromCharCode(keyCode);
if (/\+|-/.test(keyValue))
event.preventDefault();
}
const {Component} = React;
class Input extends Component {
onKeyPress(event) {
const keyCode = event.keyCode || event.which;
const keyValue = String.fromCharCode(keyCode);
if (/\+|-/.test(keyValue))
event.preventDefault();
}
render() {
return (
<input style={{width: '150px'}} type="number" onKeyPress={this.onKeyPress.bind(this)} />
)
}
}
ReactDOM.render(<Input /> , document.querySelector('#app'));
<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>
<section id="app"></section>
1行のコード
<input value={this.state.financialGoal} onChange={event => this.setState({financialGoal: event.target.value.replace(/\D/,'')})}/>
入力を維持する場合はtype='number'
(おそらくモバイルデバイスが数値キーボードをトリガーするために)onInput
の代わりにonChange
を使用してイベントの変更をキャプチャする必要があります。
onInput
を使用すると、数値入力にテキストを入力すると、onChange
で割り当てた検証がバイパスされるというバグが修正されました。この関数をonInput
で呼び出されるように修正すると、すべてのインスタンスでトリガーされます。
ここに私がやっていることの例があります:
<input
type='number'
id={`player${index}Score`}
className='form-control'
pattern='[0-9]{0,5}'
onInput={(event) => this.enterScore(event, index)}
value={this.props.scoreLabel(this.state.scores[index])}
/>
これがお役に立てば幸いです!
より良い解決策を思いつきました。 type = 'tel'を入力コンポーネント自体内でパターン正規表現と共に使用します。
私がこれをどのように配線したかのナットとボルトはここにあります:
class Input extends React.Component {
state = {message: '3'};
updateNumber = (e) => {
const val = e.target.value;
// If the current value passes the validity test then apply that to state
if (e.target.validity.valid) this.setState({message: e.target.value});
// If the current val is just the negation sign, or it's been provided an empty string,
// then apply that value to state - we still have to validate this input before processing
// it to some other component or data structure, but it frees up our input the way a user
// would expect to interact with this component
else if (val === '' || val === '-') this.setState({message: val});
}
render() {
return (
<input
type='tel'
value={this.state.message}
onChange={this.updateNumber}
pattern="^-?[0-9]\d*\.?\d*$"
/>
);
}
}
ReactDOM.render(<Input />, document.getElementById('main'));
Codepen here に取り組んでいるこの例があります
今日、私はparseInt()
を使用することも適切かつクリーンな方法であると感じています。 onChange(e)
の例を以下に示します。
onChange(e){
this.setState({[e.target.id]: parseInt(e.target.value) ? parseInt(e.target.value) : ''})
}
parseInt()
はNaN
を返します。parseInt('12a')
は12を返します。以下のようなonChange()
メソッドで入力を定義します(私の場合、childStateにはこの子コンポーネントに渡される状態が含まれます)。
<input
...
value={this.props.childState.volume}
...
onChange={(e) => handleChangeInteger(e, {volume: e.target.value})}
/>
私が使用したアプローチの1つは、 validatorJS (npm install validator --save
)をインストールすることでした
次に、関数handleChangeInteger
を定義しました。この関数は、状態を変更するために使用されるオブジェクト、この場合は{volume: e.target.value}
を受け取ります。注:入力を空白にするためにOR条件が必要でした。そうしないと、ユーザーがフィールドを空白にする場合に最後の整数をバックスペース(削除)できません。
const handleChangeInteger = (e, obj_to_return) => {
if (validator.isInt(e.target.value) || e.target.value == '') {
this.props.childSetState(obj_to_return)
}
}
これで、ユーザーは、入力フィールドにバックスペース、0-9、またはe(これは数字です)以外を入力することはできなくなります。
ソリューションを作成するためにこの投稿を参照しました: https://stackoverflow.com/a/45676912/6169225
私が見つけた最も効果的でシンプルなソリューション:
<input
type="number"
name="phone"
placeholder="Phone number"
onKeyDown={e => /[\+\-\.\,]$/.test(e.key) && e.preventDefault()}
/>
2019年の回答は遅れていますが、誰かの助けになることを願っています
これにより、空のテキストフィールドでnullが取得されなくなります
// This will make sure that value never is null when textfield is empty
const minimum = 0;
export default (props) => {
const [count, changeCount] = useState(minimum);
function validate(count) {
return parseInt(count) | minimum
}
function handleChangeCount(count) {
changeCount(validate(count))
}
return (
<Form>
<FormGroup>
<TextInput
type="text"
value={validate(count)}
onChange={handleChangeCount}
/>
</FormGroup>
<ActionGroup>
<Button type="submit">submit form</Button>
</ActionGroup>
</Form>
);
};