2017-06-15 335 views
0

我试图添加一个组件点击按钮。Reactjs:点击按钮添加组件

以下是该

https://jsfiddle.net/rzv6Lrjh/92/

render: function() { 
    return (
    <div> 
     <IndividualTicketInput /> 
     {this.state.tickets} 
     <CreateTicket createTicket={this.onClick} /> 
    </div> 
    ); 
    } 
}); 

这里我使用的各个组件IndividualTicketInput的小提琴,是有可能做到这一点单组分门票组件内?

+0

这是你想要的吗? https://jsfiddle.net/mayankshukla5031/07v7qfzo/我认为你不需要为按钮创建一个单独的组件,而不是在'state'中推入新的元素,只需要统计需要创建的子组件的数量。然后使用循环创建等于no的子组件。 –

回答

0

是的,你可以。

您可以在Tickets组件内部实现一个返回票据UI的html元素的函数。但是,我认为这不是最佳做法。因为,您应该将每个UI组件项目分割为React Component。

https://jsfiddle.net/rwnvt8vs/

ticket: function(ticket = {name: '', quantity: '', price: null}){ 
    return (
    <ul> 
     <li> 
      <label>Ticket Name</label> 
      <input className="ticket-name" type="text" placeholder="E.g. General Admission" value={ticket.name} /> 
     </li> 
     <li> 
      <label>Quantity Available</label> 
      <input className="quantity" type="number" placeholder="100" value={ticket.quantity} /> 
     </li> 
      <li> 
      <label>Price</label> 
      <input className="price" type="number" placeholder="25.00" value={ticket.price} /> 
      </li> 
     <li> 
      <button type="button" className="delete-ticket" onClick={this.deleteTicket}><i className="fa fa-trash-o delete-ticket"></i></button> 
     </li> 
     </ul> 
); 
}, 

onClick: function() { 
    var newTicket = this.ticket(); 
    var tickets = this.state.tickets.push(newTicket); 
    this.setState({tickets: tickets}); 
}, 
+3

而不是强制更新,最好使用'this.setState'。这是因为setState无论如何都会重新渲染,并且还会渲染渲染。 –

+1

@DominicTobias我完全同意你的看法,但我只是重构了答案的必要部分。 –

2

你可以存储在状态门票的阵列,并生成一个新的票据对象单击CreateTicket按钮各一次。将新票保存在状态中并遍历它们,将每个票都呈现给dom。该组件将在每次调用setState时重新渲染,并使用新的<Ticket>组件更新dom。

state = { tickets: [] } 

render: function() { 
    return (
    <div> 
     <IndividualTicketInput /> 
     {this.state.tickets} 
     <CreateTicket createTicket={this.onClick} /> 
     {this.renderTickets()} 
    </div> 
    ); 
    } 
}); 

renderTickets() { 
    return this.state.tickets.map(ticket => { 
     return <Ticket key={ticket.id} ticket={ticket} />; 
    }); 
} 

onClick =() => { 
    let newTicket = { ... }; 
    let tickets = this.state.tickets.unshift(newTicket); 
    this.setState({tickets}); 
}