1. 程式人生 > >基於vue2.0的一個豆瓣電影App

基於vue2.0的一個豆瓣電影App

即將 tle count webp bad string random current strong

1、搭建項目框架

使用vue-cli 沒安裝的需要先安裝

npm intall -g vue-cli

使用vue-cli生成項目框架

vue init webpack-simple vue-movie 然後一路回車

接著 進入項目目錄

cd vue-movie

然後安裝項目依賴包

cnpm install 沒安裝cnpm的先執行這個命令 npm install -g cnpm --registry=https://registry.npm.taobao.org 接著 npm run dev 技術分享 看到這個界面 說明前面沒啥問題了

2、安裝需要的依賴包

該項目需要用到vue-router bootstrap

所以先安裝這兩個包 cnpm install vue-router bootstrap -D 然後在 index.html 頁面引用下boostrap.css和另一個需要用到的css文件
 <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

來到src目錄下的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 } }
</script>


然後在src目錄下新建一個components文件夾

在該文件夾下創建一個movielist.vue 添加以下代碼
<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文件

新建一個jsonp.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)
})

到這邊頁面基本成型了

回到命令行 繼續執行該命令 npm run dev 技術分享

項目源碼已經分享到github上 https://github.com/qq729533020/vue-movie 歡迎Star

基於vue2.0的一個豆瓣電影App