[英]How I can prepend an element after each child in a react jsx render function?
我有以下代碼:
class MessageList extends Component {
render () {
return (
<ul>
{
this.props.messages.map((message) => {
return <Message key={message.id} message={message} />
})
}
{
this.props.replied_messages.map((message) => {
return <Message key={message.id} message={message} />
})
}
</ul>
)
}
}
我想在this.props.replied_messages.map
每個孩子之后添加this.props.messages.map
。
示例數據:
let initialState = {
messages: [
{
id: 0,
timestamp: 1464092864076,
text: 'holas'
},
{
id: 1,
timestamp: 1464125678372,
text: 'other comment'
}
],
replied_messages: [
{
id: 0,
message_replied_id: 0,
timestamp: 1464092864076,
text: 'eyyy'
},
{
id: 1,
message_replied_id: 0,
timestamp: 1464125851108,
text: 'a reply'
},
{
id: 2,
message_replied_id: 1,
timestamp: 1464125909151,
text: 'other comment reply'
}
]
}
我想在
this.props.replied_messages.map
每個孩子之后添加this.props.messages.map
。
聽起來您想要做的是呈現一個線程化消息列表。 如果要呈現<Message>
組件的平面列表,其中所有答復都跟隨其父消息,則可以使用嵌套的map來做到這一點: map
messages
,然后使用replied_messages
上的filter
獲得對該消息的所有答復,然后將兩者(該消息的消息+答復)組合到一個數組中,並將該數組map
到<Message>
組件。
<ul>
{ this.props.messages.map(message =>
[
message,
...this.props.replied_messages.filter(reply => reply.message_replied_id == message.id)
].map(message => <Message key={message.id + "_" + message.message_replied_id} message={message}/>)
) }
</ul>
(請注意,由於您的messages
和replied_messages
有重復的id
值,我不得不做出的key
基於兩個。最好你不會有重復的ID是這樣的。)
但如果我是你,我只想建立一個線程消息榜第一 ,並呈現分級部件樹回復其父消息的孩子 。 例如,您可以像這樣從兩個數組構建線程消息:
function messagesToThreads(messages, replied_messages) {
return messages.map(message => {
return {
message,
replies: replied_messages.filter(reply => reply.message_replied_id == message.id)
}
});
}
並渲染嵌套的 <Message>
項目以創建層次結構列表:
<ul>
{ messagesToThreads(this.props.messages, this.props.replied_messages).map(thread =>
<Message key={thread.message.id} message={thread.message}>
{ thread.replies.map(reply => <Message key={reply.id} message={reply} />) }
</Message>
) }
</ul>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.