我正在使用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
。如果状态为非 Activity ,则使用非 Activity 按钮渲染div
。编辑
默认情况下,状态为非 Activity 状态-
this.state.micActive: false
。如果状态为非 Activity 状态,则使用<div>
呈现button
。如果单击该按钮,则会调用makeActive
方法并使状态变为 Activity 状态;如果状态为 Activity 状态,我将渲染<SpeechToText>
。完成语音转文本后,我将其称为makeInactive
-使状态变为非 Activity 状态,并且<div>
再次呈现第一次单击按钮
SpeechToText
会呈现,并且语音转文本功能正常。但是第二次我单击按钮-并且尝试重新渲染
SpeechToText
组件时出现错误:setstate can only update a mounted or mounting component
有时不会出现错误,但语音转文字功能无效。
为什么会发生这种情况-也许我需要强制删除组件吗?
最佳答案
原来这是SpeechRecognitionContainer
的问题。
该软件包已使用新的 Prop 和配置选项进行了更新,并且我解决了我的问题。
您可以阅读有关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)
关于javascript - React setstate只能在重新渲染时更新已安装或正在安装的组件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45227151/