vue练习创建小说阅读器
项目介绍
- 主要页面
1、首页home.vue分类展示书籍,幻灯片展示热门推荐
2、搜索search.vue,上拉加载更多
3、书籍详情book.vue加入书架、立即阅读,展示评论,同类书籍推荐
4、书籍内容read.vue,获取目录,存储翻阅的章节位置,
5、书架bookrack.vue,获取加入书架的书单 - 技术栈
vue、vue-cli、axios、vue-router、vuex、localStorege
app.vue入口页面
- 分成底部导航 跟 主视图容器
router-view
tabbar/Home为首页
- 包含: components/sub/item 和 components/sub/search 、components/sub/header
结构: banner切换 与 搜索 和 小说分类楼层
小说楼层单独定义了组件
components/sub/item
, home循环楼层分类名称,并将楼层分类id传给item组件:booklistId='{id:item._id}'
, item组件用props: ["booklistId"]
接收分类id, 并根据分类id获取对应的数据item.vue
1
2
3
4
5
6
7
8
9
10
11
12
13mouted:
this.getlist(this.booklistId.id);
methods:
getlist(id) {
//每个分类id下对应的数据 子组件接收父组件传过来的id 获取对应的数据
bootd(id).then(res => {
var arrdata = res.data.data;
arrdata.map(item => {
this.booklist.push(item.book);
});
});
}
components/book/Book.vue为小说详情页
- 包含: components/sub/yuedu 、mulu、pinglun、
- 结构: 小说概况与简介,是否加入书架或者继续阅读 ,目录、评论、同类书籍推荐
加入书架/立即阅读(yuedu.vue)组件
加入书架,获取书籍信息,并把相关书籍信息存放在书架中、存local
book.vue
1 | computed: { |
目录组件components/sub/mulu.vue
点击目录时,路由跳转进入read.vue
页面(小说详细章节),并且将默认目录显示出来,书籍id通过路由传给mulu.vue
book.vue
1 | <router-link :to="{name:'read',params:{id:this.books._id,showMulu:true}}" class="mulu" tag="p"> |
read.vue 包含mulu组件,默认目录隐藏,通过路由传参决定是否显示目录
1 | <mulu :id="id" @readShow='readshows' v-show="showMulu" @closeLayer='backGo()'></mulu> |
mulu.vue
1 | <li v-for="item in list" :key="item.id" @click='getMulu((item.order)-1)'>{{item.title}} <em style="color:red">{{item.isVip?'vip':null}}</em></li> |
pinglun.vue
评论组件(pinglun.vue),获取路由中的参数书籍id,在item.vue中<router-link tag='li' :to="{name:'book',params:{id:item._id}}">
路由跳转到详情,并将书籍id传给书籍详情
1 | created() { |
components/read/read.vue为小说章节详情
- 包含: components/sub/mulu 、
结构:上一章下一章,目录,章节内容
获取localstorege的书籍信息SHEFLBOOK中的(id),[book.vue存储了localstorege], 根据小说id获取【源–目录–内容】,点击目录进入章节详情,将点击的章节存入local,记住每次点击的章节位置,供后续阅读
read.vue
1 | //获取小说资源 每本小说有多个资源 根据小说id获取小说的来源 |
components/read/search.vue为小说搜索页
- 调用MUI的
mt-loadmore
功能,上拉加载更多,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21//获取搜索的书籍
getList() {
booksearch(this.keyword).then(res => {
if (res.data.ok) {
this.searchList = res.data.books.slice(0, 15); //默认展示前15条数据
}
});
},
// 上拉加载
loadBottom() {
this.allLoaded = true; //上滑时出现加载文字
booksearch(this.keyword).then(res=>{
if(this.searchList.length==res.data.books.length){
this.allLoaded = false
}else{
this.searchList = res.data.books.splice(0,this.count*15+15) //每次拉动时在现有基础上加15条 cout++
this.count++
this.allLoaded = false
}
})
},