闫增涛
2024-05-15 af32b4dea68d727f4f7fe3d594282931e973f430
src/books/childHealth/view/content/index.vue
@@ -1,20 +1,23 @@
<template>
  <div class="page-content">
    <pageHeader v-if="showCatalogList.indexOf(0) > -1"></pageHeader>
    <chapterOne v-if="showCatalogList.indexOf(1) > -1"></chapterOne>
    <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 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>
@@ -33,19 +36,138 @@
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: []
      catalogLength: 13, // 总章节数
      showCatalogList: [], // 显示的章节
      loadThreshold: 300, // 触发加载阈值
      throttleThreshold: 100, // 节流阈值
      previousScrollTop: 0,
      throttledScrollHandler: null
    };
  },
  mounted() {
    this.showCatalogList = [0];
  watch: {
    showCatalogList: {
      handler(newVal) {
        console.log("显示章节", newVal);
        if (this.$store.state.qiankun && this.$store.state.qiankun.catalogChange) {
          // 调用父层方法
          this.$store.state.qiankun.catalogChange({
            showCatalogList: newVal
          });
        }
      }
    }
  },
  methods: {},
  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,
@@ -65,4 +187,16 @@
};
</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>