YM
2024-05-29 fa128e06eca9b6b04ecacde97f86a1d219b05594
src/books/lifeCare/index.vue
@@ -1,4 +1,3 @@
<!-- eslint-disable vue/multi-word-component-names -->
<template>
  <div class="page-main" @scroll="throttledScrollHandler">
    <div
@@ -7,27 +6,28 @@
      :style="{
        fontSize: fontSize ? fontSize + 'px' : '16px',
        transform: `scale(${pageZoom ? pageZoom : 1})`,
        transformOrigin: 'center top'
      }"
    >
      <front001 v-if="showCatalogList.indexOf(1) > -1" />
      <ChapterOne v-if="showCatalogList.indexOf(2) > -1" />
      <ChapterTwo v-if="showCatalogList.indexOf(3) > -1" />
      <ChapterThree v-if="showCatalogList.indexOf(4) > -1" />
      <ChapterFour v-if="showCatalogList.indexOf(5) > -1" />
      <ChapterFive v-if="showCatalogList.indexOf(6) > -1" />
      <chapterSix v-if="showCatalogList.indexOf(7) > -1" />
      <chapterSeven v-if="showCatalogList.indexOf(8) > -1" />
      <chapterEight v-if="showCatalogList.indexOf(9) > -1" />
      <chapterNine v-if="showCatalogList.indexOf(10) > -1" />
      <chapter010 v-if="showCatalogList.indexOf(11) > -1" />
      <chapter011 v-if="showCatalogList.indexOf(12) > -1" />
      <chapter012 v-if="showCatalogList.indexOf(13) > -1" />
      <chapter013 v-if="showCatalogList.indexOf(14) > -1" />
      <chapter014 v-if="showCatalogList.indexOf(15) > -1" />
      <chapter015 v-if="showCatalogList.indexOf(16) > -1" />
      <chapter016 v-if="showCatalogList.indexOf(17) > -1" />
      <chapter017 v-if="showCatalogList.indexOf(18) > -1" />
      <chapter018 v-if="showCatalogList.indexOf(19) > -1" />
    <front001 v-if="showCatalogList.indexOf(1) > -1" :showPageList="loadPageList" />
      <ChapterOne v-if="showCatalogList.indexOf(2) > -1" :showPageList="loadPageList" :questionData="questionData"/>
      <ChapterTwo v-if="showCatalogList.indexOf(3) > -1" :showPageList="loadPageList" :questionData="questionData"/>
      <ChapterThree v-if="showCatalogList.indexOf(4) > -1"  :showPageList="loadPageList" :questionData="questionData"/>
      <ChapterFour v-if="showCatalogList.indexOf(5) > -1"  :showPageList="loadPageList" :questionData="questionData"/>
      <ChapterFive v-if="showCatalogList.indexOf(6) > -1"  :showPageList="loadPageList" :questionData="questionData"/>
      <chapterSix v-if="showCatalogList.indexOf(7) > -1"  :showPageList="loadPageList" :questionData="questionData"/>
      <chapterSeven v-if="showCatalogList.indexOf(8) > -1"  :showPageList="loadPageList" :questionData="questionData"/>
      <chapterEight v-if="showCatalogList.indexOf(9) > -1"  :showPageList="loadPageList" :questionData="questionData"/>
      <chapterNine v-if="showCatalogList.indexOf(10) > -1"  :showPageList="loadPageList" :questionData="questionData"/>
      <chapter010 v-if="showCatalogList.indexOf(11) > -1"  :showPageList="loadPageList" />
      <chapter011 v-if="showCatalogList.indexOf(12) > -1"  :showPageList="loadPageList" />
      <chapter012 v-if="showCatalogList.indexOf(13) > -1"  :showPageList="loadPageList" />
      <chapter013 v-if="showCatalogList.indexOf(14) > -1"  :showPageList="loadPageList" />
      <chapter014 v-if="showCatalogList.indexOf(15) > -1"  :showPageList="loadPageList" />
      <chapter015 v-if="showCatalogList.indexOf(16) > -1"  :showPageList="loadPageList" />
      <chapter016 v-if="showCatalogList.indexOf(17) > -1"  :showPageList="loadPageList" />
      <chapter017 v-if="showCatalogList.indexOf(18) > -1"  :showPageList="loadPageList" />
      <chapter018 v-if="showCatalogList.indexOf(19) > -1"  :showPageList="loadPageList" />
    </div>
  </div>
