2017-09-16 5 views
2

私は、うまく設計されたボックス、すなわちDIVの束の中にテキストを表示する単純なプレゼンテーションコンポーネントを持っています。私のコンポーネントは、3つの小道具:header,displayTextおよびisHtmlを期待しています。HTMLを含む場合とそうでない場合がある小包を扱う

時々、displayTextに単純なテキストをプロポーズし、ハイパーリンクなどのHTMLを含むものを渡す必要があります。

例えば、私はHello World!または<a href="http://www.google.com">Click for Google</a>displayText小道具に渡すことができます。 HTMLをdisplayTextに渡すと、isHtmlTRUEに設定されます。

私がいる問題はPropTypedisplayTextためstringに設定されていることですが、私は、HTMLタグでテキストを送信する場合、それはobjectになり、私は小道具がobjectを受け取ったがstringを期待していたというエラーを取得します。

このscnearioをどうすれば処理できますか?

私のコンポーネントは次のようになります。

const MyComponent = ({ header, displayText, isHtml }) => { 

    const renderHtml =() => { 

     return { __html: displayText } 
    } 

    return (
     <div className="my-fancy-classes"> 
      <span className="some-more-fancy-classes">{header}</span> 
      {isHtml 
       ? <div className="some-class" dangerouslySetInnerHTML={renderHtml()} /> 
       : <div className="some-class">{displayText}</div> 
      } 
     </div> 
    ); 
} 

MyComponent.propTypes = { 

    header: PropTypes.string.isRequired, 
    displayText: PropTypes.string.isRequired, 
    isHtml: PropTypes.bool.isRequired 
}; 

ここでHTMLを送信するのIF私のコンポーネント宣言が親JSXコンポーネントの内部のようになります。

getMyText() { 

    let displayText = ""; 
    if(this.props.isHtml) 
     displayText = '<a href="http://www.google.com">Click for Google</a>'; 

    return displayText; 
} 

... 
<div> 
    <MyComponent header="Title" displayText={this.getMyText()} isHtml={true} /> 
</div> 

私は単純なテキストを送信していた場合、それはなります次のようになります。

<div> 
    <MyComponent header="Title" displayText={this.props.someProp} isHtml={false} /> 
</div> 
+0

HTMLまたはJSXを送信していますか? HTMLの代わりにdisplayTextでJSXタグを送信していると思います。 – Panther

+0

元の投稿の一番下にセクションを追加しました。私のコンポーネントにデータをどのように送るかを見てください。だから、あなたは私がHTMLではなくJSXを送信していると言っていると思います。 HTMLを送信する必要があるときは、私の例のように常にgetMyText()のような関数を呼び出します。単純なテキストを送る場合は、単に 'displayText = {this.props.someProp}'のようなことをします。だから、これをどう扱うかわからない。 – Sam

+0

オブジェクトの形状は何ですか?オブジェクトがhtmlのとき – Chris

答えて

2

https://facebook.github.io/react/docs/typechecking-with-proptypes.htmlあなたは、レンダリングすることができます何のためにPropTypes.nodeを使用する必要があります。

//レンダリングすることができる何か:数値、文字列、要素またはこれらの型を含む配列 //(またはフラグメント)。 optionalNode:PropTypes.node、

ので、あなたがPropTypes複数の種類を持っているしたい場合は、また、編集

1つの小道具に


oneOfTypeを使用することができ

MyComponent.propTypes = { 
    header: PropTypes.string.isRequired, 
    displayText: PropTypes.node.isRequired, 
    isHtml: PropTypes.bool.isRequired 
}; 

を持っているでしょう

あなただけの直接JSXを返す場合のように、あなたも、など、dangerouslySetInnerHTMLを行う必要がないかもしれません。

getMyText() { 
    let displayText = ""; 
    if (this.props.isHtml) 
    // Remove quotes around html 
    displayText = <a href="http://www.google.com">Click for Google</a>; 

    return displayText; 
} 

-

const MyComponent = ({ header, displayText, isHtml }) => { 
    return (
    <div className="my-fancy-classes"> 
     <span className="some-more-fancy-classes">{header}</span> 
     <div className="some-class">{displayText}</div> 
    </div> 
); 
} 
+0

'PropTypes.node'を試しましたが、まだエラーメッセージが表示されています。エラーが表示されます:失敗した小道具の種類: 'MyComponent'に供給された無効な小道具' displayText'、ReactNodeが必要です。 – Sam

+0

私は 'oneOfType'を試してエラーを排除しましたが、HTMLを全くレンダリングしていません。それでも '[object Object]'を表示しています – Sam

+0

私の答えを編集しました。見てください - 私が正しく理解していれば、いくつかのコードを削除して動作させることができます。 –

0

を使用すると、文字列型であるためにあなたのdisplayTextの小道具を定義しているので、それは勝ちましたhtmlオブジェクトでは機能しません。このように定義する必要があります。

displayText: PropTypes.any.isRequired, 

ここでanyを指定すると、displayText propに任意のタイプのコンテンツを渡すことができます。

関連する問題