ReactJS - как передать ссылку на компонент другому компоненту как проп?

У меня есть два родственных компонента WebcamStream а также CaptureAreaХочу передать ссылку на WebcamStream как опора CaptureArea, но когда я делаю это, это всегда ноль. Как это исправить?

class AppContent extends React.Component {
    constructor(props) {
        super(props);
        this.videoTag = React.createRef();
    }

    render() {
        return (
            <div id="content">
                <WebcamStream ref={this.videoTag}
                              width="300" height="300" 
                              title="Real-time video stream from webcam" 
                              id="video" />
                <CaptureArea x="20" y="20" width="120" 
                             height="120" color="white" 
                             videoTag={this.videoTag.current}/>
            </div>
        );
    }
}

Зачем мне это нужно: CaptureArea генерирует временный холст на текущий video тег, чтобы получить imageData из него. Я использую imageData для анализа QR-кода.

1 ответ

Решение

ref это реквизит, используемый React внутренне, как key опора, так что вы можете назвать это как-то еще и относиться к нему как к любой другой опоре WebcamStream составная часть.

innerRef является общим именем для пользовательского ссылки, который вы присоединяете к любому из элементов в компоненте.

пример

function WebcamStream(props) {
  return <div ref={props.innerRef}> WebcamStream </div>;
}

class CaptureArea extends React.Component {
  componentDidMount() {
    console.log(this.props.videoTag.current);
  }
  render() {
    return <div> CaptureArea </div>;
  }
}

class AppContent extends React.Component {
  videoTag = React.createRef();

  render() {
    return (
      <div id="content">
        <WebcamStream
          innerRef={this.videoTag}
          width="300"
          height="300"
          title="Real-time video stream from webcam"
          id="video"
        />
        <CaptureArea
          x="20"
          y="20"
          width="120"
          height="120"
          color="white"
          videoTag={this.videoTag}
        />
      </div>
    );
  }
}

ReactDOM.render(<AppContent />, document.getElementById("root"));
<script src="https://unpkg.com/react@16.6.1/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@16.6.1/umd/react-dom.production.min.js"></script>

<div id="root"></div>

Другие вопросы по тегам