</template>
@@ -54,21 +54,38 @@
import chapter018 from "./view/chapter018";
import NoteIcon from "@/assets/images/biji.png";
import _ from "lodash";
import getQuestionList from "@/assets/methods/examination";
import testData from "./js/examinationList";
export default {
  data() {
    return {
      catalogLength: 18, // 总章节数
      catalogLength: 19, // 总章节数
      showCatalogList: [], // 显示的章节
      loadThreshold: 300, // 触发加载阈值
      throttleThreshold: 100, // 节流阈值
      previousScrollTop: 0,
      throttledScrollHandler: null,
      observer: null,
      loadPageObserver: null,
      loadPageList: [],
      questionData: {}
    };
  },
  computed: {
    fontSize() {
      return this.$store.state.qiankun.fontSize;
    },
    pageZoom() {
      return this.$store.state.qiankun.scale / 100;
    }
  },
  provide() {
    return {
      changeQuestionData: this.changeQuestionData
    };
  },
  watch: {
    showCatalogList: {
      // eslint-disable-next-line no-unused-vars
      handler(newVal, oldVal) {
        if (
          this.$store.state.qiankun &&
@@ -76,7 +93,7 @@
        ) {
          // 调用父层方法
          this.$store.state.qiankun.catalogChange({
            showCatalogList: newVal,
            showCatalogList: newVal
          });
        }
        // 启动页码观察
@@ -84,12 +101,12 @@
          this.initObservation();
          this.initThemeColor();
        }, 500);
      },
    },
      }
    }
  },
  mounted() {
    // 默认加载章节
    this.showCatalogList = [1];
    this.showCatalogList = [11];
    // 滚动监听节流
    this.throttledScrollHandler = _.throttle(
      this.scrollFun,
@@ -110,7 +127,7 @@
        // 删除笔记、高亮、划线
        delSign: (data) => {
          this.delSign(data);
        },
        }
      });
    }
@@ -119,7 +136,13 @@
    this.observer = new IntersectionObserver(this.pageChangeCallback, {
      root: null, // 指定根元素,这里设为 null,表示选取整个视窗作为根元素。
      rootMargin: "0px", // 指定根元素的边界,这里设为 "0px",表示根元素的边界和视窗的边界重合
      threshold: 0.5, // 指定交叉比例,这里设为 0.5,表示当目标元素一半或更多显示在视窗中时触发回调函数。
      threshold: 0.5 // 指定交叉比例,这里设为 0.5,表示当目标元素一半或更多显示在视窗中时触发回调函数。
    });
    this.loadPageObserver = new IntersectionObserver(this.loadPageCallback, {
      root: null, // 指定根元素,这里设为 null,表示选取整个视窗作为根元素。
      rootMargin: "0px", // 指定根元素的边界,这里设为 "0px",表示根元素的边界和视窗的边界重合
      threshold: 0 // 指定交叉比例,这里设为 0.5,表示当目标元素一半或更多显示在视窗中时触发回调函数。
    });
    // 启动页码观察
