Web元件
從概念上說,React 和
分别用于解決不同的問題。Web元件提供了強大的封裝特性來支援其可重複使用性,而React提供了一系列聲明性(declarative)接口保證Dom結構和資料同步。但是某些時候這2個目标是互補的。對于開發人員來說将React用于Web元件、或将Web元件用于React、或2者皆有并非難事。
雖然大部分使用React的開發人員并不需要使用Web元件,但是在某些情況,特别是引入了某些第三方庫,還是需要使用到相關機制。
在React中使用Web元件
class HelloMessage extends React.Component {
render() {
return <div>Hello <x-search>{this.props.name}</x-search>!</div>;
}
}
Web元件常會暴露一些必要的API接口,例如一個 video Web元件可能會暴露和
play()
pause()
方法。為了擷取Web元件暴露的這些API接口,需要在React編碼使用Refs特性來直接擷取真實的Dom節點。如果引入第三方的Web元件,最好的解決方案使用一個React元件來包裝引入的Web元件并最終作為一個React元件來使用。
由第三方Web元件觸發的事件也許并不能通過React的渲染樹傳遞,此時需要在元件中去手工的觸發事件。
一個經常導緻混亂的地方是,Web元件使用的是“class”而React使用的是“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});
React整合Jquery這一類直接操作Dom的技術
React在發生真實Dom渲染之前都會先産生與之對應的虛拟Dom結構,然後再“合适”的時候将虛拟Dom的内容渲染到真實Dom上,完成渲染之後componentDidMount會被調用。Jquery這一類真實Dom的操作技術投入實際使用時最好在componentDidMount中使用,然後保證這個元件不會的虛拟Dom不發生任何改變。