1. 程式人生 > >用Vue2.0實現tabbar

用Vue2.0實現tabbar

大家好,我給大家分享一下仿豆瓣app的教程。當然了,我們不是用原生去實現,而是用前端框架vuejs來實現豆瓣app。————第一次寫文章,寫得不好請見諒。

為什麼我們選擇豆瓣app 來做這樣一個教程?

是因為我很早就接觸豆瓣這個網站,我比較喜歡看豆瓣裡面電影和文章的點評。並且豆瓣提供了非常豐富的一個api介面供我們使用。也就是說我們可以不通過後端,直接通過前端ajax來獲取電影和圖書的資料,來組裝我們app。

我們可以看一下豆瓣app首頁是一個什麼樣子 gif

以上就是豆瓣app的一個截圖。

我們先來分析一下

首頁分為四個部分。第一個就是頂部的搜尋框。搜尋框下面就是一個banner圖切換。在下面就是一些熱點的文章列表。最底部就是一個tab切換。在這篇教程中,我們通過vue的元件來實現這樣一個首頁的佈局。

        • *

          建立豆瓣專案

我們可以通過官方vue-cli初始化專案,這裡我們採用webpack示例

vue init webpack douban

填寫專案描述,作者,安裝vue-router

? Project name douban
? Project description douban
? Author afei
? Vue build standalone
? Install vue-router? Yes
? Use ESLint to lint your code? No
? Setup unit tests with Karma + Mocha? No
? Setup e2e tests with
Nightwatch? No vue-cli · Generated "douban". To get started: cd douban npm install npm run dev Documentation can be found at https://vuejs-templates.github.io/webpack

初始化後,通過npm install安裝依賴

cd douban
npm install

執行專案,可以看到基於官方vue-cli的模版就建立好了

npm run dev

將所需要用的資源,拷貝到專案中,這裡我通過解壓豆瓣app獲得他的一些圖片素材,拷入到src/assets/images目錄裡。

css這裡我用到了normaliz.css

在src下,新建了一個pages目錄,存放每一個頁面元件,可以看一下我們的目錄

由於我們的首頁更改了位置,所以在router裡面的index.js需要更改為

import Vue from 'vue'
import Router from 'vue-router'
import Index from '../pages/Index'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'Index',
      component: Index
    }
  ]
})

每一個元件的css我們通過less來編寫,所有需要通過npm安裝less外掛

npm install less less-loader --save

使用less前處理器需要在頁面新增 lang='less'

<style scoped lang="less"></style>

第一個元件 tabbar

如何建立自定義元件tabbar,也就是豆瓣app底部的工具欄。這裡的結構我們參考了 mint-ui

這是我們將要實現的效果圖。

我們先來分析一下這個元件的結構。

這個元件分為兩部分:第一個是元件的外層容器,第二個是元件的子容器item,子元件裡面又分為圖片和文字組合。子元件有2個狀態,一個預設灰色的狀態,一個選中狀態,我們來實現一下這個元件的佈局。在index.vue裡面

template

<div class="m-tabbar">
  <a class="m-tabbar-item is-active">
    <span class="m-tabbar-item-icon">
       < img src="../assets/images/ic_tab_home_normal.png" alt="">
    </span> 
    <span class="m-tabbar-item-text">  
          首頁
    </span>
  </a> 
  <a class="m-tabbar-item">
    <span class="m-tabbar-item-icon">
       < img src="../assets/images/ic_tab_subject_normal.png" alt="">
    </span> 
    <span class="m-tabbar-item-text">  
          書影音
    </span>
  </a> 
  <a class="m-tabbar-item">
    <span class="m-tabbar-item-icon">
       < img src="../assets/images/ic_tab_status_normal.png" alt="">
    </span> 
    <span class="m-tabbar-item-text">  
          廣播
    </span>
  </a> 
  <a class="m-tabbar-item">
    <span class="m-tabbar-item-icon">
       < img src="../assets/images/ic_tab_group_normal.png" alt="">
    </span> 
    <span class="m-tabbar-item-text">  
          小組
    </span>
  </a> 
  <a class="m-tabbar-item">
    <span class="m-tabbar-item-icon">
       < img src="../assets/images/ic_tab_profile_normal.png" alt="">
    </span> 
    <span class="m-tabbar-item-text">  
          我的
    </span>
  </a> 
</div>

style

