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

时间:2018-11-11 19:41:11

标签: reactjs react-ref

我有两个同级组件WebcamStreamCaptureArea,我想传递对WebcamStream的引用作为CaptureArea的支持,但是当我这样做时,它始终为null。该如何解决?

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 Code。

1 个答案:

答案 0 :(得分:1)

ref是React内部使用的props,与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>