2017-02-16 103 views
1

我在我的應用程序中使用了Web組件。而在一個Web組件中,我需要插入一個反應組件。 Web組件具有Shadow DOM。當我嘗試使用以下內容呈現反應組件時,出現錯誤。Shadow 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這是一個網絡組件。 –

回答

0

如果要將其插入到Web組件的陰影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級,槽元素只在一個地方被提及 – thecodejack