2016-07-18 5 views
1

要素内でオブジェクトをレンダリングしようとしています(パネル要素react-bootstrap)。React.js内のオブジェクトをループしてレンダーする

import React, { PropTypes } from 'react'; 
import { Panel } from 'react-bootstrap'; 

const NetworkDetail = React.createClass({ 
    render() { 
    return (
     <Panel header="Network Details" bsStyle="info"> 
     {this.props.dataDetail && Object.keys(this.props.dataDetail).map(function(detail, id) { 
      return <span key={id}>{this.props.dataDetail[detail]}</span>; 
     }.bind(this))} 
     </Panel> 
    ) 
    } 
}) 

export default NetworkDetail 

しかし、これは機能しません。 (:鍵{自己}を持つオブジェクトが見つかりました)オブジェクトが反応子 として有効ではありません:スローエラーが

キャッチされない不変違反です。子供のコレクション をレンダリングする場合は、代わりに配列を使用するか、またはReactアドオンの createFragment(オブジェクト)を使用してオブジェクトをラップします。 'NetworkDetail'のレンダリング方法 を確認してください。私は理解していない何

は私が

return <span key={id}>{this.props.dataDetail.myProperty}</span>;

を使用している場合、それが動作することです。

オブジェクトのすべてのプロパティと値をレンダリングするにはどうすればよいですか?

+2

'props.dataDetails'のキーのどれも' this.props.dataDetail [detail] 'のオブジェクトを解決できないでしょうか? – SimpleJ

+0

ああスナップ、 'dataDetail'オブジェクトは実際にオブジェクトである' _links'という名前のプロパティを持っています...(アプリケーションはREST HATEOASバックエンドを消費します)。この '_links'オブジェクトが原因である場合、どのように取り除かなければなりませんか?たぶんunderscore.js(実際にはアンダースコアを使ってデータを再フォーマットしています)? – Clafou

+1

Underscoreの 'omit'関数を使って' _links'をフィルタリングすることができます。より良い選択肢は、レンダーしたいキーのリストを作成し、アンダースコアの 'pick'関数を代わりに使用することです。参照:http://underscorejs.org/#omit – SimpleJ

答えて

7

このコンポーネントはステートレス/ダムコンポーネントです。だから、あなたは、効率を最大化するために、コンポーネントのこれらの種類を作成する方法について読むことから始めなければならない:https://facebook.github.io/react/docs/reusable-components.html#stateless-functions

次に、あなたのコンポーネントを修正するために、あなたは

{this.props.dataDetail && Object.keys(this.props.dataDetail).map(function(detail, id) { 
     return <span key={id}>{this.props.dataDetail[detail]}</span>; 
    }.bind(this))} 

は単なる条件文であることに気付くはずです。あなたの「& &」に注目してください。だから、this.props.dataDetailがオブジェクトであると仮定すると、あなたはこのように、このコンポーネントを書き換えることができます。

import React, { PropTypes } from 'react'; 
import { Panel } from 'react-bootstrap'; 

const NetworkDetail = ({dataDetail}) => 
    <Panel header="Network Details" bsStyle="info"> 
    { 
     Object.keys(dataDetail).filter(v => v !== '_links').map((detail, id) => <span key={id}>{dataDetail[detail]}</span>) 
    } 
    </Panel> 

export default NetworkDetail; 

は、これが動作するかどうか、私に教えてください!

+0

これは完全に機能します!ご協力ありがとうございました。 – Clafou

+0

それはあなたのために働いてうれしい@Clafou。あなたが他のトラブルに遭遇した場合は私に知らせてください=) –

関連する問題