【发布时间】:2018-02-05 04:35:33
【问题描述】:
我是 React 的新手,我正在构建一个从 MediaStream 获取屏幕抓取的应用程序。根据我所见,最好的方法是使用 context.drawImage() 方法将其绘制到画布元素上,并将 HTMLVideoElement 作为参数传入。这是我的动作创建者的样子:
const RecordImage = function(video, canvas, encoder) {
if(!encoder) {
encoder = new GifReadWrite.Encoder()
encoder.setRepeat(0)
encoder.setDelay(100)
encoder.start()
}
const context = canvas.getContext('2d')
context.drawImage(video, 0, 0)
encoder.addFrame(context)
return {
type: RECORD_IMAGE,
payload: encoder
}
}
这在过去很有效,因为 RecordImage 操作是从包含 <video /> 和 <canvas /> 元素的同一组件调用的,我可以像这样传递它们:
takePic(event) {
event.preventDefault()
this.props.RecordImage(this.video, this.canvas, this.props.encoder)
}
...
render() {
return (
<div>
<video
ref = { video => this.video = video }
width = { this.props.constraints.video.width }
height = { this.props.constraints.video.height }
autoPlay = "true"
/>
<canvas
ref = { canvas => this.canvas = canvas }
width = { this.props.constraints.video.width }
height = { this.props.constraints.video.height }
/>
<button onClick = { this.takePic }>Take Picture</button>
</div>
)
}
但是,我想将“拍照”按钮放在不同的组件中。这是一个问题,因为现在我不知道如何从同级组件访问 <video /> 和 <canvas /> 元素。通常我会将我需要的参数存储为状态的一部分,但drawImage() 方法需要使用 HTML 元素本身。我听说在状态中存储 DOM 元素是个坏主意,那么最好的方法是什么?
【问题讨论】:
标签: javascript reactjs canvas redux webrtc