ReactJS - 如何将组件引用作为道具传递给另一个组件?

ReactJS - how to pass component reference to another component as prop?

我有两个同级组件 WebcamStreamCaptureArea,我想将对 WebcamStream 的引用作为 CaptureArea 的 prop 传递,但是当我这样做时,它总是无效的。如何解决这个问题?

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 标签上生成临时 canvas 以从中获取图像数据。我使用 imageData 解析二维码。

ref 是 React 内部使用的一个 prop,与 key prop 非常相似,因此您可以将其命名为其他名称,并像 WebcamStream 组件中的任何其他 prop 一样对待它。

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>