React我如何更新/清除条件卸载组件的父状态字段

时间:2019-07-24 12:42:41

标签: reactjs components conditional-statements unmount

我已经在React中用条件表单域创建了一个表单。条件字段是表单父级的子级组件。在条件子组件中,我使用componentWillUnmount更改了父组件中的状态(如果卸载了,则删除状态值和属性)。

一切正常,直到我在提交用于显示微调框的表单时在axios / ajax调用中使用setState为止。因为我在ajax调用中使用了setState,所以componentWillUnmount会触发并清除条件状态属性。如果ajax调用出错,则不会发送表单,并且会显示表单中的所有值,但条件字段值现在为空。

它在React网站上说“您不应该在componentWillUnmount()中调用setState(),因为该组件将永远不会被重新呈现。”,所以我想我必须重写代码,但是现在我不知道该怎么做重新创建相同的行为。

我尝试使用“ _isMounted”代替,但是不知道如何通过子-父母-国家关系来实现;

请问有人可以建议我如何重写它吗?

我只使用React 16.8(没其他)

  • 在我的表单中-父组件:


     setStateConditionalFieldOnMount = (stateName, isMounted) => {   
            if(isMounted) {
              this.setState( prevState => ({
                  [stateName]: "",
                  validatieErrors: {
                    ...prevState.validatieErrors, [stateName]: ""
                  }
                }) 
              );
            } else {
              this.setState( prevState => {
                delete prevState[stateName];
                delete prevState.validatieErrors[stateName];
                return prevState;
              });
            }
          }

并作为我的子组件的属性:


    validateConditionalField = {component.setStateConditionalFieldOnMount}

  • 在“我的孩子”部分(条件格式字段)中:

    componentWillUnmount() {                     
            if (this.props.validateConditionalField) {
                this.props.validateConditionalField(this.props.name, false);
            }
     }

    componentWillMount() {
            if (this.props.validateConditionalField) {
                this.props.validateConditionalField(this.props.name, true);
            }
    } 

  • 在我的表单提交中,我设置了激活微调器的状态:

    axios.get(url).then((response) => {      
      if (response.status !== 200) {  
        console.error(response.status);  
        return;
      }

       component.setState({ fetchInProgress: true });

0 个答案:

没有答案