我正在使用formy-react for form,我想在触发事件时呈现更多选项,代码看起来像这样:
class MultipleChoice extends Component {
constructor(props) {
super(props);
}
render() {
return(
<div>
<Form>
<div id="dynamicInput">
<FormInput />
</div>
</Form>
</div>
);
}
}
我有一个按钮和onClick事件我想触发一个函数,将另一个函数追加到div id“dynamicInput”,是否可能?
是的,我们可以更新我们组件的基础数据(即state
或props
)。 React之所以如此出色的原因之一是它允许我们专注于我们的数据而不是DOM。
让我们假设我们有一个输入列表(存储为state
中的字符串数组)来显示,当点击一个按钮时,我们在这个列表中添加一个新的输入项:
class MultipleChoice extends Component {
constructor(props) {
super(props);
this.state = { inputs: ['input-0'] };
}
render() {
return(
<div>
<Form>
<div id="dynamicInput">
{this.state.inputs.map(input => <FormInput key={input} />)}
</div>
</Form>
<button onClick={ () => this.appendInput() }>
CLICK ME TO ADD AN INPUT
</button>
</div>
);
}
appendInput() {
var newInput = `input-${this.state.inputs.length}`;
this.setState(prevState => ({ inputs: prevState.inputs.concat([newInput]) }));
}
}
显然这个例子不是很有用,但希望它能告诉你如何完成你需要的东西。
我没有使用formy-react但是我解决了同样的问题,发布在这里,以防它有助于某人试图做同样没有形式。
class ListOfQuestions extends Component {
state = {
questions: ['hello']
}
handleText = i => e => {
let questions = [...this.state.questions]
questions[i] = e.target.value
this.setState({
questions
})
}
handleDelete = i => e => {
e.preventDefault()
let questions = [
...this.state.questions.slice(0, i),
...this.state.questions.slice(i + 1)
]
this.setState({
questions
})
}
addQuestion = e => {
e.preventDefault()
let questions = this.state.questions.concat([''])
this.setState({
questions
})
}
render() {
return (
<Fragment>
{this.state.questions.map((question, index) => (
<span key={index}>
<input
type="text"
onChange={this.handleText(index)}
value={question}
/>
<button onClick={this.handleDelete(index)}>X</button>
</span>
))}
<button onClick={this.addQuestion}>Add New Question</button>
</Fragment>
)
}
}
以下是完整的解决方案
var OnlineEstimate = React.createClass({
getInitialState: function() {
return {inputs:[0,1]};
},
handleSubmit: function(e) {
e.preventDefault();
console.log( this.refs );
return false;
},
appendInput: function(e) {
e.preventDefault();
var newInput = this.state.inputs.length;
this.setState({ inputs: this.state.inputs.concat(newInput)},function(){
return;
});
$('.online-est').next('.room-form').remove()
},
render: function() {
var style = {
color: 'green'
};
return(
<div className="room-main">
<div className="online-est">
<h2 className="room-head">Room Details
<button onClick={this.handleSubmit} className="rednew-btn"><i className="fa fa-plus-circle"></i> Save All</button>
<a href="javascript:void(0);" onClick={this.appendInput} className="rednew-btn"><i className="fa fa-plus-circle"></i> Add Room</a>
</h2>
{this.state.inputs.map(function(item){
return (
<div className="room-form" key={item} id={item}>
{item}
<a href="" className="remove"><i className="fa fa-remove"></i></a>
<ul>
<li>
<label>Name <span className="red">*</span></label>
<input type="text" ref={'name'+item} defaultValue={item} />
</li>
</ul>
</div>
)
})}
</div>
</div>
);
}
});