I am using formsy-react for the form, I want to render more options when an event is fired, code looks something like this:
class MultipleChoice extends Component {
constructor(props) {
super(props);
}
render() {
return(
<div>
<Form>
<div id="dynamicInput">
<FormInput />
</div>
</Form>
</div>
);
}
}
I have a button and onClick event I want to fire a function that appends another into div id "dynamicInput", is it possible?
If you want to dynamically add elements, you should have a container where to place them. For instance, a <div id="container"> . Create new elements by means of document. createElement() , and use appendChild() to append each of them to the container.
To make the form dynamic I'll create a React state, and this state will have an object that contains age and salary properties in it. Let's do it. const [inputFields, setInputFields] = useState([ \ {name: '', salary: ''} \ ]) . Here, the inputFields is a React state.
Yes, we can update our component's underlying data (ie state
or props
). One of the reasons React is so great is that it allows us to focus on our data instead of the DOM.
Let's pretend we have a list of inputs (stored as an array of strings in state
) to display, and when a button is clicked we add a new input item to this list:
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]) }));
}
}
Obviously this example isn't very useful, but hopefully it will show you how to accomplish what you need.
I didn't use formsy-react but I solved the same problem, posting here in case it helps someone trying to do the same without formsy.
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>
)
}
}
Below is the complete solution for this
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>
);
}
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With