我正在使用react-speech-recognition
包在我的应用中进行语音转文字。
app.js的内部渲染:
<ChatContainer
micActive={this.state.micActive}
sendData={this.sendData}
makeInactive={this.makeInactive}
>
<SpeechToText>
sendData={this.sendData}
makeInactive={this.makeInactive}
micActive={this.state.micActive}
</SpeechToText>
<div>
<button
id="micInactive"
type="button"
onClick={this.makeActive}
/>
</div>
</ChatContainer>
如您所见,我的ChatContainer
有两个Children
:
SpeechToText
div
包含按钮
SpeechToText.js:
class SpeechToText extends Component {
componentWillReceiveProps(nextProps) {
if (nextProps.finalTranscript && nextProps.micActive) {
this.props.sendData(nextProps.finalTranscript);
this.props.resetTranscript();
this.props.makeInactive();
}
}
render() {
return (
<div>
<button
id="micActive"
type="button"
/>
</div>
);
}
}
export default SpeechRecognition(SpeechToText);
SpeechToText
从props
Speech Recognition
ChatContainer.js
const ChatContainer = props => (
<div>
{
React.Children.map(props.children, (child, i) => {
if (i === 0 && child.props.active) {
return React.cloneElement(child, {
sendData: props.sendData,
makeInactive: props.makeInactive,
micActive: props.micActive,
});
}
if (i === 1 && child.props.inactive) {
return child;
}
return null;
})
}
</div>
);
export default connect()(ChatContainer);
最后ChatContainer
决定要呈现的child
。如果状态为非活动状态,则使用非活动按钮呈现div
。
修改
默认状态为非活动状态 - this.state.micActive: false
。如果状态为非活动状态,则使用<div>
呈现button
。如果单击该按钮,则会调用makeActive
方法并使状态处于活动状态 - 如果状态为活动状态,则呈现<SpeechToText>
。完成语音转文本后,我调用makeInactive
- 这会使状态无效并再次呈现<div>
我第一次点击按钮SpeechToText
会被渲染并且语音转文字有效。
然而,第二次单击按钮 - 我尝试重新呈现SpeechToText
组件时出现错误:
setstate can only update a mounted or mounting component
有时错误不会出现,但语音转文字不起作用。
为什么会发生这种情况 - 我是否需要强行删除该组件?
答案 0 :(得分:1)
原来这是SpeechRecognitionContainer
的问题。
该软件包更新了新的道具和配置选项,我解决了我的问题。
您可以详细了解react-speech-recognition
here。
现在我可以像这样渲染组件:
render() {
return (
<SpeechToText
sendSpeechToText={this.sendSpeechToText}
/>
);
}
和SpeechToText看起来像这样:
class SpeechToText extends Component {
constructor(props) {
super(props);
this.reactivate = this.reactivate.bind(this);
}
componentWillReceiveProps(nextProps) {
if (nextProps.finalTranscript && nextProps.micActive) {
this.props.sendSpeechToText(nextProps.finalTranscript);
this.props.resetTranscript();
this.props.stopListening();
}
}
componentWillUnmount() {
if (this.props.listening) {
this.props.abortListening();
}
}
reactivate() {
if (!this.props.listening) {
this.props.startListening();
}
render() {
return (
<div>
<button
id="micButton"
type="button"
onClick={this.reactivate}
/>
</div>
);
}
}
const options = {
autoStart: false
}
export default SpeechRecognition(options)(SpeechToText)