Framework7+Vue.js Spotify播放器 - 实例详解(1)

参考:原文PhoneGap Day Intermediate Workshop 2016是Framework7+传统js,这里一边讲解F7的基本概念,一边改为大家熟悉的Vue.js。最后,引入一些Phonegap打包App的一些小技巧。

前言

Framework7框架和Vue.js,就跟Ionic+Angular一样,有着深层次的配合!开发起来很多轮子都已经造好,事半功倍!

虽然这个在线音乐播放器App比较简单,但涵盖了F7+Phonegap基本的方方面面。

F7+Vue的教程很少,所以从简单实例入手很合适,大家最好手动码代码,不多,但绝对能加深理解。细细体会一下它有哪些便捷的地方,以及哪些要注意的,避免入坑。原文是用javascript,我们通过比较,也可以体会到Vue的简洁和强大!

要点:

  • F7接近原生的各种组件
  • 自带router,不需要vue-router了
  • 自带Dom7.ajax,不需要vue-resouce了
  • 大型项目建议使用vuex,本实例简单地使用store.js
  • Phonegap打包Hybrid App的一些技巧
  • 源码:https://github.com/kevinqqnj/spotifyApp

本实例完成图:


Paste_Image.png

1. 用template模板初始化

注意uglify-js要单独安装

npm install phonegap -g
phonegap create spotifyApp --template cordova-template-framework7-vue-webpack
cd spotifyApp
npm install
npm install uglify-js@^2.8.0
phonegap platform add browser android
phonegap run browser -- --lr

这时,应该会弹出浏览器窗口,显示demo页面。

2. 添加Font Awesome Icon图标库

Framework7有内置的图标,但只是基本的,9个。
icon-back, icon-forward, icon-bars, icon-camera, icon-f7, icon-next, icon-prev, icon-plus

F7支持额外的图标库,比如Framework7 IconsMaterial IconsFontAwesomeIonicons等等。
这里以FontAwesome为例:下载 http://fontawesome.io/assets/font-awesome-4.7.0.zip ,然后解压css、fonts目录到:\spotifyApp\src\assets\\
然后,在main.js引入即可:

# \spotifyApp\src\main.js
import './assets/css/font-awesome.min.css'

下面,你就可以在template里随意引用fa Icon了:

<i class="icon icon-bars"></i>  // F7内置的图标
<i class="icon fa fa-star"></i>   // FontAwesome图标

3. Framework7 View和Page概念

详细文档:Framework7 docs - views

F7把常用的Mobile App视图功能都包装好了,大家先理解一下View和Page,这是最重要的基本概念,跟内置路由有密切联系:

  • Views - 所有的可见view的容器。只允许有一个views
  • View - 一个App,可以有多个单独的、可见的view,它有独立的settings、navigation、history。默认的主view带有class “.view-main”。最常见的多view场景,是iPad横屏应用:左边是导航view,右边是内容展示view
  • Pages - 一个view下,所有page的容器
  • Page - 每个page,代表一个web page。单个view下,可以有多个page,但同一时间只能显示一个page(由路由控制)

本实例的view+page:


Paste_Image.png

由上可知,我们设置了一个view,它包含多个pages。主页面page是Index,带导航栏Navbar、工具栏Toolbar

4. 更新main视图:

修改layout为黑色:

# \spotifyApp\src\index.html
 <body class="layout-dark">

修改main.vue,添加主page:
先删除template div#app之间的所有元素

# \spotifyApp\src\main.vue
<template>
    <!-- App -->
    <div id="app">

    </div>
</template>

然后添加views - view - pages - page:

  • f7-pages.navbar-through.toolbar-through 所有页面共享Navbar、Toolbar效果
  • f7-navbar是在f7-view和f7-pages中间,因为使用了navbar-through(注:其它子页面,f7-navbar是在f7-page内部!)
  • f7-list-item media,用于添加图标
  • 注意f7-toolbar、text input, range input元素的使用
  • 相比较原来F7的HTML,F7-vue节省了一半以上的代码哦
