经过长时间的尝试,我找到了一个使用门户的解决方案。我把这个贴出来作为一个答案,以防其他人也有类似的问题。
我使用NPM包提供的组件的组件如下所示:
componentDidMount() {
this.subscriber.current.node.classList.add("stream-container")
if(this.props.hide)
ReactDOM.findDOMNode(this).parentElement.classList.add("Hide");
if(this.subscriber.current && !this.state.renderControls)
this.setState({renderControls: true});
}
render() {
if(this.state.error) {
return(
<div>{this.state.error}</div>
);
}
else {
return(
<Fragment>
<OTSubscriber
ref={this.subscriber}
session={this.props.session}
stream={this.props.stream}
properties={{
subscribeToAudio: this.props.audio,
subscribeToVideo: this.state.video,
showControls: false,
}}
onError={this.onError}
/>
{this.state.renderControls ?
<SubscriberControls subscriberRef={this.subscriber} subscriberId={this.props.subscriberId}/> : null
}
</Fragment>
);
}
}
如你所见,我正在使用refs。所以在构造函数内部,我有这段代码:
this.subscriber = React.createRef();
现在,我必须向状态添加一个新变量,因为我需要对render方法输入两次react。
-
获取otsubscriber的引用。
-
呈现subscriberControls组件。
现在,我的SubscriberControls组件如下所示:
import React, { Component, Fragment } from 'react';
import ReactDOM from 'react-dom';
import './SubscriberControls.css';
export default class SubscriberControls extends Component {
render() {
return ReactDOM.createPortal(
<Fragment>
<button
type="button"
id={"audio" + this.props.subscriberId}
className="OT_edge-bar-item OT_mute OT_mode-auto"
>
</button>
</Fragment>,
this.props.subscriberRef.current.node.childNodes[0]
);
}
}
通过这种方式,我实现了将subscriberControls添加为otsubscriber div容器的子元素。