| | |
| | | <template> |
| | | <div class="page-content"> |
| | | <chapterOne></chapterOne> |
| | | <!-- <chapterTwo></chapterTwo> |
| | | <chapterThree></chapterThree> |
| | | <chapterFour></chapterFour> |
| | | <chapterFive></chapterFive> |
| | | <chapterSix></chapterSix> |
| | | <chapterSeven></chapterSeven> |
| | | <chapterEight></chapterEight> |
| | | <chapterNine></chapterNine> |
| | | <chapterTen></chapterTen> |
| | | <chapterEleven></chapterEleven> |
| | | <chapterTwelve></chapterTwelve> |
| | | <chapterThirteen></chapterThirteen> --> |
| | | <div class="page-main" @scroll="throttledScrollHandler"> |
| | | <div class="page-content"> |
| | | <pageHeader v-if="showCatalogList.indexOf(0) > -1"></pageHeader> |
| | | <chapterOne v-if="showCatalogList.indexOf(1) > -1"></chapterOne> |
| | | <chapterTwo v-if="showCatalogList.indexOf(2) > -1"></chapterTwo> |
| | | <chapterThree v-if="showCatalogList.indexOf(3) > -1"></chapterThree> |
| | | <chapterFour v-if="showCatalogList.indexOf(4) > -1"></chapterFour> |
| | | <chapterFive v-if="showCatalogList.indexOf(5) > -1"></chapterFive> |
| | | <chapterSix v-if="showCatalogList.indexOf(6) > -1"></chapterSix> |
| | | <chapterSeven v-if="showCatalogList.indexOf(7) > -1"></chapterSeven> |
| | | <chapterEight v-if="showCatalogList.indexOf(8) > -1"></chapterEight> |
| | | <chapterNine v-if="showCatalogList.indexOf(9) > -1"></chapterNine> |
| | | <chapterTen v-if="showCatalogList.indexOf(10) > -1"></chapterTen> |
| | | <chapterEleven v-if="showCatalogList.indexOf(11) > -1"></chapterEleven> |
| | | <chapterTwelve v-if="showCatalogList.indexOf(12) > -1"></chapterTwelve> |
| | | <chapterThirteen |
| | | v-if="showCatalogList.indexOf(13) > -1" |
| | | ></chapterThirteen> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import pageHeader from "./components/header.vue"; |
| | | import chapterOne from "./components/chapter001.vue"; |
| | | import chapterTwo from "./components/chapter002.vue"; |
| | | import chapterThree from "./components/chapter003.vue"; |
| | |
| | | import chapterEleven from "./components/chapter011.vue"; |
| | | import chapterTwelve from "./components/chapter012.vue"; |
| | | import chapterThirteen from "./components/chapter013.vue"; |
| | | |
| | | |
| | | |
| | | import _ from "lodash"; |
| | | export default { |
| | | name: "temp-book", |
| | | data() { |
| | | return { |
| | | catalogLength: 13, // 总章节数 |
| | | showCatalogList: [], // 显示的章节 |
| | | loadThreshold: 300, // 触发加载阈值 |
| | | throttleThreshold: 100, // 节流阈值 |
| | | previousScrollTop: 0, |
| | | throttledScrollHandler: null |
| | | }; |
| | | }, |
| | | watch: { |
| | | showCatalogList: { |
| | | handler(newVal) { |
| | | console.log("显示章节", newVal); |
| | | if (this.$store.state.qiankun && this.$store.state.qiankun.catalogChange) { |
| | | // 调用父层方法 |
| | | this.$store.state.qiankun.catalogChange({ |
| | | showCatalogList: newVal |
| | | }); |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | mounted() { |
| | | // 默认加载章节 |
| | | this.showCatalogList = [0]; |
| | | // 滚动监听节流 |
| | | this.throttledScrollHandler = _.throttle( |
| | | this.scrollFun, |
| | | this.throttleThreshold, |
| | | { leading: true, trailing: false } |
| | | ); |
| | | // 提供页面跳转功能 |
| | | if (this.setGlobalState) { |
| | | console.log("setGlobalState"); |
| | | // 定义子层方法 |
| | | this.setGlobalState({ |
| | | gotoPage: (catalog, page) => { |
| | | console.log(catalog, page, "gotoPage:catalog, page"); |
| | | this.gotoPage(catalog, page); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | // 测试页面跳转 |
| | | // setTimeout(() => { |
| | | // this.gotoPage(5, 100); |
| | | // }, 3000); |
| | | }, |
| | | methods: { |
| | | scrollFun(e) { |
| | | // 判断向上滚动还是向下滚动 |
| | | if (event.target.scrollTop > this.previousScrollTop) { |
| | | const currentScrollTop = |
| | | event.target.scrollTop + event.target.offsetHeight; |
| | | if ( |
| | | currentScrollTop >= |
| | | event.target.scrollHeight - this.loadThreshold |
| | | ) { |
| | | // 到达阈值 |
| | | if ( |
| | | this.showCatalogList[this.showCatalogList.length - 1] < |
| | | this.catalogLength |
| | | ) { |
| | | // 加载下一章 |
| | | this.showCatalogList.push( |
| | | this.showCatalogList[this.showCatalogList.length - 1] + 1 |
| | | ); |
| | | if (this.showCatalogList.length > 3) { |
| | | // 超过三章隐藏顶部一章 |
| | | this.showCatalogList.shift(); |
| | | } |
| | | } |
| | | } |
| | | } else if (event.target.scrollTop < this.previousScrollTop) { |
| | | const currentScrollTop = event.target.scrollTop; |
| | | if (currentScrollTop <= this.loadThreshold) { |
| | | // 到达阈值 |
| | | if (this.showCatalogList[0] > 0) { |
| | | // 加载上一章 |
| | | this.showCatalogList.unshift(this.showCatalogList[0] - 1); |
| | | if (this.showCatalogList.length > 3) { |
| | | // 超过三章隐藏底部一章 |
| | | this.showCatalogList.pop(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | // showCatalogList 当前显示的三个章节,watch监听传递给主应用 |
| | | // console.log(this.showCatalogList); |
| | | // 更新上一次滚动的位置 |
| | | this.previousScrollTop = event.target.scrollTop; |
| | | |
| | | // 返回页码和章节信息 |
| | | if (this.$store.state.qiankun && this.$store.state.qiankun.pageChange) |
| | | this.$store.state.qiankun.pageChange({ |
| | | page: 100, |
| | | catalog: 5, |
| | | catalogId: "", |
| | | catalogName: "" |
| | | }); |
| | | }, |
| | | gotoPage(catalog, page) { |
| | | if (catalog >= 0 && catalog <= this.catalogLength) { |
| | | // 处理渲染章节 |
| | | if (catalog == 0) { |
| | | this.showCatalogList = [0, 1]; |
| | | } else if (catalog == this.catalogLength) { |
| | | this.showCatalogList = [ |
| | | this.catalogLength - 2, |
| | | this.catalogLength - 1, |
| | | this.catalogLength |
| | | ]; |
| | | } else { |
| | | this.showCatalogList = [catalog - 1, catalog, catalog + 1]; |
| | | } |
| | | setTimeout(() => { |
| | | // 跳转页码 |
| | | const pageDom = document.querySelector(`[page="${page}"]`); |
| | | if (pageDom) { |
| | | pageDom.scrollIntoView(); |
| | | } else { |
| | | console.log("页码错误!"); |
| | | } |
| | | }, 50); |
| | | } else { |
| | | console.log("章节错误!"); |
| | | } |
| | | } |
| | | }, |
| | | components: { |
| | | pageHeader, |
| | | chapterOne, |
| | | chapterTwo, |
| | | chapterThree, |
| | |
| | | chapterTen, |
| | | chapterEleven, |
| | | chapterTwelve, |
| | | chapterThirteen, |
| | | }, |
| | | methods: { |
| | | }, |
| | | chapterThirteen |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="less" scoped></style> |
| | | <style lang="less" scoped> |
| | | .page-main { |
| | | width: 100%; |
| | | height: 100%; |
| | | overflow: auto; |
| | | .page-content { |
| | | max-width: 816px; |
| | | min-width: 375px; |
| | | margin: 0 auto; |
| | | padding-bottom: 100px; |
| | | } |
| | | } |
| | | </style> |