我正在研究'React.js'项目。 我想创建3个文本字段,其中, 第一个文本字段 - 我想只插入十六进制值。 它应该接受0-9&的数字。来自A-F& S的信件结肠。 它应该只接受23个字符(数字,来自A-F和结肠的字母)。
第二个文本字段 - 它应该只有十六进制值。
第3个文本字段 - 它应仅接受字母数字值(仅限数字&
字母)。
第四个文字字段 - 仅限字母。
注意:不应接受特殊字符。
请帮我解决这个问题。
示例代码:
constructor(props) {
super(props);this.state = {showModal: true};
this.modalFooter = this.modalFooter.bind(this);
this.modalBody = this.modalBody.bind(this); this.updateState = this.updateState.bind(this);
};
modalFooter() {
return (
<div>
<BButton name="Cancel" onClickHandler={() => { this.setState({ showModal: false }) }} />
</div>);
}
modalBody() {
return (
<div>
<br className="Class">
<br> Hex Value: <input type="text" className="Class" formnovalidate="return isNumber(event)"
maxLength="23" placeholder="" /></br>
<br> Addr: <input type="text" className="Class" maxLength="6" name=""
placeholder="" /></br><br> Name: <input type="text" className="Class" id="Number"
maxLength="64"
name="" placeholder="" /></br>
</br>
</div>
);
}
updateState(e) {
this.setState({data: e.target.value});
}
render() {
let body = this.modalBody();
let footer = this.modalFooter();
let modal = <BModal header="Add Message"
body={body}
footer={footer} />
return (
<div className="page-title">
<center>
<h3> Sample Program </h3>
</center>
<hr className="horizontal-line"></hr>
<div> <font color="grey"><input type="text" value={this.state.data}
onClick={() => { this.setState({ showModal: true }) }} /></font>
{this.state.showModal ? modal : ""}
</div>
</div>);
}
答案 0 :(得分:10)
我建议您使用React onKeyPress
事件进行regexp验证(请参阅下面的示例和jsbin链接)
var Form = React.createClass({
firstMethod(e) {
const re = /[0-9A-F:]+/g;
if (!re.test(e.key)) {
e.preventDefault();
}
},
secondMethod(e) {
const re = /[0-9A-F]+/g;
if (!re.test(e.key)) {
e.preventDefault();
}
},
thirdMethod(e) {
const re = /[0-9a-fA-F]+/g;
if (!re.test(e.key)) {
e.preventDefault();
}
},
fourthMethod(e) {
const re = /[a-fA-F]+/g;
if (!re.test(e.key)) {
e.preventDefault();
}
},
render() {
return (
<form>
<input ref="first" onKeyPress={(e) => this.firstMethod(e)} />
<input ref="second" onKeyPress={(e) => this.secondMethod(e)} />
<input ref="third" onKeyPress={(e) => this.thirdMethod(e)} />
<input ref="fourth" onKeyPress={(e) => this.fourthMethod(e)} />
</form>
);
}
});
ReactDOM.render(
<Form />,
document.getElementById('example')
);
答案 1 :(得分:3)
实际上,它并不复杂。您只需要从文本输入中提取允许的字符,限制其长度,... 说实话,这与React无关 - 它是纯粹的Javascript。
让我们从简单的函数开始,它通过模式
从字符串中提取子字符串const extract = (str, pattern) => (str.match(pattern) || []).pop() || '';
// Usage
extract("01az", "[0-9a-fA-F]+") // "01a"
然后,将此函数包装成解决1,2,3和4
模式问题的函数const extractHexadecimalWithColon = (str) => extract(str, "[0-9a-fA-F:]+");
const extractHexadecimal = (str) => extract(str, "[0-9a-fA-F]+");
const extractAlphanum = (str) => extract(str, "[0-9a-zA-Z]+");
const extractAlpha = (str) => extract(str, "[a-zA-Z]+");
限制字符串长度非常容易
const limitLength = (str, length) => str.substring(0, length);
然后,根据需要创建文本输入组件,监听更改并更新状态。
var App = React.createClass({
getInitialState() {
return {};
},
setA(e) {
this.setState({
a: limitLength(extractHexadecimalWithColon(e.target.value), 23),
});
},
setB(e) {
this.setState({
b: extractHexadecimal(e.target.value),
});
},
setC(e) {
this.setState({
c: extractAlphanum(e.target.value),
});
},
setD(e) {
this.setState({
d: extractAlpha(e.target.value),
});
},
render() {
return (
<div>
<div>
Hexadecimal, max 23 chars, colon allowed<br/>
<textarea value={this.state.a} onChange={this.setA} />
</div>
<div>
Hexadecimal only, no length restriction<br/>
<textarea value={this.state.b} onChange={this.setB} />
</div>
<div>
Alphanumeric<br/>
<textarea value={this.state.c} onChange={this.setC} />
</div>
<div>
Letters only<br/>
<textarea value={this.state.d} onChange={this.setD} />
</div>
</div>
)
}
});
这里有充分的工作小提琴https://jsfiddle.net/69z2wepo/36536/
原始解决方案分为单独的组件https://jsfiddle.net/69z2wepo/36654/