ReactWeb元件

溜達向日葵發表於2018-07-26

Web元件

從概念上說,React 和 Web元件 分別用於解決不同的問題。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不發生任何改變。


相關文章