React setstate只能在重新渲染时更新已安装或安装的组件

时间:2017-07-21 00:29:52

标签: javascript reactjs components voice-recognition

我正在使用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

  1. SpeechToText

  2. div包含按钮

  3. 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);
    

    SpeechToTextprops

    收到语音识别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
    

    有时错误不会出现,但语音转文字不起作用。

    为什么会发生这种情况 - 我是否需要强行删除该组件?

1 个答案:

答案 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)