我正在使用React进行手机号码验证。 TextField应仅允许数字,并将格式化为美国移动数字格式。我限制只允许数字,但格式没有发生。我正在使用material-ui进行验证。在我的代码下面。
import React from 'react';
import TextField from '@material-ui/core/TextField';
export default class myClass extends React.Component {
constructor(props) {
super(props);
this.state = {
value: '',
};
this.handleChange = this.handleChange.bind(this);
}
handleChange(e) {
const re = /[0-9]+/g;
if (e.target.value === '' || re.test(e.target.value)) {
this.setState({ value: e.target.value });
}
}
render() {
return (
<div>
<TextField
floatingLabelText="mobileNumber"
onChange={this.handleChange}
value={this.state.value}
/>
</div>
);
}
}
答案 0 :(得分:4)
我已将文本框限制为仅允许数字,并将手机号码格式化为美国手机号码格式。请遵循以下代码。
handleChange(e) {
const onlyNums = e.target.value.replace(/[^0-9]/g, '');
if (onlyNums.length < 10) {
this.setState({ value: onlyNums });
} else if (onlyNums.length === 10) {
const number = onlyNums.replace(
/(\d{3})(\d{3})(\d{4})/,
'($1) $2-$3'
);
this.setState({ value: number });
}
}
答案 1 :(得分:2)
import Input from '@material-ui/core/Input';
改为使用<Input type="number" />
。
答案 2 :(得分:0)
在您的文本字段上设置类:
<TextField type="number"
inputProps={{className:'digitsOnly'}}
floatingLabelText="mobileNumber"
value={this.state.value}
onChange={this.handleChange}
id={"mobileNumber"} name={"mobileNumber"}
/>
您可以在文本字段上应用仅启用数字的类,如下所示:
$(".digitsOnly").on('keypress',function (event) {
var keynum
if(window.event) {// IE8 and earlier
keynum = event.keyCode;
} else if(event.which) { // IE9/Firefox/Chrome/Opera/Safari
keynum = event.which;
} else {
keynum = 0;
}
if(keynum === 8 || keynum === 0 || keynum === 9) {
return;
}
if(keynum < 46 || keynum > 57 || keynum === 47) {
event.preventDefault();
} // prevent all special characters except decimal point
}
限制在文本字段上的拖放:
$(".digitsOnly").on('paste drop',function (event) {
let temp=''
if(event.type==='drop') {
temp =$("#mobileNumber").val()+event.originalEvent.dataTransfer.getData('text');
var regex = new RegExp(/(^100(\.0{1,2})?$)|(^([1-9]([0-9])?|0)(\.[0-9]{1,2})?$)/g); //Allows only digits to be drag and dropped
if (!regex.test(temp)) {
event.preventDefault();
return false;
}
} else if(event.type==='paste') {
temp=$("#mobileNumber").val()+event.originalEvent.clipboardData.getData('Text')
var regex = new RegExp(/(^100(\.0{1,2})?$)|(^([1-9]([0-9])?|0)(\.[0-9]{1,2})?$)/g); //Allows only digits to be pasted
if (!regex.test(temp)) {
event.preventDefault();
return false;
}
}
}
在页面加载后立即在componentDidMount()中调用这些事件以应用该类。
答案 3 :(得分:0)
如果您使用像 react-hook-form 这样的表单验证库,您可以验证 你这样的文本框,
<TextField
name="index"
InputProps={{ inputMode: 'numeric', pattern: '[0-9]*' }}
inputRef={register({
required: {
value: true,
message: 'Please fill this field',
},
pattern: {
value: /^[1-9]\d*(\d+)?$/i,
message: 'Please enter an integer',
},
min: {
value: 1,
message: 'Value should be atleast 1',
},
})}
error={errors?.index ? true : false}
helperText={errors?.index?.message}
/>