React進(jìn)階筆記13(Web Components)

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});
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,219評論 25 708
  • 這兩天又開始比較晚睡了,除非中午不睡覺,然后一直在忙,一直不停的在忙。讓自己沒有空閑時間的去忙,這樣才會在9點左...
    金耀林閱讀 239評論 0 0
  • 你若盛開,蝴蝶自來。------題記 今天被車間廠長罵了。 他看了看我做的材料單,笑著對王工說:這么大的齒輪不外購...
    尤秋普拉卡齊亞閱讀 383評論 0 1

友情鏈接更多精彩內(nèi)容