React学习(11)—— 高阶应用:Web组件

前端之家收集整理的这篇文章主要介绍了React学习(11)—— 高阶应用:Web组件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Web组件

从概念上说,React 和 Web组件分别用于解决不同的问题。Web组件提供了强大的封装特性来支持其可重复使用性,而React提供了一系列声明性(declarative)接口保证Dom结构和数据同步。但是某些时候这2个目标是互补的。对于开发人员来说将React用于Web组件、或将Web组件用于React、或2者皆有并非难事。@H_404_5@

虽然大部分使用React的开发人员并不需要使用Web组件,但是在某些情况,特别是引入了某些第三方库,还是需要使用到相关机制。@H_404_5@

在React中使用Web组件

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

Web组件常会暴露一些必要的API接口,例如一个 video Web组件可能会暴露play()pause()方法。为了获取Web组件暴露的这些API接口,需要在React编码使用Refs特性来直接获取真实的Dom节点。如果引入第三方的Web组件,最好的解决方案使用一个React组件来包装引入的Web组件并最终作为一个React组件来使用。@H_404_5@

由第三方Web组件触发的事件也许并不能通过React的渲染树传递,此时需要在组件中去手工的触发事件。@H_404_5@

一个经常导致混乱的地方是,Web组件使用的是“class”而React使用的是“className”,例如:@H_404_5@

  1. function BrickFlipBox() {
  2. return (
  3. <brick-flipBox class="demo">
  4. <div>front</div>
  5. <div>back</div>
  6. </brick-flipBox>
  7. );
  8. }

在Web组件中使用React

  1. const proto = Object.create(HTMLElement.prototype,{
  2. attachedCallback: {
  3. value: function() {
  4. const mountPoint = document.createElement('span');
  5. this.createShadowRoot().appendChild(mountPoint);
  6.  
  7. const name = this.getAttribute('name');
  8. const url = 'https://www.google.com/search?q=' + encodeURIComponent(name);
  9. ReactDOM.render(<a href={url}>{name}</a>,mountPoint);
  10. }
  11. }
  12. });
  13. document.registerElement('x-search',{prototype: proto});

猜你在找的React相关文章