React 和 web組件 被用以解決不同問題。web組件為可重用的組件提供了強(qiáng)大的封裝能力。React則是保持DOM和數(shù)據(jù)同步的聲明式庫,二者的目標(biāo)互補(bǔ)。作為開發(fā)者,可以隨意的在React中使用web組件,也可以在web組件中使用React。
大部分使用React的開發(fā)者并不使用 web組件,但你可能想要,尤其若你正在使用那些用 Web組件編寫的第三方UI組件。
在React中使用web組件
class HelloMessage extends React.Component{
render(){
return <div>
hello
<x-search>{this.props.name}</x-search>
</div>
}
}
注意
web組件通常暴露一個必要的API,例如一個 video 組件就有可能會暴露 play() 和 pause() 方法。
為了訪問組件必要的API,你需要使用一個引用,能夠直接和dom節(jié)點交互。
如果正在使用第三方web組件,最好的方法是編寫一個React組件,來包裝這個第三方組件。
由web組件觸發(fā)的事件,可能無法通過React的事件樹渲染來正確的冒泡。
只能通過手動處理器來處理那些React組件里面的事件。
一個普遍的問題就是:
web組件中使用 class 而不是 className
function BrickFlipbox() {
return (
<brick-flipbox class="demo">
<div>front</div>
<div>back</div>
</brick-flipbox>
);
}
在web組件中使用React
const proto = Object.create(HTMLElement.prototype, {
attachedCallback: {
value: function() {
const mountPoint = document.createElement('span');
this.createShadowRoot().appendChild(mountPoint);
const name = this.getAttribute('name');
const url = 'https://www.google.com/search?q=' + encodeURIComponent(name);
ReactDOM.render(<a href={url}>{name}</a>, mountPoint);
}
}
});
document.registerElement('x-search', {prototype: proto});