React.js:点击按钮即可添加/删除输入字段
React.js: Add/Remove input field on click of a button
React.js:点击按钮即可添加/删除输入字段:
当用户单击"添加"时,我希望添加一个新的输入字段。
通过增加中间的数字,每个输入的名称属性都会发生变化:
document-0-文档document-1-文档
我收到以下错误:
"TypeError:这是未定义的var arr=this.state.docdocuments;"
我知道是什么造成了这个错误,但我没有找到解决办法。
HTML代码。
<fieldset class="fieldset">
<input type="file" name="document-0-document">
<div class="more-documents">
<input type="file" name="document-1-document">
<button data-reactid=".0.1">Add</button>
</div>
</fieldset>
主要部件代码:
class DocumentsFieldSet extends Component{
constructor(props){
super(props);
this.state = {documents:[]}
}
add(i) {
var arr = this.state.documents;
arr.push(i);
this.setState({documents: arr});
}
eachDocument () {
return <DocumentInput key={i}/>
}
render (){
return (
<div>
{this.state.documents.map(this.eachDocument)}
<button onClick={this.add.bind()}>Add</button>
</div>
)
}
}
ReactDOM.render(<DocumentsFieldSet/>, document.querySelector ('.more- documents'))
组件代码
class DocumentInput extends Component {
render() {
return <input type="file" name="document-{i}-document" ref="" />;
}
}
export default DocumentInput;
您在示例中有几个错误
-
您需要为
.add
方法绑定this
-
您没有将放入
this.state.documents
数组索引 -
DocumentInput
内部没有i
变量
class DocumentInput extends React.Component {
render() {
return <input
type="file"
name={ `document-${ this.props.index }-document` }
/>;
}
}
class DocumentsFieldSet extends React.Component{
constructor(props){
super(props);
this.state = {
documents: []
}
this.add = this.add.bind(this);
}
add() {
const documents = this.state.documents.concat(DocumentInput);
this.setState({ documents });
}
render () {
const documents = this.state.documents.map((Element, index) => {
return <Element key={ index } index={ index } />
});
return <div>
<button onClick={ this.add }>Add</button>
<div className="inputs">
{ documents }
</div>
</div>
}
}
ReactDOM.render(
<DocumentsFieldSet />,
document.getElementById('container')
);
.inputs {
margin: 5px 0;
padding: 10px;
border: 2px solid #000;
}
<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="container"></div>
也许您忘记了将上下文传递到bind
函数中。
更换
<button onClick={this.add.bind()}>Add</button>
至
<button onClick={this.add.bind(this)}>Add</button>
将add
函数写成箭头函数。它将为您将函数绑定到this
。在这里阅读更多关于
add = (i) => {
var arr = this.state.documents;
arr.push(i);
this.setState({documents: arr});
};
此外,我会将您的函数重写为:
add = (i) => {
const { documents } = this.state;
documents.push(i);
this.setState({ documents });
};
相关文章:
- 根据Select值添加/删除表行
- 添加/删除类淡入淡出不起作用
- p5.js声音库:如何添加/删除p5.第5页中的短语().零件()
- 在django表单集中添加/删除表单的Javascript
- 添加/删除子元素
- 添加/删除/更改输入文本的部分值
- jQuery - 添加删除类 - 设置输入值
- 向具有唯一Id的表添加/删除行
- DateTimePicker:函数从minDate maxDate添加删除日期
- 由 JavaScript 控制的 CSS3 单向转换在按顺序添加/删除类时不起作用
- 添加/删除类在 Chrome 中对我不起作用
- JQuery 测试元素是可见的还是隐藏的,然后添加删除类
- Jquery切换和添加/删除
- 克隆字段上的“添加-删除”按钮
- (X-Editable)与(Select2标签)不工作,可以't填充当前标签并跟踪添加/删除的标签
- 添加/删除要与Jquery进行比较的产品
- 添加/删除类并使用Cookie记住所选内容
- 如何使用延迟添加/删除类
- 如何根据数组内容添加/删除数组中的元素
- 单击单选按钮,添加/删除表单元素的类