基于vue2.0的一个豆瓣电影App
1、搭建项目框架
使用vue-cli 没安装的需要先安装
使用vue-cli生成项目框架
接着 进入项目目录
然后安装项目依赖包
2、安装需要的依赖包
该项目需要用到vue-router bootstrap
<link rel="stylesheet" href="/node_modules/bootstrap/dist/css/bootstrap.css">
<link rel="stylesheet" href="http://v3.bootcss.com/examples/dashboard/dashboard.css">
3、编写代码
App.vue
<template>
<div id="app">
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false"
aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">基于Vue2.0的一个豆瓣电影App</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<form class="navbar-form navbar-right">
<input type="text" class="form-control" placeholder="Search...">
</form>
</div>
</div>
</nav>
<div class="container-fluid">
<div class="row">
<div class="col-sm-3 col-md-2 sidebar">
<ul class="nav nav-sidebar">
<li class="active" v-focus="{server:currentRoute}">
<router-link to="/in_theaters/0">正在热映</router-link>
</li>
<li v-focus="{server:currentRoute}">
<router-link to="/coming_soon/0">即将上映</router-link>
</li>
<li v-focus="{server:currentRoute}">
<router-link to="/top250/0">Top</router-link>
</li>
</ul>
</div>
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
<router-view></router-view>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import jsonp from './js/jsonp.js'
import config from './js/config.js'
export default {
name: 'app',
data() {
return {
currentRoute: '',
search: ''
}
},
created() {
this.request();
},
methods: {
request() {
var server = this.$route.params.server;
this.currentRoute = server;
},
data: {
jsondata: {}
},
Search() {
this.$router.push({ path: '/search/0?t=' + this.search, params: { t: this.search } });
}
},
watch: {
'$route': 'request'
}
}
然后在src目录下新建一个components文件夹
<template>
<div>
<h1 class="page-header">{{jsondata.title}}</h1>
<ul class="list-group">
<li class="list-group-item" v-for="(item,index) in jsondata.subjects">
<span class="badge">{{item.rating.average}}</span>
<div class="media-left">
<router-link :to="{path:'/detail/'+item.id}">
<img class="media-object" :src="item.images.small" alt="">
</router-link>
</div>
<div class="media-body">
<h3 class="media-heading">{{item.title}}</h3>
<p>
<span>类型:</span><span>{{item.genres.join('、')}}</span>
</p>
<p>
<span>导演:</span> <span v-for="(val,index) in item.casts">{{val.name + (index==item.casts.length-1?'':'、')}}</span>
</p>
</div>
</li>
</ul>
<div id="layear" v-show="!show">
<p>当前第{{parseInt(currentPage) +1}}页、共 {{countPage}}页</p>
<nav>
<ul class="pager">
<li :class="{disabled:currentPage<=0}">
<router-link :to="{path:'/'+server+'/'+ (currentPage<=0?0:(parseInt(currentPage)-1))}">上一页</router-link>
</li>
<li :class="{disabled:currentPage>=countPage}">
<router-link :to="{path:'/'+server+'/'+(parseInt(currentPage) + parseInt(1))}">下一页</router-link>
</li>
</ul>
</nav>
</div>
<div class="spinner" v-show="show">
<div class="double-bounce1"></div>
<div class="double-bounce2"></div>
</div> </div>
</template>
<script>
import Vue from 'vue'
import jsonp from '../js/jsonp.js'
import config from '../js/config.js'
export default {
created() {
this.request();
},
data() {
return {
currentPage: 0,
jsondata: {},
countPage: 0,
server: '',
show: 'true'
}
},
methods: {
request() {
this.show = true;
var server = this.$route.params.server;
this.server = server;
this.currentPage = this.$route.params.page;
var count = 10;
jsonp(config.apiServer + server, { count: count, start: this.currentPage * count, q: this.$route.query.t }, function (data) {
this.jsondata = data;
this.countPage = Math.ceil(this.jsondata.total / this.jsondata.count);
this.show = false;
}.bind(this))
}
},
watch: {
'$route.path': 'request',
'$route.params':'request'
}
} </script>
<style scoped>
.spinner {
width: 60px;
height: 60px;
margin: 100px auto;
position: fixed;
left: 0;
right: 0;
top: 0;
bottom: 0;
} .double-bounce1,
.double-bounce2 {
width: 100%;
height: 100%;
border-radius: 50%;
background-color: #67CF22;
opacity: 0.6;
position: absolute;
top: 0;
left: 0; -webkit-animation: bounce 2.0s infinite ease-in-out;
animation: bounce 2.0s infinite ease-in-out;
} .double-bounce2 {
-webkit-animation-delay: -1.0s;
animation-delay: -1.0s;
} @-webkit-keyframes bounce {
0%,
100% {
-webkit-transform: scale(0.0)
}
50% {
-webkit-transform: scale(1.0)
}
} @keyframes bounce {
0%,
100% {
transform: scale(0.0);
-webkit-transform: scale(0.0);
}
50% {
transform: scale(1.0);
-webkit-transform: scale(1.0);
}
}
</style>
接着在src目录下创建js文件夹 存放js文件
var jsonp = function (url, data, callback) {
var cbFuncName = 'jsonp_fun' + Math.random().toString().replace('.', '');
window[cbFuncName] = callback;
var queryString = url.indexOf('?') == -1 ? '?' : '&';
for (var key in data) {
queryString += key + '=' + data[key] + '&';
}
queryString += 'callback=' + cbFuncName;
var script = document.createElement('script');
script.src = url + queryString;
document.body.appendChild(script);
}
export default jsonp
在新建一个config.js 用来存放一些配置信息
const apiServer = 'https://api.douban.com/v2/movie/';
export default { apiServer }
接着在新建一个focus.js 用来左边导航栏获取焦点
import Vue from 'vue'
var focus = {};
focus.install = function () {
Vue.directive('focus', function (el, binding) {
var server = binding.value.server;
var aLink = el.children[0].href;
var link = /^((http)?:\/\/)[\w]+:+[\d]+\/\W+([\w]+)?\/\w/;
var val = (aLink.match(link))[3];
el.className = '';
if (val == server) {
el.className = 'active';
}
})
}
export default focus;
然后来到main.js中 引用vue-router 和引用刚才的focus.js和配置vue-router
import Vue from 'vue'
import App from './App.vue'
import VueRouter from 'vue-router'
import movielist from './components/movielist.vue'
import focus from './js/focus' Vue.use(VueRouter)
Vue.use(focus)
var routes = [{
path: '/:server/:page', component: movielist
},
{ path: '*', redirect:'/in_theaters/0' }]
var router = new VueRouter({
routes
})
new Vue({
el: '#app',
router,
render: h => h(App)
})
到这边页面基本成型了
公众号
欢迎关注我的公众号“码上开发”,每天分享最新技术资讯。关注获取最新资源
基于vue2.0的一个豆瓣电影App的更多相关文章
- 基于Bootstrap+angular的一个豆瓣电影app
1.搭建项目框架 npm初始化项目 npm init -y //按默认配置初始化项目 安装需要的第三方库 npm install bootstrap angular angular-route --s ...
- 基于vue2.0的一个系统
前言 这是一个用vue做的单页面管理系统,这里只是介绍架子搭建思路 前端架构 沿用Vue全家桶系列开发,主要技术栈:vue2.x+vue-router+vuex+element-ui1.x+axios ...
- 基于vue2.0的一个分页组件
分页组件在项目中经常要用到之前一直都是在网上找些jq的控件来用(逃..),最近几个项目用上vue了项目又刚好需要一个分页的功能.于是百度发现几篇文章介绍的实在方式有点复杂, 没耐心看自己动手造轮子写了 ...
- 基于vue2.0的在线电影APP,
基于vue2.0构建的在线电影网[film],webpack + vue + vuex + vue-loader + keepAlive + muse-ui + cordova 全家桶,cordova ...
- 基于vue2.0的分页组件开发
今天安排的任务是写基于vue2.0的分页组件,好吧,我一开始是觉得超级简单的,但是越写越写不出来,写的最后乱七八糟的都不知道下句该写什么了,所以重新捋了思路,小结一下- 首先写组件需要考虑: 要从父组 ...
- 基于vue2.0打造移动商城页面实践 vue实现商城购物车功能 基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
基于vue2.0打造移动商城页面实践 地址:https://www.jianshu.com/p/2129bc4d40e9 vue实现商城购物车功能 地址:http://www.jb51.net/art ...
- 基于vue2.0前端组件库element中 el-form表单 自定义验证填坑
eleme写的基于vue2.0的前端组件库: http://element.eleme.io 我在平时使用过程中,遇到的问题. 自定义表单验证出坑: 1: validate/resetFields 未 ...
- vue-swiper 基于Vue2.0开发 轻量、高性能轮播插件
vue-swiper 基于 Vue2.0 开发,基本满足大部分功能 轻量.高性能轮播插件.目前支持 无缝衔接自动轮播.无限轮播.手势轮播 没有引入第三方库,原生 js 封装,打包之后只有 8.2KB ...
- 基于mykernel2.0编写一个操作系统内核
基于mykernel2.0编写一个操作系统内核 一. 实验准备 详细要求 基于mykernel 2.0编写一个操作系统内核 按照https://github.com/mengning/mykernel ...
随机推荐
- 【注意事项】APP左右横滑设计
移动端屏幕越来越大,但用户对内容量的要求也水涨船高.如何在有限的屏幕内透出更多的内容,是设计师们研究的重点. 常用的内容拓展设计有:Y 方向 List 滑动.Z 方向 3D Touch .入口式内容折 ...
- kafka 0.10.2 消息消费者
package cn.xiaojf.kafka.consumer; import org.apache.kafka.clients.consumer.ConsumerConfig; import or ...
- NodeJS在线聊天室(NodeJS & SocketIO & Express & EJS & MongoDB & Gulp)
项目背景 这个项目主要是为了玩玩NodeJS,项目的方向大概是做出类似QQ的在线聊天系统.想要在线体验可以点击在线演示. 项目使用PM2进行部署和管理,功能在不断的迭代开发中.如果你觉得这个项目比较有 ...
- qrcode生成二维码插件
今天我要和大家分享的是利用qrcode来生成二维码. 首先要使用qrcode就需要引用文件,我这边用的是1.7.2版本的jquery加上qrcode <script type="tex ...
- 全景智慧城市常诚——没接触过VR全景的你就是目前VR最大的新闻
据调查,自2015年开始,VR(虚拟现实)技术在传媒行业中的应用呈现井喷式增长,各大国际主流媒体纷纷在新闻报道中使用VR技术.国内运用VR报道新闻最早在2015年12月,财新网利用VR技术对深圳山体垮 ...
- Asp.Net Core轻量级Aop解决方案:AspectCore
什么是AspectCore Project ? AspectCore Project 是适用于Asp.Net Core 平台的轻量级 Aop(Aspect-oriented programming) ...
- 一起学习java
一.Servlet学习 下面是Servlet一个整体的继承结构 首先说一下Servlet这个接口这个主要包含的有init,service,destroy等方法,这里主要介绍这3个 ...
- bootstrap 架构知识点
.col-md-pull-2 向右相对定位偏移量 .col-md-push-2 向左相对定位偏移量 .pull-left 左浮动 .pull-right 右浮动 改变大小写 通过这几个类可以改 ...
- sqlmap用户手册 [详细]
当给sqlmap这么一个url的时候,它会: 1.判断可注入的参数 2.判断可以用那种SQL注入技术来注入 3.识别出哪种数据库 4.根据用户选择,读取哪些数据 sqlmap支持五种不同的注入模式: ...
- Leetcode 494 Target Sum 动态规划 背包+滚动数据
这是一道水题,作为没有货的水货楼主如是说. 题意:已知一个数组nums {a1,a2,a3,.....,an}(其中0<ai <=1000(1<=k<=n, n<=20) ...