diff --git a/src/manage/qd/BookIndex.tsx b/src/manage/qd/BookIndex.tsx index 0e071b9..2d8f962 100644 --- a/src/manage/qd/BookIndex.tsx +++ b/src/manage/qd/BookIndex.tsx @@ -3,7 +3,7 @@ import { useBookInfo } from "./BookInfoProvider"; import styles from './BookIndex.module.css'; import { loadChapterListsIfNeeded, useBookContext, useBookStatus } from "./BookStatusProvider"; import VolumesList from "./VolumesList"; -import { useEffect, useState } from "react"; +import { useEffect, useMemo, useState } from "react"; import { useDb } from "../dbProvider"; import type { Volume } from "../../qdtypes"; import { ChapterShowMode, get_new_volumes } from "../../utils/qd"; @@ -53,13 +53,17 @@ export default function BookIndex() { useEffect(() => { handle(); }, [bookInfo.id]); - setItems([]); - let vols: Volume[] = bookInfo.volumes; - if (bookStatus.chapterLists) { - vols = get_new_volumes(bookStatus.chapterLists, bookInfo.volumes, bookStatus.chapterShowMode); - } else if (bookStatus.chapterShowMode != ChapterShowMode.All) { - vols = []; - } + useEffect(() => { + setItems([]); + }, [setItems]); + const vols = useMemo(() => { + if (bookStatus.chapterLists) { + return get_new_volumes(bookStatus.chapterLists, bookInfo.volumes, bookStatus.chapterShowMode); + } else if (bookStatus.chapterShowMode != ChapterShowMode.All) { + return []; + } + return bookInfo.volumes; + }, [bookStatus.chapterLists, bookInfo.volumes, bookStatus.chapterShowMode]); return (
diff --git a/src/manage/qd/VolumesList.tsx b/src/manage/qd/VolumesList.tsx index 19d843f..1d9772b 100644 --- a/src/manage/qd/VolumesList.tsx +++ b/src/manage/qd/VolumesList.tsx @@ -5,7 +5,7 @@ import { Link } from "react-router"; import { CheckCircleOutlined } from "@ant-design/icons"; import OpenInNewTab from "../../../node_modules/@material-icons/svg/svg/open_in_new/twotone.svg"; import Icon from "../../components/Icon"; -import { useEffect, useMemo, useRef, useState } from "react"; +import { memo, useEffect, useMemo, useRef, useState } from "react"; import LocationSearchingTwotone from "../../../node_modules/@material-icons/svg/svg/location_searching/twotone.svg"; import { generateId } from "../../utils"; @@ -34,7 +34,7 @@ async function open_in_qidian(bookId: number, chapterId: number) { } } -export default function VolumesList({ volumes, bookId, oneLine, current, loc, locTip, setLoc }: VolumesListProps) { +export default memo(function VolumesList({ volumes, bookId, oneLine, current, loc, locTip, setLoc }: VolumesListProps) { const containerRef = useRef(null); const currentVolumeId = useMemo(() => { if (!current) return null; @@ -137,4 +137,4 @@ export default function VolumesList({ volumes, bookId, oneLine, current, loc, lo />
{current && } ); -} +})