<style lang="less">
.m-tabbar{
    display: flex;
    flex-direction: row;
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    width: 100%;
    overflow: hidden;
    height: 50px;
    background: #fff;
    border-top: 1px solid #e4e4e4;
    
    .m-tabbar-item{
      flex: 1;
      text-align: center;
      .m-tabbar-item-icon{
          display: block;
          padding-top: 2px;
          img{
              width: 28px;
              height: 28px;
          }
      }
      .m-tabbar-item-text{
          display: block;
          font-size: 10px;
          color:#949494;
      }
      &.is-active{
          .m-tabbar-item-text{
              color: #42bd56;
          }
      }
  }
}
</style>

佈局大功告成~~~~

前面我們說的是,通過元件的方式來實現這個app。

如果像上面程式碼這樣的話肯定是不行的!既然我們大體佈局已經寫好了,現在就可以通過元件的方式來呼叫。當然我們還要改造一下程式碼。

先在components資料夾下面,新建兩個元件,通過這兩個元件來組合實現我們底部的tab元件:

一個是tabbar-item.vue,實現子元件的item項,

tabbar-item.vue

<template>
    <a class="m-tabbar-item" >
        <span class="m-tabbar-item-icon"><slot name="icon-normal"></slot></span>
        <span class="m-tabbar-item-text"><slot></slot></span>
    </a>
</template>

<style lang="less">
.m-tabbar-item{
    flex: 1;
    text-align: center;
    .m-tabbar-item-icon{
        display: block;
        padding-top: 2px;
        img{
            width: 28px;
            height: 28px;
        }

    }
    .m-tabbar-item-text{
        display: block;
        font-size: 10px;
        color:#949494;
    }
    &.is-active{
        .m-tabbar-item-text{
            color: #42bd56;
        }
    }
}
</style>

一個是tabbar.vue,實現tab的外層容器,

tabbar.vue

<template>
    <div class="m-tabbar">
       <slot></slot>
    </div>
</template>
<style lang="less">
.m-tabbar{
    display: flex;
    flex-direction: row;
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    width: 100%;
    overflow: hidden;
    height: 50px;
    background: #fff;
    border-top: 1px solid #e4e4e4;
}
</style>

在Index.vue中組合這兩個元件,實現tab元件效果

<template>
  <div>
    <m-tabbar>
      <m-tabbar-item id='tab1'>
        < img src="../assets/images/ic_tab_home_normal.png" alt="" slot="icon-normal"> 
        首頁
      </m-tabbar-item>
      <m-tabbar-item id='tab2'>
        < img src="../assets/images/ic_tab_subject_normal.png" alt="" slot="icon-normal"> 
        書影音
      </m-tabbar-item>
      <m-tabbar-item id='tab3'>
        < img src="../assets/images/ic_tab_status_normal.png" alt="" slot="icon-normal"> 
        廣播
      </m-tabbar-item>
      <m-tabbar-item id='tab4'>
        ![](../assets/images/ic_tab_group_normal.png) 
        小組
      </m-tabbar-item>
       <m-tabbar-item id='tab5'>
        < img src="../assets/images/ic_tab_profile_normal.png" alt="" slot="icon-normal"> 
        我的
      </m-tabbar-item>
    </m-tabbar>
  </div>
</template>

<script>
  import mTabbar from '../components/tabbar'
  import mTabbarItem from '../components/tabbar-item'
  export default {
    name: 'index',
    components: {
      mTabbar,
      mTabbarItem
    }
  }
</script>

完成的效果。

        • *

光有一個死的介面,沒有點選切換的效果怎麼能行?

以下我們通過vue使用自定義事件的表單輸入元件來實現點選切換的效果。

        • *

先給Index.vue裡面的tab元件加上v-model 來進行資料雙向繫結,通過select來達到選擇item,在item裡面再新增一個選中的active圖片

<template>
  <div>
    測試
    <m-tabbar v-model="select">
      <m-tabbar-item id='tab1'>
        < img src="../assets/images/ic_tab_home_normal.png" alt="" slot="icon-normal"> 
        < img src="../assets/images/ic_tab_home_active.png" alt="" slot="icon-active"> 
        首頁
      </m-tabbar-item>
      <m-tabbar-item id='tab2'>
        < img src="../assets/images/ic_tab_subject_normal.png" alt="" slot="icon-normal"> 
        < img src="../assets/images/ic_tab_subject_active.png" alt="" slot="icon-active"> 
        書影音
      </m-tabbar-item>
      <m-tabbar-item id='tab3'>
        < img src="../assets/images/ic_tab_status_normal.png" alt="" slot="icon-normal"> 
        < img src="../assets/images/ic_tab_status_active.png" alt="" slot="icon-active"> 
        廣播
      </m-tabbar-item>
      <m-tabbar-item id='tab4'>
        < img src="../assets/images/ic_tab_group_normal.png" alt="" slot="icon-normal"> 
        < img src="../assets/images/ic_tab_group_active.png" alt="" slot="icon-normal"> 
        小組
      </m-tabbar-item>
       <m-tabbar-item id='tab5'>
        < img src="../assets/images/ic_tab_profile_normal.png" alt="" slot="icon-normal"> 
        < img src="../assets/images/ic_tab_profile_active.png" alt="" slot="icon-normal"> 
        我的
      </m-tabbar-item>
    </m-tabbar>
  </div>
