动态路由 及电子书渲染实现--项目实际开发记录(二)

第一步

清空src/components目录,并创建ebook文件夹,且在里面创建EbookReader.vue文件来接受动态路由

第二步

修改router.js

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      redirect: '/ebook',
    },
    {
      path: '/ebook',
      component: () => import('./views/ebook/index.vue'),
      children: [
        {
          path: ':fileName',
          component: () => import('./components/ebook/EbookReader.vue')
        }
      ]
    }
  ]
})

第三步

index.vue中引用EbookReader组件

<template>
    <div class="ebook">
        <ebook-reader/>
    </div>
</template>

<script>
import EbookReader from '../../components/ebook/EbookReader'
export default {
    components: {
        EbookReader
    }
}
</script>

<style lang="scss" scoped="scoped">
    @import "../../assets/styles/global"
</style>

EbookReader组件

<template>
    <div class="ebook-reader">
        {{$route.params.fileName}}
    </div>
</template>

<script>
</script>

<style>
</style>

第四步

根据动态路由显示不同的书,并可以通过nginx地址下载
EbookReader组件

<template>
    <div class="ebook-reader">
        <div id="read"></div>
    </div>
</template>

<script>
    export default {
        mounted() {
            //nginx文件的路径
            const baseUrl = 'http://192.168.0.101:8081/epub/'
            const fileName = this.$route.params.fileName.split('|').join('/');
            console.log(`${baseUrl}${fileName}.epub`)
        }
    }
</script>

<style>
</style>

地址栏中添加对应的电子书路径
动态路由 及电子书渲染实现--项目实际开发记录(二)
点击地址下载对应的电子书
动态路由 及电子书渲染实现--项目实际开发记录(二)

第五步

EbookReader组件中引入epubjs进行电子书渲染,由于fileName好多组件公用我们使用vuex来进行管理

EbookReader组件

<template>
    <div class="ebook-reader">
        <div id="read"></div>
    </div>
</template>

<script>
    import { mapGetters } from 'vuex'
    import Epub from 'epubjs'
    global.ePub = Epub
    export default {
        computed: {
            ...mapGetters(['fileName'])
        },
        methods: {
          initEpub() {
            //nginx文件的路径
            const url = 'http://192.168.0.101:8081/epub/'+this.fileName+'.epub';  
            // console.log(url)
            this.book = new Epub(url);
            // console.log(this.book)
            this.rendition = this.book.renderTo('read',{
                width: innerWidth,
                height: innerHeight,
                // 做微信的兼容性配置
                method: 'default'
            })
            this.rendition.display();
          }  
        },
        mounted() {
            const fileName = this.$route.params.fileName.split('|').join('/');
            this.$store.dispatch('setFileName',fileName).then(()=>{
                this.initEpub();
            })
        }
    }
</script>

<style>
</style>

store/modules/book.js

const book = {
    state: {
      fileName: ''
    },
    mutations: {
      'SET_FILENAME': (state,fileName)=>{
        state.fileName = fileName
      }
    },
    actions: {
      //commit参数用来调用mutations方法,state用来获取原先得值
      setFileName: ({commit},fileName)=>{
        // 修改fileName得值,必须用return,这样我们可以用then链式操作
        return commit('SET_FILENAME',fileName)
      }
    }
}
export default book

store/getter.js

const book = {
    fileName: state => state.book.fileName
}
export default book