2017-02-16 3 views
1

私のアプリケーションでWebコンポーネントを使用しています。そして、Webコンポーネントでは、反応コンポーネントを挿入する必要があります。 Web ComponentにはShadow DOMがあります。次のように反応コンポーネントをレンダリングしようとすると、エラーが発生します。影のDOMとReactJS

comp = React.createElement(ReactElem, { 
    config: config, 
    onRender: handleRender 
}); 

ReactDOM.render(comp , self.shadowRoot.querySelector('#app1')); 

エラー

target container is not a dom element 

私は、WebコンポーネントAPIのcontentを使用しようとしたが、それはトップではなく内部のコンポーネントにレンダリングされます。 ReactコンポーネントをシャドーDOMの内部でレンダリングする方法はありますか?

+0

それはシャドウDOMを使用している場合でも、あなたが生成されたHTMLを取得し、そこにそれを読み込むか、私はここで何かをしないのですか? – juancab

+1

「app1」とは何ですか?あなたは ''#app1 ''を意味しないのですか? – Supersharp

+0

@SupersharpそれはWebコンポーネントです。 –

答えて

0

ウェブコンポーネントのシャドーDOMの内側に挿入する場合は、まずコンポーネント(たとえばquerySelector)を選択し、そのシャドウ(shadowRoot)を選択します。簡単な例:

// Create React Element. 
 
class Example extends React.Component { 
 
    onClick() { 
 
    console.log('Shadow!') 
 
    } 
 
    render() { 
 
    return(
 
     <div onClick={this.onClick}>Hello World!</div> 
 
    ); 
 
    } 
 
} 
 

 
// Create web component with target div inside it. 
 
const container = document.createElement('app'); 
 
document.body.appendChild(container); 
 

 
// Add shadow root to component. 
 
const shadow = document.querySelector('app').createShadowRoot({ mode: 'open' }); 
 

 
// Select the web component, then the shadowRoot. 
 
const target = document.querySelector('app').shadowRoot; 
 

 
ReactDOM.render(<Example />, target);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

+0

問題は 'react'がクリックが機能していないようにすべての操作を行うことができません。また、コンポーネントのインスタンスが複数存在する可能性があり、すべての場所を呼び出す必要があります。 – thecodejack

+0

'onClick'が私のために働いていて、私の答えが更新されました。 「すべての場所に電話する」とはどういう意味ですか?あなたは 'ReactDOM'で毎回それをレンダリングする必要があるのですか? –

+0

ありがとうございます。私は小さな間違いをしたことがわかった。私のDOMはシャドウで2レベル下にあり、スロットの要素は1つの場所でのみ言及されていました – thecodejack

関連する問題