2017-02-16 74 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