Я думаю, что вы стираете this.state.skipped
здесь, поскольку this.skipped
, кажется, нигде не объявлено.
this.setState({skipped: this.skipped});
После этого вызова this.state.skipped
равно undefined
, поэтомувызов this.state.skipped.has(...)
взрывается.
Я подозреваю, что вы намеревались использовать this.state.skipped
.
Еще одним источником проблем может быть проблема с областью действия, возникающая из-за способа обработки ваших обработчиков щелчков.объявлено и присоединено, например, onClick={this.handleNext}
.
TLDR: вместо этого попробуйте onClick={() => this.handleNext()}
.
В javascript область (на что ссылается this
) внутри вызова метода обычно устанавливается наобъект, для которого он был вызван.
Так что, если вы вызовете this.handleNext()
, ссылки на this
внутри handleNext
будут вашим компонентом, как вы ожидаете.
Однако, если вместо этого выdo:
const {handleNext} = this;
handleNext();
Ссылка this
может не соответствовать ожидаемой причине, поскольку метод не был вызван как метод в вашем компоненте.Он был вызван как отдельная функция, отделенная от вашего компонента.И это именно то, что происходит, когда вы передаете обработчик события другому компоненту.Внутри дочернего компонента (например, кнопки) ваш обработчик представляет собой просто функцию, переданную в виде пропеллера, отсоединенного от вашего компонента:
// inside the button component
const {onClick} = this.props;
onClick(); // no scope; detached from your component
Есть несколько способов исправить это, но два наиболееПроще говоря:
- Объявить новую функцию, которая вызывает обработчик компонента:
onClick={ () => this.handleNext() }
Сделайте ваш обработчик функцией стрелки, потому что функции стрелки автоматически принимают родительскую область видимости, в которой они объявлены.Поэтому вместо этого:
handleNext() {
let newSkipped = this.skipped;
...
Сделайте это:
handleNext = () => {
let newSkipped = this.skipped;
Надеюсь, это поможет.Извини, что так долго.Сделайте попытку и дайте мне знать.
Примечание: вы можете выполнить оба этих действия за один звонок:
this.setState({activeStep: prevActiveStep => prevActiveStep + 1})
this.setState({skipped: this.skipped});
this.setState({
activeStep: prevActiveStep => prevActiveStep + 1,
skipped: this.state.skipped
})