|
|
- export default {
- computed: {
- currentProgress () {
- return this.pages[this.current]?.progress || 0
- },
- currentTitle () {
- return this.pages[this.current]?.title || this.title
- },
- currentTotal () {
- return this.pages[this.current]?.total || 0
- },
- currentPage () {
- return this.pages[this.current]?.current || 0
- }
- },
- methods: {
- //渲染页面
- scrollRender ({chapter, current, start = 0}) {
- if ( chapter ) {//如果传入章节内容
- const index = this.chapters.findIndex(c => c.index == chapter.index)//是否已经包含相同章节
- if (index > -1) this.chapters[index] = chapter//如果包含则更新
- else this.chapters.push(chapter)//否则添加新章节
- }
- current = parseInt(current || 0)//强制转换类型为int
- start = parseInt(start)//强制转换类型为int
- this.pages = [{index: current, type: 'loading'}]//显示loading
- this.current = 0//重置current
- const cgs = this.chapters.filter(c => c.index == current || c.index == current - 1 || c.index == current + 1)//筛选出符合条件的三个章节内容
- let index = 0, arr = []
- const computedId = this.getComputedId()
- this.computeds.push(computedId)
- const computedIndex = this.computeds.indexOf(computedId)
- this.$nextTick(function () {
- setTimeout(() => {
- const handle = () => {
- this.$refs.computed[computedIndex] && this.$refs.computed[computedIndex].start({
- chapter: cgs[index],
- success: pages => {
- arr = arr.concat(pages)
- if ( index < cgs.length - 1 ) {
- index++
- this.$nextTick(function () { handle() })
- } else {
- this.computeds.splice(computedIndex, 1)
- this.pages = this.handlePages(arr)
- const pageIndex = this.pages.findIndex(p => start >= p.start && start < p.end && p.index == current )//定位章节
- if ( pageIndex == -1 ) this.current = this.pages.findIndex(p => start >= p.end && p.index == current )//定位章节
- else this.current = pageIndex
- this.$nextTick(function () {
- this.$refs.scroll.resetRefresh()
- this.$refs.scroll.scrollToIndex(this.current)
- this.handleChange({current: this.current, detail: this.pages[this.current] })
- this.$nextTick(function () {
- this.autoplaySync = this.autoplay
- })
- })
- }
- }
- })
- }
- handle()
- }, 100)
- })
- },
- //翻页改变事件
- async handleScroll (e) {
- const scrollTop = e.detail.scrollTop
- const scrollHeight = e.detail.scrollHeight
- if ( !this.scrolling ) {
- try{
- this.scrolling = true
- const rate = Math.floor(scrollTop / this.contentHeight)
- let maybe = this.pages[rate] ? rate : this.pages.length-1
- let top = -1
- while ( top < 0 && maybe < this.pages.length - 1 ) {
- const itemRect = await this.$refs.scroll.getItemRect(maybe)
- top = itemRect.top
- top < 0 ? maybe++ : null
- }
- const current = top >= 0 ? maybe : this.pages.length - 1
- if ( current != this.current ) {
- this.handleChange({current: current, detail: this.pages[current]})
- this.$refs.footer && this.$refs.footer.refresh()
- }
- this.scrolling = false
- }catch(e){
- this.scrolling = false
- }
- }
- },
- //渲染下一章节
- handleScrollLoadRender (status, chapter, callback, isPrev) {
- if ( status == 'success' ) {//获取内容成功
- const nowIndex = isPrev ? this.pages[0].index : this.pages[this.pages.length-1].index
- const chapterIndex = this.chapters.findIndex(c => c.index == chapter.index)//是否已经包含相同章节
- if (chapterIndex > -1) this.chapters[chapterIndex] = chapter//如果包含则更新
- else this.chapters.push(chapter)//否则添加新章节
- const computedId = this.getComputedId()
- this.computeds.push(computedId)
- const computedIndex = this.computeds.indexOf(computedId)
- this.$nextTick(function () {
- setTimeout(() => {
- this.$refs.computed[computedIndex] && this.$refs.computed[computedIndex].start({
- chapter: chapter,
- success: p => {
- this.computeds.splice(computedIndex, 1)
- callback && callback( (chapter.isStart || chapter.isEnd) ? 'end' : status)//关闭加载动画
- const pages = isPrev ? p.concat(this.pages) : this.pages.concat(p)//添加新计算的章节内容
- this.pages = pages//渲染章节内容
- if ( isPrev ) {//如果是加载上一章节需要重新定位
- this.$nextTick(function () {
- this.current = pages.findIndex(page => page.index == nowIndex)//定位页面
- this.$refs.scroll.scrollToIndex(this.current)//刷新翻页组件
- })
- }
- this.chapterLoading = false//关闭章节加载等待
- }
- })
- }, 100)
- })
- } else {
- this.chapterLoading = false//关闭章节加载等待
- callback && callback(status)//关闭加载动画
- }
- }
- }
- }
|