React文檔(二十三)Web Components

React和web components是爲了解決不一樣問題而創立的。web components爲可重用組件提供了健壯的封裝,而React提供了聲明式的庫來保持DOM和數據同步。這兩點是互相補充的。做爲一個開發者,你能夠自由地在你的web components裏使用React,或者在React裏使用web components,或者二者同時使用。react

不少人使用React而不使用web components,可是你也許想要試一試,特別是若是你在使用依靠web components開發的第三方UI組件。git

在React裏使用web componentsgithub

class HelloMessage extends React.Component {
  render() {
    return <div>Hello <x-search>{this.props.name}</x-search>!</div>;
  }
}

注意:web

web components常常對實例暴露一個重要的接口,一個video web component也許會暴露play()和pause()函數。想要訪問web component的接口,你將須要使用一個ref去與DOM節點直接交互。若是你使用第三方的web components,最好的解決方案就是寫一個React組件來包裹web component。app

web components發出的事件也許不能正確地在React渲染樹裏傳遞。你將須要手動附加上事件處理器去處理這些事件在你的React組件裏。ide

有一個混淆就是web component使用class而不是className。函數

function BrickFlipbox() {
  return (
    <brick-flipbox class="demo">
      <div>front</div>
      <div>back</div>
    </brick-flipbox>
  );
}

在web component裏使用Reactthis

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});

你也能夠看看這個連接完整的web component例子google

相關文章
相關標籤/搜索