2016-05-24 10 views
0

私は、次のコードを持っている:私はthis.props.messages.map上のそれぞれの子の後this.props.replied_messages.mapを追加したい反応jsxレンダリング関数で各子の後ろに要素を追加する方法はありますか?

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> 
    ) 
    } 

} 

を。

例データ:

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' 
    } 
    ] 
} 
+0

を'replied_messages'配列全体を' messages'のすべての項目の後にレンダリングしたいと言っていますか?あるいは、 'messages'と' replied_messages'の項目の間にいくつかの相関関係がありますか?もしそうなら、何? – Aaron

+0

あなたが何を書いたのかよくわかりました。返信されたメッセージにループ内の現在の子のIDが関連付けられている場合、条件付きを追加します。 – user3561335

+0

'replied_messages'の中のいくつかの項目は' messages'の項目と同じ 'id'を持っていて、お互いに表示したいと言っていますか?いくつかのサンプルデータを表示し、それをどのようにレンダリングすることができますか? – Aaron

答えて

1

私は this.props.messages.map上のそれぞれの子の後this.props.replied_messages.mapを追加したいです。

あなたがしたいように聞こえるのは、スレッドメッセージリストをレンダリングすることです。すべての返信が親メッセージに従う<Message>コンポーネントのフラットリストをレンダリングする場合は、messagesのネストされたマップでこれを行うことができます。replied_messagesfilterを使用してそのメッセージへの返信をすべて取得し、 (そのメッセージのメッセージ+返信)を配列に、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> 

Example in CodePen.

(あなたmessagesreplied_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> 

Example in CodePen.

+0

私は2番目の例を使用しましたが、今は本当にうまくいきます。 – user3561335

関連する問題