</template>

<script>
  import mTabbar from '../components/tabbar'
  import mTabbarItem from '../components/tabbar-item'
  export default {
    name: 'index',
    components: {
      mTabbar,
      mTabbarItem
    },
    data() {
      return {
        select:"tab1"
      }
    }
  }
</script>

tabbar.vue裡面通過props來傳遞資料vaule

<template>
    <div class="m-tabbar">
       <slot></slot>
    </div>
</template>
<script>
    import mTabbarItem from './tabbar-item';
    export default {
        props: ['value']
    }
</script>
<style lang="less">
.m-tabbar{
    display: flex;
    flex-direction: row;
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    width: 100%;
    overflow: hidden;
    height: 50px;
    background: #fff;
    border-top: 1px solid #e4e4e4;
}
</style>

tabbar-item.vue元件:根據父元件的value和當前元件的id判斷是否為選中狀態,通過 $parent.$emit('input',id) - 觸發父元件的自定義事件,新增選中的圖片,根據isActive來顯示隱藏

<template>
    <a class="m-tabbar-item" :class="{'is-active':isActive}" @click="$parent.$emit('input',id)">
        <span class="m-tabbar-item-icon" v-show="!isActive"><slot name="icon-normal"></slot></span>
        <span class="m-tabbar-item-icon" v-show="isActive"><slot name="icon-active"></slot></span>
        <span class="m-tabbar-item-text"><slot></slot></span>
    </a>
</template>
<script>
    export default{
        props: ['id'],
        computed: {
           isActive(){
               if(this.$parent.value===this.id){
                   return true;
               }
           }
        }
    }
</script>
<style lang="less">
.m-tabbar-item{
    flex: 1;
    text-align: center;
    .m-tabbar-item-icon{
        display: block;
        padding-top: 2px;
        img{
            width: 28px;
            height: 28px;
        }

    }
    .m-tabbar-item-text{
        display: block;
        font-size: 10px;
        color:#949494;
    }
    &.is-active{
        .m-tabbar-item-text{
            color: #42bd56;
        }
    }
}
</style>

大功告成,tabbar元件就完成了

~

感謝餓了麼團隊給我們帶來了這麼好的ui元件!

下載安裝

npm install
npm run dev

相關推薦

Vue2.0實現tabbar

大家好,我給大家分享一下仿豆瓣app的教程。當然了,我們不是用原生去實現,而是用前端框架vuejs來實現豆瓣app。————第一次寫文章,寫得不好請見諒。 為什麼我們選擇豆瓣app 來做這樣一個教程? 是因為我很早就接觸豆瓣這個網站,我比較喜歡看豆瓣裡面電影和文章的點評。並且豆瓣提供了非常豐富的一個a

vue2.0實現圖片加載失敗默認顯示圖片

bsp asset mage res highlight return ner url onerror <div class="bg"> <img :src="goods.phoneFloorAd.resUrl" :onerror="error

vue2.0 實現click點擊當前li,動態切換class

一行 for ont pla false style function float del <template>  <div>    <ul>      <li v-for="(item,$index) in items" @cli

基於vue2.0實現仿百度前端分頁效果(二)

前言 上篇文章中,已經使用vue實現前端分頁效果,這篇文章我們單獨將分頁抽離出來實現一個分頁元件 先看實現效果圖 程式碼實現 按照慣例,我們在凍手實現的時候還是先想一想vue實現元件的思路 1、需要提前設定哪些引數需要暴露出來給父元件傳遞 <Paging

vue2.0 實現富文字編輯器功能

前端富文字編譯器使用總結: UEditor:百度前端的開源專案,功能強大,基於 jQuery,但已經沒有再維護,而且限定了後端程式碼,修改起來比較費勁 bootstrap-wysiwyg:微型,易用,小而美,只是 Bootstrap + jQuery... kindEditor:功能強大,程

vue2.0 實現漢字A-Z排序與手機通訊錄效果

