Учим то, что осталось
Слова, которые вы знаете, повторять не нужно. В этом упражнении приложение показывает только карточки, которые вы ещё не знаете, а когда вы знаете все, сообщает об этом и предлагает начать заново.
Какие карточки остались, вычисляется, как и колода. filter() оставляет слова, чьего id нет в known:
const toLearn = deck.filter((word) => !known.includes(word.id));Тогда карточка — это toLearn[index], и позиция тоже считается по toLearn: 1 / 9 означает, что осталось выучить девять слов. Счёт по-прежнему считает всю колоду.
Это меняет то, что делает «Знаю». Когда вы отмечаете карточку, она выпадает из toLearn, и на её место с тем же index встаёт следующая. Поэтому handleKnow() больше не переходит дальше через handleNext(). Но если это была последняя карточка, на её место никто не встаёт, и приложение возвращается к первой:
function handleKnow() {
if (!known.includes(card.id)) {
setKnown((known) => [...known, card.id]);
}
if (index === toLearn.length - 1) {
setIndex(0);
}
}А когда toLearn пуст, показывать больше нечего. Тогда App возвращает другую страницу: сообщение и кнопку Начать заново, которая очищает known и возвращает к первой карточке.
Задание
- 1
Ниже
deckсоздайтеtoLearn, как показано выше, и используйте его вместоdeckдля карточки, позиции, кнопки «Вперёд» иhandleNext()(счёт по-прежнему используетdeck.length). ВhandleKnow()заменитеhandleNext()возвратом к первой карточке, как показано выше. Нажмите «Знаю»: позиция покажет1 / 11, а на карточке будет следующее слово. - 2
Перед
returnс карточками добавьте ещё один: когдаtoLearn.lengthравно0, возвращайтеmainс заголовком,<p className="done">Вы знаете все слова!</p>и кнопкойНачать заново. Её обработчикhandleStartOver()очищаетknownи снова ставитindexв0. Эту страницу вы увидите, когда отметите все карточки.