Vue学习笔记实战篇——音乐播放器 · 整体布局

本文为转载,原文:Vue学习笔记实战篇——音乐播放器 · 整体布局

创建项目

使用vue-cli脚手架工具在自己指定的目录创建项目chain-vue-music,命令如下:

vue init webpack chain-vue-music

创建成功后,执行以下命令,安装依赖

cd chain-vue-music
npm install

各种依赖成功安装后,再根据我们的需求安装vue插件,这里我暂时先安装vuex, vue-router, vue-resource, mint-ui,命令如下:

npm install vuex --save
npm install vue-router --save
npm install vue-resource --save
npm install mint-ui --save

以上全部安装成功后,我们可以执行以下命令,看下我们最初的项目:

npm run dev

结果如下:


项目布局

用编译器打开我们创建的项目,我们在src中创建以下目录:

  1. pages : 用于存放我们的页面组件
  1. router : 用于我们书写前端路由
  2. store : 用处存放我的store,在该文件夹内再新建 mudules文件夹,用来存放各模块的store
  3. components : 是已经存在的目录,我们把里面的Hello.vue文件删除,该目录用于存放公用组件

布局代码

index.html

在根目录的index.html文件中引入font-awesome:

<link href="http://cdn.bootcss.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet">

我们的项目中将会使用部分的font-awesome的icon图标。

router

这里暂时先添加项目中的3个主要页面的路由,以后有需求再补充。

import Vue from 'vue'
import Router from 'vue-router'
import MyCollect from '@/pages/MyCollect'
import RankList from '@/pages/RankList'
import Search from '@/pages/Search'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path:'/',
      name:'my-collect',
      component:MyCollect
    },
    {
      path:'/rank-list',
      name:'rank-list',
      component:RankList
    },
    {
      path:'/search',
      name:'search',
      component:Search
    }
  ]
})

代码中引用的3个组件,会在下面详细描述。

store

之前的需求我们提到了我们的个人信息页面,是点击头部的相关位置从左侧滑动出来的,然后在个人页面中,再点击某个部位再滑出去。所以我们需要一个全局的状态来记录这个页面是否展示。我们在storemodules目录下创建personal.js 模块用来处理个人信息。
目前先处理页面是否展示状态,以及显示界面和隐藏界面的的mutation其他的后面有需求再补充。代码如下:

const state = {
    isMenuShow:false
}

const mutations = {
    hideMenu(state){
        state.isMenuShow = false;
    },
    showMenu(state){
        state.isMenuShow = true;
    }
}

export default({
    state,
    mutations
})

这个子模块建立好之后,我们自然需要引用他。所以,在store目录下创建index.js文件用来组装store并导出。index.js代码如下:

import Vue from 'vue'
import Vuex from 'vuex'
import personal from './modules/personal'

Vue.use(Vuex)

export default new Vuex.Store({
    modules:{
        personal
    }
})

main.js

至此,我们的routerstore都建立好了。接下来就是在main.js中引用了, 以及对mint-ui的引用:

import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store/index'
import Mint from 'mint-ui'
import 'mint-ui/lib/style.css'

Vue.use(Mint)

Vue.config.productionTip = false

new Vue({
  el: '#app',
  store,
  router,
  template: '<App/>',
  components: { App }
})

conpoments

之前的需求中提到,我们的页面都有个共用的,固定位置的头部和底部。所以我们在这个文件夹里,先创建两个组件MHeader, MFooter, 其代码如下:

MHeader
<template>
    <div class="header">
        <div class="header-left">
            <i class="fa fa-user fa-3x" @click="showMenu"></i>
        </div>
        <div class="header-center">
            <router-link to="/">
                <i class="fa fa-heart fa-3x"></i>
            </router-link>
            <router-link to="/rank-list">
                <i class="fa fa-music fa-3x"></i>
            </router-link>
            <router-link to="/search">
                <i class="fa fa-search fa-3x"></i>
            </router-link>
        </div>
    </div>
</template>
<script>
    export default({
        computed:{
            isMenuShow(){
                return this.$store.state.personal.isMenuShow
            }
        },
        methods:{
            showMenu(){
                this.$store.commit('showMenu')
            }
        }
    })
</script>
<style scoped>
    .header{
        background-color: skyblue;
        margin: 0 auto;
        vertical-align: center;
        height: 100px;
        position:relative;
    }
    .header-left{
        float: left; 
        margin-left: 15px;
        margin-top: 25px;
    }
    .header-right{
        float:right;
        margin-right: 15px;
        margin-top: 25px;
    }
    .header-center{
        margin-top: 25px;
        display: inline-block;
        text-align: center;
    }
    .header-center i{
        margin-left: 25px;
        margin-right: 25px;
    }
    .active{
        background-color: rebeccapurple;
    }
</style>

pages

最后我们在pages目录中创建我们的4个主要页面。

MyCollect.vue

我的个人收藏

<template>
    <div>
        个人收藏
    </div>
</template>
RankList.vue

音乐榜单

<template>
    <div>
        音乐榜单
    </div>
</template>
Search.vue

搜索

<template>
    <div>
        搜索
    </div>
</template>
PersonalInfo.vue

个人信息

<template>
    <div class="personal">
        <transition name="side">
            <div class="personal-content" v-show="isMenuShow">
            </div>
        </transition>
        <transition name="fade">
            <div class="personal-mask" v-show="isMenuShow" @click="hideMenu">
            </div>
        </transition>
    </div>
</template>
<script>
    export default({
        computed:{
            isMenuShow(){
                return this.$store.state.personal.isMenuShow
            }
        },
        methods:{
            hideMenu(){
                this.$store.commit('hideMenu')
            }
        }
    })
</script>
<style scoped>
    .personal-mask{
        position:fixed;
        top:0;
        bottom: 0;
        left:0;
        right:0;
        opacity: 0.3;
        width:100%;
        height: 100%;
        z-index:10;
        background:rgba(0,0,0,0.5)
    }
    .personal-content{
        position:fixed;
        top:0;
        bottom: 0;
        left:0;
        right:0;
        width: 80%;
        overflow-y:auto;
        z-index:11;
        height: 100%;
        background-color: #fff
    }
    .side-enter-to, .side-leave-to{
        transition: transform 0.5s
    }   
    .side-enter, .side-leave-to{
        transform:translate3d(-100%,0,0)
    }
    .fade-enter-to, .fade-leave-to{
        transition: opacity 0.3s
    }   
    .fade-enter, .fade-leave-to{
        opacity: 0
    }
</style>

个人信息页面增加了一些动画。这边的页面都是空白页面。这里仅做布局,具体内容以后再填充。
最后的运行结果:
个人收藏示例界面:



音乐榜单示例界面:



点击界面头部的人像部分可滑出个人信息:

点击个人信息右侧的模糊部分可退出个人信息,返回原有界面。

本文为原创,转载请注明出处

上一节:Vue学习笔记实战篇——音乐播放器 · 需求说明
返回目录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 我羡慕那些为了一个目标而拼命追求的人 高中没毕业就立志要成为单口相声演员,任何人家的父母恐怕都不会同意吧,自然而然...
    王小金Vincent阅读 392评论 0 0
  • 雨后, 夕阳如火。 无边的云, 在大风的猛烈吹拂下, 仍然试图包围, 那黑暗前最后的光亮。 浓云笼罩下, 落日余晖...
    无边的蓝海阅读 247评论 0 2
  • 和他认识是在10年前。 不知道他的真实名字,但他总让我们叫他遥。 曾在一起狂欢派对时的他吐露真言。遥,遥远。他想去...
    Kathbear阅读 589评论 0 5