# \spotifyApp\src\main.vue
<template>
  <!-- App -->
  <div id="app">
    <f7-views>
      <!-- Main view-->
      <f7-view main dynamicNavbar>
        <!-- Top Navigation Bar-->
        <f7-navbar>
          <f7-nav-left>
            <f7-link icon="icon-bars" open-panel="left"></f7-link>
          </f7-nav-left>
          <f7-nav-center>Spotify Browser</f7-nav-center>
        </f7-navbar>
        <!-- Pages -->
        <f7-pages navbar-through toolbar-through>
          <!-- Page, data-page contains page name-->
          <f7-page name="index">
            <!-- Scrollable page content-->
            <f7-block-title>Criteria</f7-block-title>
            <f7-list form>
              <f7-list-item media="<i class='icon fa fa-music'></i>">
                <f7-label>Songs</f7-label>
                <f7-input type="text" placeholder="Search for..." value="" />
              </f7-list-item>
              <f7-list-item media="<i class='icon fa fa-list-ol'></i>">
                <f7-label>Max Results</f7-label>
                <f7-input type="range" id="numResults" min="0" max="50" step="1" value="20" />
                <f7-input type="text" id="sliderVal" disabled value="20" />
              </f7-list-item>
            </f7-list>
            <f7-block>
              <div class="row">
                <div class="col-100">
                  <f7-button id="btnSearch" class="button button-big button-fill color-green">Submit</f7-button>
                </div>
              </div>
            </f7-block>
          </f7-page>
        </f7-pages>
        <!-- Bottom Toolbar on every view unless no-toolbar class specified (see item template)-->
        <f7-toolbar>
          <f7-link href="http://www.spotify.com" class="link external">
            <i class="icon icon-spotify"></i>
            <p class="color-white"> Spotify</p>
          </f7-link>
          <f7-link href="http://www.idangero.us/framework7" class="link external">
            <i class="icon icon-f7"></i>
          </f7-link>
        </f7-toolbar>
      </f7-view>
    </f7-views>
  </div>
</template>

5. 自定义样式文件CSS:

以上的工具栏里,使用了自定义class,引用图片来作为icon。对于自己的CSS,建议统一放在main.css。

  • 复制这个图片:spotify.png\spotifyApp\src\assets\images\\目录
  • 创建自己的css文件 main.css(如果你想用sass,则不需要新建,用默认的main.scss就行)
# \spotifyApp\src\assets\css\main.css
i.icon.icon-spotify { 
  width: 29px; height: 29px; background-image: url("../images/spotify.png"); margin-right: 3px; 
}

不要忘了在 main.js里引用样式文件:

# \spotifyApp\src\main.js
import './assets/css/main.css'

6. 初始化App应用,关联slider和显示的数值

Framework7-vue初始化是在main.js,你可以对应用的全局参数自行定义,这里是所有的全局参数
另外,在Vue组件内,你可以通过this.f7、this.$device、this.$theme、this.Dom7来对Framework7的instance,进行全面的操控。

  • material: 设为true的话,界面会变成Google Material Design样式。本文用默认的iOS配色
  • modalTitle: 设置所有Alert/Notify/Modal的标题
# \spotifyApp\src\main.js
// Init App
new Vue({
  el: '#app',
  template: '<app/>',
  // Init Framework7 by passing parameters here
  framework7: {
    root: '#app',
    /* Uncomment to enable Material theme: */
    // material: true,
    routes: Routes,
    modalTitle: "Spotify Browser",  // 用于所有Alert/Notify/Modal的标题
  },
  // Register App Component
  components: {
    app: App
  }
})

关联range-input数据,这是Vue的强项,不用写一行代码,用v-model数据绑定实现了:

# \spotifyApp\src\main.vue
<template>
  。。。
  <f7-input type="range" id="numResults" min="0" max="50" step="1" v-model="sliderVal" />
  <f7-input type="text" id="sliderVal" disabled :value="sliderVal" />
  。。。
</template>
<script>
export default {
  name: 'Index',
  data() {
    return {
      sliderVal: 20,
    }
  },
  mounted() {
    window.Dom7(document).on('deviceready', () => {
      console.log("Device is ready!");
    });
  },
}
</script>

7. 调用Spotify API,处理返回数据

App的主界面已经写好,下面开始处理数据。

--> 请看详解(2)

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

推荐阅读更多精彩内容