我对ReactJS还是很陌生,我很喜欢它,但是在Angular中似乎有一些绑定之类的事情似乎更容易。
我想要一个表单,用户可以在其中单击按钮以添加额外的输入字段。他们还可以随时“删除”输入字段。
在提交时,我想将这些输入作为数组获取,即传递dynamicInputs到包含的数组的API name。
dynamicInputs
name
这就是我所做的(由于我将React像Angular一样对待,这可能是错误的):
var React = require('react'); module.exports = React.createClass({ addInputField: function(e) { e.preventDefault(); var inputs = this.state.inputs; inputs.push({name: null}); this.setState({inputs : inputs}); }, removeInputField: function(index) { var inputs = this.state.inputs; inputs.splice(index, 1); this.setState({inputs : inputs}); }, handleSubmit: function (e) { e.preventDefault(); // What do I do here? }, getInitialState: function() { return {inputs : []}; }, render: function (){ var inputs = this.state.inputs; return ( // Setting up the form // Blah blah <div className="form-group"> <label className="col-sm-3 control-label">Dynamic Inputs</label> <div className="col-sm-4"> {inputs.map(function (input, index) { var ref = "input_" + index; return ( <div className="input-group"> <input type="text" className="form-control margin-bottom-12px" placeholder="Enter guid" value={input.name} ref={ref} aria-describedby={ref} /> <span className="input-group-addon" onClick={this.removeInputField.bind(this, index)} id={ref} ><i className="fa fa-times"></i></span> </div> ) }.bind(this))} <button className="btn btn-success btn-block" onClick={this.addInputField}>Add Input</button> </div> </div> ); } });
现在removeInputField不起作用!它只是一直删除最后一个条目。
removeInputField
每个人都<div className="input-group">必须有一个唯一的钥匙
<div className="input-group">
<div className="input-group" key={index}>
这就是React区分渲染节点集合的方式。
参考文献:
UPD :
正如@WiredPrairie在下面的评论中提到的那样,建议的解决方案远非理想之选,因为index它不够独特。相反,您需要创建带有一些唯一标识符的另一个数组(单调增长的序列就足够了),并使其与之并行this.state.inputs并使用其值作为键。
index
this.state.inputs
因此,在添加元素时,您将:
this.keys.push(++this.counter);
在移除上-用相同的方法从两者移除index。而在.map你
.map
<div className="input-group" key={this.keys[index]}>