我已经在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 });