2016-07-10 2 views
0

Это код. Не знаю, почему возникает проблема.setState (...): Может обновлять только смонтированный или монтажный компонент

class TeacherForm extends Component { 
    constructor({ data }) { 
    super(); 

    this.isUpdatingForm = !! data; 
    this.state = Object.assign({ ... }); 

    this.handleSubmit = this.handleSubmit.bind(this); 
    this.removeTeacher = this.removeTeacher.bind(this); 
    } 

    handleChange(value, field) { 
    this.setState({ shouldUpdate: true, [field]: value }); 
    } 

    handleSubmit(e) { 
    e.preventDefault(); 
    const { name, subjects, parttime, timing } = this.state; 

    if (this.isUpdatingForm) { 
     return update.call({ 
     _id: this.props.data._id, 
     transaction: { name, subjects, parttime, timing }, 
     },() => this.setState({ shouldUpdate: false })); 
    } 

    return add.call(); 
    } 

    removeTeacher() { 
    return remove.call(this.props.data._id); 
    } 

    render() { 
    return (
     <form onSubmit={this.handleSubmit}> 
     ... 
     </form> 
    ); 
    } 
} 

Ошибка брошена в методе handleSubmit в обратном вызове update.call. Обычно это отображается, когда я вызываю removeTeacher и обновляет список, и этот компонент размонтируется.

ответ

0

Звучит как обратный вызов () => this.setState({ shouldUpdate: false }) выполняется после того, как компонент размонтирован. Это возможно? Если это так, один из способов обойти это, чтобы заменить эту часть на

return update.call({ 
    _id: this.props.data._id, 
    transaction: { name, subjects, parttime, timing }, 
},() => { !this.unmounted && this.setState({ shouldUpdate: false }); }); 

и добавить

componentWillUnmount() { 
    this.unmounted = true; 
} 
+0

Он должен работать на подчиненной формы. Есть ли причина, почему он может работать после размонтирования. Если он отключен, форма никогда не будет отправлена, поэтому технически не будет работать. –

+0

Update.call называется синхронно, когда компонент монтируется. Но похоже, что обратный вызов, который изменяет состояние, может запускаться после того, как компонент размонтирован. – Guig

+0

. Вы можете добавить журналы в 1) Handle submit непосредственно перед update.call, 2) в обратном вызове 3) в компонентеWillUnmount и посмотреть, в каком порядке они получил вызов – Guig

Смежные вопросы

 Смежные вопросы