2017-07-19 10 views
0

私は、ビデオのサムネイルを作成し、それをHTMLCanvasElementとして返すユーティリティを持っています。Reactに `HTMLCanvasElement`をレンダリングするには?

render() { 
    return (
     <div className='video-thumbnail'> 
     {this.props.videoThumbnailCanvas} 
     </div> 
    ); 
} 

をしかし、私は、私はエラーを取得し、ことをしようとすることを:私はそうのように、リアクトでその要素をレンダリングしたい

Error: Objects are not valid as a React child (found: [object HTMLCanvasElement]).

これを行うには良い方法は何ですか? 1つのアイデアはcomponentDidMount(例えばReact.getDOMNode(this).appendChild(this.props.videoThumbnailCanvas))から直接的なDOM操作を行うことですが、それはむしろハックのようです。

+0

ユーティリティ機能を制御していますか?代わりに '' JSX要素を返してもらえますか? –

+0

@DannyDelott - 私はそれを制御します。現在、次のようになります。 ' function getThumb(){ let canvas:HTMLCanvasElement = document.createElement(' canvas '); letコンテキスト= canvas.getContext( '2d'); if(context){ context.drawImage(videoElement、0、0、w、h); } リターンキャンバス; } ' JSX要素で 'context'をどのように描画するのかよくわかりません。 – allenrabinovich

+0

私はあなたの 'getThumb()'で 'document.creteElement'を使うことはできないと信じています。 – Muhaimin

答えて

0

私は同じ問題を持って、あなたは、2通りの方法で解決することができます:

render() { 
    const src = this.props.videoThumbnailCanvas.toDataUrl(); 
    return (
     <div className='video-thumbnail'> 
     <img src={src} /> 
     </div> 
    ); 
} 

私はより多くの(しかし、個人的であるが)のような他の方法を::

簡単な方法

onComponentDidMount() { 
    const element = document.getElementById('uniquePlaceHolderKey'); 
    element.parentNode.replaceChild(this.props.videoThumbnailCanvas, element); 
} 

render() { 
    return (
     <div className='video-thumbnail'> 
     <div id="uniquePlaceHolderKey" ></div> 
     </div> 
    ); 
} 

この2番目の解決策では、独自のペイントされたキャンバスインスタンスと入れ替える一時要素を読み込むことができます。私は、事前にレンダリングされたキャンバス要素の追加を強制する適切な反応の解決策を見出しませんでした。 コンポーネントインスタンスで作業してからgetElementByIdよりも望ましいコンポーネントの要素(this.findDomNode()など)を取得する適切な反応メソッドがあります。

+0

だから、私はtoDataURLを使うことを考えましたが、残念ながら、キャンバスがキャプチャされたビデオは同じドメインまたはクロスドメインのアクセスが許可されている場合にのみ機能します。これは私の場合は保証されていません。そうでない場合、toDataURL()は失敗し、 "汚染された"(別のドメインのデータで書き込まれた)キャンバスをエクスポートすることはできません。 あなたの2番目の提案では、実際のキャンバス(toDataURL()なし)を使用して直接DOMを挿入する必要があります。これは現在、最も合理的な方法として立っていますが、Reactにとっては非常に反パターンと思われます。 – allenrabinovich

+0

それは反パターンです。反応が分からないものを挿入しています。反応もあなたに代わるものではありません。 dataurlのパフォーマンスが向上し、反応コンポーネントのライフサイクルを使用して生き続けることができます。 – AndreaBogazzi

+0

はい2番目の例のdataurlはコピーの貼り付けエラーです – AndreaBogazzi

関連する問題