先上一張效果圖: 列表html  template  (使用 ydui移動端UI  , 地址:http://vue.ydui.org/) <yd-cell-group v-for="item in memberList" :title="item

vue2.0實現點擊後顯示,再次點擊隱藏

all element cli html glob .com 狀態 right sna 描述。點擊系統切換,彈出系統切換框。再次點擊系統切換,隱藏。點擊其他地方。也會隱藏 在layout.vue中寫的html代碼 1、在main.js中寫入全局函數 // 定義全局點擊

element-ui+vue2.0 實現登入並實現一週內記住密碼

1.檔案目錄 2.主頁index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="

vue2.0 實現導航守衛 --- 齊梟飛 前端開發攻城獅(路由守衛) 使用vue-router+vuex進行導航守衛

路由跳轉前做一些驗證,比如登入驗證,是網站中的普遍需求。 對此,vue-route 提供的 beforeRouteUpdate 可以方便地實現導航守衛(navigation-guards)。 導航守衛(navigation-guards)這個名字,聽起來怪怪的

詳解基於Vue2.0實現的移動端彈窗(Alert, Confirm, Toast)元件

wc-messagebox 基於 vue 2.0 開發的外掛 包含 Alert, Confirm, Toast, Prompt 仿照 iOS 原生UI(樣式來源: MUI) 一些想法 剛開始的時候想要用現成的彈窗元件來著, 但是查詢一圈沒有發現比較合適專

vue2.0 實現漢字A-Z排序與手機通訊錄效果

先上一張效果圖:列表html  template  (使用 ydui移動端UI  , 地址:http://vue.ydui.org/)<yd-cell-group v-for="item in memberList" :title="item.letter" :id=

Vue2.0實現呼叫攝像頭進行拍照功能以及圖片上傳功能引用exif.js

(function() { var debug = false; var root = this; var EXIF = function(obj) { if (obj instanceof EXIF) return obj; if (!(this instanceof EXIF

Vue2.0實現購物車示例

簡介 vue.js是由華人尤雨溪開發的一套MVVM框架。vue.js 的核心是一個允許你採用簡潔的模板語法來宣告式的將資料渲染進 DOM 的系統,它非常適用於具有複雜互動邏輯的前端應用,如一些單頁應用程式,有很多表單操作,頁面中的內容需要根據使用者的操作動態變

求解! vue2.0實現購物車小球掉落特效第一次點選動畫失效(男默女淚的bug!)

點選新增按鈕時有一個小球掉落到購物車的特效,第一次點選時動畫特效沒有出來,且沒有進入afterEnter方法。後面點選都沒有問題。 效果如圖:(第一次點選) 但是我在enter方法裡面下了一個斷點之後就有動畫效果,且進入了afterEnter。效果如下: 希望大

vue2.0 實現導航守衛(路由守衛)

import Vue from 'vue'; import Router from 'vue-router'; import LoginPage from '@/pages/login'; import HomePage from '@/pages/home'; import GoodsListPage

vue2.0實現引用qrcode.js實現獲取改變二維碼的樣式

/** * @fileoverview * - Using the 'QRCode for Javascript library' * - Fixed dataset of 'QRCode for Javascript library' for support full-spec. * - thi

Vue2.0實現高仿餓了麼專案裡的小球飛入動畫

在學習Vue.js高仿餓了麼專案的過程中,有一個小球飛入購物車的動畫效果。專案是基於vue1.0的,如果是vue2.0的專案,該如何實現呢?自己也花時間研究了一會,從迷惑不解,各種嘗試未果,到後來咬文嚼字研讀vue 2.0官網關於過渡的章節,再到最終實現效果,心情十分愉悅,同

vue2.0實現echarts餅圖(pie)效果展示

最近做的專案需要餅狀圖展示資料的功能,於是便引入echarts做了一個餅狀圖的效果展示。由於只用到echarts其中的餅圖,所以就單獨在需要的模組引用,避免全域性引用影響效能,減少不必要的載入。一.使用 cnpm 安裝 Echartscnpm install echarts

vue2.0 實現選項卡導航例項

1:背景是一個web端的電商網站,根據點選的導航選項卡呈現不同得種類商品,首先這裡說下我的路由結構是導航是一個元件,選項卡的內容又是單獨的一個元件。這是導航元件的內容,這裡主要通過v-for迴圈生成導航,沒什麼好說的,需要注意的是,這因為選項卡需要知道使用者所點選的是哪個模組

基於vue2.0實現音樂/視訊播放進度條元件的思路及具體實現方法+程式碼解釋

基於vue2.0實現音樂/視訊播放進度條元件的方法及程式碼解釋 需求分析: ①:進度條隨著歌曲的播放延長,歌曲播放完時長度等於黑色總進度條長度;時間實時更新。 ②:當滑動按鈕時,實時更新播放時間,橙色進度條長度也會隨著按鈕的滑動而改變,當滑動結束時,橙色區域停留在滑動結束的