3

我有两个兄弟组件WebcamStream,并且CaptureArea我想将引用WebcamStream作为 prop传递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 来解析二维码。

4

1 回答 1

3

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

innerRef是附加到组件中任何元素的自定义 ref 的通用名称。

例子

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>

于 2018-11-11T19:47:53.090 回答