Наблюдается странная проблема, когда prevState
не определено в componentDidUpdate
, но определяется, когда компонент запускается в браузере.
Я устанавливаю состояние в конструкторе, и в componentDidUpdate происходит проверка значения на prevState
.
componentDidUpdate(prevProps, prevState) {
const { showForm } = this.state;
if (prevState.showForm && !showForm) {
return this.input.current.focus();
}
}
Вот ферментный тест:
it("should call focus on input if form was shown, and now form is open", () => {
component = mount(<Component {...props} />);
const prevProps = component.props();
const prevState = {
...component.state(),
showForm: true
};
const focusSpy = sinon.spy(component.instance().input.current, "focus");
component.instance().componentDidUpdate(prevProps, prevState);
expect(focusSpy).to.have.been.called;
});
Этот подход работает - но только потому, что я звоню componentDidUpdate
из энзимного теста и прохожу его prevState
.
В идеале я бы хотел избежать этого - и просто определить prevState - как это происходит, когда компонент фактически работает в браузере.
Каковы схемы обращения с этим?