gpt4 book ai didi

reactjs - 清除并重置表单输入字段

转载 作者:行者123 更新时间:2023-12-03 12:56:40 24 4
gpt4 key购买 nike

我有一个包含各种输入字段和两个按钮的表单;一份用于提交,一份用于取消。

<form id="create-course-form">
<input type="text" name="course_Name" ref="fieldName">
<input type="text" name="course_org" ref="fieldOrg">
<input type="text" name="course_Number" ref="fieldNum">

<input type="submit" name="saveCourse" value="Create">
<input type="button" name="cancelCourse" value="cancel" onClick={this.cancelCourse}>
</form>

我想要的是在单击取消按钮时清空所有输入。到目前为止,我已经成功地通过使用每个输入的 ref 属性来做到这一点。

cancelCourse(){
this.refs.fieldName.value="";
this.refs.fieldorg.value="";
this.refs.fieldNum.value="";
}

但是,我想清空输入字段,而不必单独清空每个字段。我想要类似的东西(jQuery): $('#create-course-form input[type=text]').val('');

最佳答案

这里的答案取决于您的输入是受控还是不受控。如果您不确定或需要更多信息,请查看官方文档关于 controlled components 的说明。和 uncontrolled components感谢@Dan-Esparza提供链接。

另外,请注意 using string literals in ref is deprecated 。请改用标准回调方法。

<小时/>

清除具有不受控制字段的表单

您可以清除整个表单,而不是单独清除每个表单字段。

cancelCourse = () => { 
document.getElementById("create-course-form").reset();
}

render() {
return (
<form id="create-course-form">
<input />
<input />
...
<input />
</form>
);
}

如果您的表单没有 id 属性,您也可以使用 ref:

cancelCourse = () => { 
this.myFormRef.reset();
}

render() {
return (
<form ref={(el) => this.myFormRef = el;}>
<input />
<input />
...
<input />
</form>
);
}
<小时/>

清除具有受控字段的表单

如果您使用受控表单字段,则可能必须显式重置表单内的每个组件,具体取决于值在状态中的存储方式。

如果它们是单独声明的,则需要显式重置每一个:

cancelCourse = () => { 
this.setState({
inputVal_1: "",
inputVal_2: "",
...
inputVal_n: "",
});
}

render() {
return (
<input value={this.state.inputVal_1} onChange={this.handleInput1Change}>
<input value={this.state.inputVal_2} onChange={this.handleInput2Change}>
...
<input value={this.state.inputVal_n} onChange={this.handleInputnChange}>
);
}

演示如下:

class MyApp extends React.Component {
constructor() {
super();
this.state = {
inputVal_1: "",
inputVal_2: "",
inputVal_3: "",
inputVal_4: "",
inputVal_5: "",
inputVal_6: "",
inputVal_7: "",
inputVal_8: "",
inputVal_9: "",
inputVal_10: ""
};
}

handleInput1Change = (e) => {
this.setState({inputVal_1: e.target.value});
}

handleInput2Change = (e) => {
this.setState({inputVal_2: e.target.value});
}

handleInput3Change = (e) => {
this.setState({inputVal_3: e.target.value});
}

handleInput4Change = (e) => {
this.setState({inputVal_4: e.target.value});
}

handleInput5Change = (e) => {
this.setState({inputVal_5: e.target.value});
}

handleInput6Change = (e) => {
this.setState({inputVal_6: e.target.value});
}

handleInput7Change = (e) => {
this.setState({inputVal_7: e.target.value});
}

handleInput8Change = (e) => {
this.setState({inputVal_8: e.target.value});
}

handleInput9Change = (e) => {
this.setState({inputVal_9: e.target.value});
}

handleInput10Change = (e) => {
this.setState({inputVal_10: e.target.value});
}

cancelCourse = () => {
this.setState({
inputVal_1: "",
inputVal_2: "",
inputVal_3: "",
inputVal_4: "",
inputVal_5: "",
inputVal_6: "",
inputVal_7: "",
inputVal_8: "",
inputVal_9: "",
inputVal_10: ""
});
}

render() {
return (
<form>
<input value={this.state.inputVal_1} onChange={this.handleInput1Change} />
<input value={this.state.inputVal_2} onChange={this.handleInput2Change} />
<input value={this.state.inputVal_3} onChange={this.handleInput3Change} />
<input value={this.state.inputVal_4} onChange={this.handleInput4Change} />
<input value={this.state.inputVal_5} onChange={this.handleInput5Change} />
<input value={this.state.inputVal_6} onChange={this.handleInput6Change} />
<input value={this.state.inputVal_7} onChange={this.handleInput7Change} />
<input value={this.state.inputVal_8} onChange={this.handleInput8Change} />
<input value={this.state.inputVal_9} onChange={this.handleInput9Change} />
<input value={this.state.inputVal_10} onChange={this.handleInput10Change} />
<input type="submit" name="saveCourse" value="Create" />
<input type="button" name="cancelCourse" value="cancel" onClick={this.cancelCourse} />
</form>
);
}
}

ReactDOM.render(<MyApp />, document.getElementById("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>
<div id="app"></div>

不过,有一种更简洁的方法可以做到这一点。与拥有 n 个状态属性和 n 个事件处理程序(每个输入一个)不同,通过一些巧妙的编码,我们可以大大减少代码。

在构造函数中,我们只声明一个空对象,它将用于保存输入值。我们只使用一个输入处理程序,并向其传递我们想要更改其值的输入元素的索引。这意味着单个输入的值是在我们开始输入时生成的。

要重置表单,我们只需将输入对象再次设置为空即可。

输入值为this.state.inputVal[i]。如果 i 不存在(我们尚未在该输入中键入任何内容),我们希望该值为空字符串(而不是 null)。

cancelCourse = () => { 
this.setState({inputVal: {}});
}

render() {
return (
<form>
{[...Array(n)].map(
(item, i) => <input value={this.state.inputVal[i] || ""} onChange={this.handleInputChange.bind(this, i)} />
)}
</form>
);
}

演示如下:

class MyApp extends React.Component {
constructor() {
super();
this.state = {
inputVal: {}
};
}

handleInputChange = (idx, {target}) => {
this.setState(({inputVal}) => {
inputVal[idx] = target.value;
return inputVal;
});
}

cancelCourse = () => {
this.setState({inputVal: {}});
}

render() {
return(
<form>
{[...Array(10)].map( //create an array with a length of 10
(item, i) => <input value={this.state.inputVal[i] || ""} onChange={this.handleInputChange.bind(this, i)} /> //bind the index to the input handler
)}
<input type="submit" name="saveCourse" value="Create" />
<input type="button" name="cancelCourse" value="cancel" onClick={this.cancelCourse} />
</form>
);
}
}

ReactDOM.render(<MyApp />, document.getElementById("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>
<div id="app"></div>

关于reactjs - 清除并重置表单输入字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43922508/

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