@@ -146,35 +169,6 @@
    //     }, 2000);
    //   }, 1000);
    // }, 3000);
  },
  components: {
    front001,
    ChapterOne,
    ChapterTwo,
    ChapterThree,
    ChapterFour,
    ChapterFive,
    chapterSix,
    chapterSeven,
    chapterEight,
    chapterNine,
    chapter010,
    chapter011,
    chapter012,
    chapter013,
    chapter014,
    chapter015,
    chapter016,
    chapter017,
    chapter018,
  },
  computed: {
    fontSize() {
      return this.$store.state.qiankun.fontSize;
    },
    pageZoom() {
      return this.$store.state.qiankun.scale / 100;
    },
  },
  methods: {
    getParentWithClass(element, className) {
@@ -228,7 +222,6 @@
        }
      }
    },
    // 滚动监听
    scrollFun(event) {
      // 判断向上滚动还是向下滚动
@@ -236,7 +229,6 @@
        // 向下
        const currentScrollTop =
          event.target.scrollTop + event.target.offsetHeight;
        if (
          currentScrollTop >=
          event.target.scrollHeight - this.loadThreshold
@@ -285,7 +277,7 @@
          this.showCatalogList = [
            this.catalogLength - 2,
            this.catalogLength - 1,
            this.catalogLength,
            this.catalogLength
          ];
        } else {
          this.showCatalogList = [catalog - 1, catalog, catalog + 1];
@@ -336,7 +328,7 @@
            // 笔记
            pageDom.innerHTML = pageDom.innerHTML.replace(
              reg,
              `<span datatype="Note" dataid="${data.id}" style="border-bottom-color:${data.color}" class="notesline" onclick="signClick('Note','${data.id}','${data.chapterNum}')" onmouseover="noteHover('Note','${data.id}','${data.chapterNum}')">${data.txt}<img src="${NoteIcon}" style="cursor: pointer" /></span>`
              `<span datatype="Note" dataid="${data.id}" style="border-bottom-color:${data.color}" class="notesline" onclick="signClick('Note','${data.id}','${data.chapterNum}')" onmouseover="noteHover('Note','${data.id}','${data.chapterNum}')" onmouseout="noteOut">${data.txt}<img src="${NoteIcon}"/></span>`
            );
            break;
        }
@@ -374,11 +366,26 @@
        this.container ? this.container : document
      ).querySelectorAll(".page-box");
      sections.forEach((section) => {
        if (this.config.activeBook && this.config.activeBook.tryPageCount) {
          const page = section.getAttribute("page");
          if (Number(page) > this.config.activeBook.tryPageCount) {
            let chapterDom = this.getParentWithClass(section, "chapter");
            const chapterNum = chapterDom.getAttribute("num");
            this.catalogLength = Number(chapterNum) - 1;
            section.remove();
            return false;
          }
        }
        //observer 观察每个元素,以便在它们进入或离开视窗时触发回调函数。
        const isObserver = section.getAttribute("observer");
        const isLoadObserver = section.getAttribute("loadObserver");
        if (!isObserver) {
          this.observer.observe(section);
          section.setAttribute("observer", "1");
        }
        if (!isLoadObserver) {
          this.loadPageObserver.observe(section);
          section.setAttribute("loadObserver", "1");
        }
      });
    },
@@ -461,7 +468,6 @@
        }
      });
    },
    // eslint-disable-next-line
    getParentWithClass(element, className) {
      while (element.parentElement) {
        element = element.parentElement;
@@ -470,7 +476,6 @@
        }
      }
    },
    // eslint-disable-next-line no-unused-vars
    pageChangeCallback(entries, observer) {
      //entries:代表观察到的目标元素的集合。 observer:代表观察者对象。
      entries.forEach((entry) => {
@@ -484,11 +489,12 @@
            "chapter"
          );
          const catalog = catalogDom.getAttribute("num");
          console.log(page, "page", catalog, "catalog");
          // 返回页码和章节信息
          if (this.$store.state.qiankun && this.$store.state.qiankun.pageChange)
            this.$store.state.qiankun.pageChange({
              page: page,
              catalog: catalog,
              catalog: catalog
            });
          // const sections = Array.from(document.querySelectorAll(".section"));
          //sections:获取所有具有 .section 类名的元素,并转换为数组。
@@ -497,6 +503,74 @@
        }
      });
    },
    loadPageCallback(entries, observer) {
      entries.forEach(async (entry) => {
        if (entry.isIntersecting) {
          const target = entry.target;
          const page = target.getAttribute("page");
          if (this.loadPageList.indexOf(page) == -1) {
            //
            const catalogDom = this.tool.getParentNodeByClassName(
              target,
              "chapter"
            );
            const catalog = catalogDom.getAttribute("num");
            if (!this.questionData[page]) {
              if (testData && testData[catalog]) {
                if (testData[catalog][page]) {
                  if (Array.isArray(testData[catalog][page])) {
                    this.questionData[page] = await getQuestionList(
                      [],
                      testData[catalog][page],
                      this.config.activeBook
                    );
                  } else {
                    const obj = {};
                    for (let key in testData[catalog][page]) {
                      obj[key] = await getQuestionList(
                        [],
                        testData[catalog][page][key],
                        this.config.activeBook
                      );
                    }
                    this.questionData[page] = obj;
                  }
                }
              }
            }
            this.loadPageList.push(Number(page));
            if (this.loadPageList.length > 5) {
              // 超过5页
              this.loadPageList.shift();
            }
          }
        }
      });
    },
    changeQuestionData(page, data) {
      this.$props.questionData[page] = data;
    }
  },
  components: {
    front001,
    ChapterOne,
    ChapterTwo,
    ChapterThree,
    ChapterFour,
    ChapterFive,
    chapterSix,
    chapterSeven,
    chapterEight,
    chapterNine,
    chapter010,
    chapter011,
    chapter012,
    chapter013,
    chapter014,
    chapter015,
    chapter016,
    chapter017,
    chapter018,
  }
};
</script>