Files
legado/modules/web/src/components/PopCatalog.vue
T

133 lines
3.2 KiB
Vue

<template>
<div
:class="{ 'cata-wrapper': true, visible: popCataVisible }"
:style="popupTheme"
>
<div class="title">目录</div>
<virtual-list
style="height: 300px; overflow: auto"
:class="{ night: isNight, day: !isNight }"
ref="virtualListRef"
data-key="index"
wrap-class="data-wrapper"
item-class="cata"
:data-sources="virtualListdata"
:data-component="CatalogItem"
:estimate-size="40"
:extra-props="{ gotoChapter, currentChapterIndex }"
/>
</div>
</template>
<script setup>
import VirtualList from "vue3-virtual-scroll-list";
import settings from "../config/themeConfig";
import "../assets/fonts/popfont.css";
import CatalogItem from "./CatalogItem.vue";
const store = useBookStore();
const { catalog, popCataVisible, miniInterface } = storeToRefs(store);
//主题
const isNight = computed(() => store.theme);
const theme = computed(() => store.theme);
const popupTheme = computed(() => {
return {
background: settings.themes[theme.value].popup,
};
});
//虚拟列表 数据源
const virtualListdata = computed(() => {
let catalogValue = catalog.value;
if (miniInterface.value) return catalogValue;
// pc端 virtualListIitem有2个章节
let length = Math.ceil(catalogValue.length / 2);
let virtualListDataSource = new Array(length);
let i = 0;
while (i < length) {
virtualListDataSource[i] = {
index: i,
catas: catalogValue.slice(2 * i, 2 * i + 2),
};
i++;
}
return virtualListDataSource;
});
//打开目录 计算当前章节对应的虚拟列表位置
const virtualListRef = ref();
const currentChapterIndex = computed({
get: () => store.readingBook.index,
set: (value) => (store.readingBook.index = value),
});
const virtualListIndex = computed(() => {
let index = currentChapterIndex.value;
if (miniInterface.value) return index;
// pc端 virtualListIitem有2个章节
return Math.floor(index / 2);
});
onUpdated(() => {
// dom更新触发ResizeObserver,更新虚拟列表内部的sizes Map
if (!popCataVisible.value) return;
virtualListRef.value.scrollToIndex(virtualListIndex.value);
});
// 点击加载对应章节内容
const emit = defineEmits(["getContent"]);
const gotoChapter = (note) => {
const chapterIndex = catalog.value.indexOf(note);
currentChapterIndex.value = chapterIndex;
store.setPopCataVisible(false);
store.setContentLoading(true);
store.saveBookProgress();
emit("getContent", chapterIndex);
};
</script>
<style lang="scss" scoped>
.cata-wrapper {
margin: -16px;
padding: 18px 0 24px 25px;
// background: #ede7da url('../assets/imgs/themes/popup_1.png') repeat;
.title {
font-size: 18px;
font-weight: 400;
font-family: FZZCYSK;
margin: 0 0 20px 0;
color: #ed4259;
width: fit-content;
border-bottom: 1px solid #ed4259;
}
:deep(.data-wrapper) {
.cata {
//width: 50%;
height: 40px;
cursor: pointer;
font:
16px / 40px PingFangSC-Regular,
HelveticaNeue-Light,
"Helvetica Neue Light",
"Microsoft YaHei",
sans-serif;
}
}
.night {
:deep(.cata) {
border-bottom: 1px solid #666;
}
}
.day {
:deep(.cata) {
border-bottom: 1px solid #f2f2f2;
}
}
}
</style>