vue實(shí)踐二:頁(yè)面區(qū)塊化與組件封裝

本文示例代碼:查看源碼 ?? 查看運(yùn)行
參考書(shū)籍:《Vue2 實(shí)踐揭秘》第四章:頁(yè)面區(qū)塊化與組件封裝

本文代碼從之前文章:vue-router:路由與頁(yè)面間導(dǎo)航開(kāi)始

一、文章目的

1池摧、簡(jiǎn)單了解并學(xué)習(xí)vue頁(yè)面區(qū)塊化與組件的封裝;
2嘱函、學(xué)習(xí)了解常用vue插件:

  • 輪播圖插件:swiper炸站;
  • 請(qǐng)求數(shù)據(jù)插件:vue-resource
  • 請(qǐng)求數(shù)據(jù)插件:axios抄沮、vue-axios省古;
  • 數(shù)據(jù)模擬插件:mockjs

二粥庄、需求梳理

效果圖1

效果圖2

邏輯分析

  • 當(dāng)前頁(yè)面是Home.vue,我們?cè)?code>src/components新建home文件夾存放當(dāng)前頁(yè)專(zhuān)用組件豺妓;

布局分析

  • 熱門(mén)推薦:Slider.vue
  • 快訊:Announcement.vue
  • 新書(shū)上架:BookList.vue
  • 編輯推薦:BookList.vue
  • 圖書(shū)彈層:Dialog.vue

三惜互、書(shū)寫(xiě)代碼

  1. 搭架子
  • components下新建home文件夾,并新建四個(gè)vue組件琳拭;
  • Home.vue文件中引入組件训堆,并在頁(yè)面中占位;
    搭架子
  1. 熱門(mén)推薦圖片輪播實(shí)現(xiàn):Swiper.vue
  • 2.1 安裝依賴(lài)包


    安裝swiper
  • 2.2 初始化 Swiper.vue
    • 這里圖片使用圖片占用白嘁,官網(wǎng) 或者 這里
    • 使用ref屬性定位坑鱼,替換css選擇器
    • 在js代碼前加注釋?zhuān)?code>// eslint-disable-next-line,阻止Do not use 'new' for side effects報(bào)錯(cuò)
<template>
  <div class="swiper-container" ref="slider">
    <div class="swiper-wrapper">
      <div class="swiper-slide"><img src="http://via.placeholder.com/300x120?text=1" alt=""></div>
      <div class="swiper-slide"><img src="http://via.placeholder.com/300x120?text=2" alt=""></div>
      <div class="swiper-slide"><img src="http://via.placeholder.com/300x120?text=3" alt=""></div>
    </div>
    <div class="swiper-pagination" ref="pagination"></div>
  </div>
</template>
<script>
import Swiper from 'swiper'
import 'swiper/dist/css/swiper.css'
export default {
  props: ['slides'],
  mounted () {
    this.swiperInit()
  },
  methods: {
    swiperInit () {
      // eslint-disable-next-line
      new Swiper(this.$refs.slider, {
        pagination: {
          el: this.$refs.pagination,
          clickable: true
        },
        spaceBetween: 0,
        centeredSliders: true,
        autoplay: {
          delay: 2000
        },
        autoplayDisabledOninteraction: true,
        initialSlide: 0,
        loop: true,
        speed: 900
      })
    }
  }
}
</script>
  • 2.3 父組件Home.vue傳遞數(shù)據(jù)
    • 修改Home.vueSwiper.vue
    • 注意:通過(guò)接口獲取數(shù)據(jù)時(shí)权薯,組件引用加v-if判斷姑躲,防止數(shù)據(jù)未加載完頁(yè)面渲染造成bug
      數(shù)據(jù)傳遞
  • 2.4 實(shí)現(xiàn)效果


    效果
  1. 快訊實(shí)現(xiàn):Announcement.vue
    快訊
  2. 新書(shū)上架和編輯推薦:BookList.vue
  • 4.1 初始化BookList.vue
<template>
  <div class="book-list">
    <div class="header">
      <div class="heading">最新更新</div>
      <div class="more">更多...</div>
    </div>
    <div class="book-item">
      <div class="book">
        <div class="cover"><img src="http://via.placeholder.com/100x150?text=1" alt=""></div>
        <div class="title">揭開(kāi)數(shù)據(jù)真相:從小白到數(shù)據(jù)分析達(dá)人</div>
        <div class="author">Edward Zaccaro, Daniel Zaccaro</div>
      </div>
      <div class="book">
        <div class="cover"><img src="http://via.placeholder.com/100x150?text=1" alt=""></div>
        <div class="title">揭開(kāi)數(shù)據(jù)真相:從小白到數(shù)據(jù)分析達(dá)人</div>
        <div class="author">Edward Zaccaro, Daniel Zaccaro</div>
      </div>
    </div>
  </div>
</template>
<script>
import './BookList.less'
export default {}
</script>

BookList.less

.book-list {
  margin: 0 14px;
  & > .header {
    display: table;
    width: 100%;
    border-bottom: 1px solid #efefef;

    & > .heading {
      display: table-cell;
      padding: 12px;
    }

    & > .more {
      display: table-cell;
      text-align: right;
      vertical-align: middle;
      font-size: 10px;
      color: #cccccc;
      padding-right: 14px;
    }
  }

  & .book-items {
    display: table;
    width: 100%;
    padding-top: 12px;
  }

  & .book {
    font-size: 10px;
    text-align: center;
    float: left;
    width: 33%;
    height: 207px;
    margin: 12px auto;
    cursor: pointer;
    & .cover {
    }

    & .title, & .authors {
      margin: 5px auto;
      width: 100px;
      text-overflow: ellipsis;
      overflow: hidden;
      white-space: nowrap;
    }

    & .authors {
      color: #898989;
      margin-top: 10px;
      text-align: left;
    }
  }
}
  • 4.2 父組件Home.vue傳遞數(shù)據(jù)

    • 更改Home.vueBookList.vue
    • 作者多個(gè),加filters過(guò)濾器盟蚣,用,拼接
      傳遞數(shù)據(jù)
  • 4.3 實(shí)現(xiàn)效果


    實(shí)現(xiàn)效果
  1. 彈出層:Dialog.vue
  • 5.1 Dialog.vue組件和Dialog.less
<template>
  <div class="dialog-wrapper" :class="{ 'open': is_open }">
    <div class="overlay" @click="close"></div>
    <div class="dialog">
      <!-- 頭部及標(biāo)題 -->
      <slot name="header"></slot>
      <!-- 內(nèi)容區(qū)域 -->
      <slot></slot>
    </div>
  </div>
</template>
<script>
import './Dialog.less'
export default {
  data () {
    return {
      is_open: false
    }
  },
  methods: {
    open () {
      this.is_open = true
    },
    close () {
      if (this.is_open) {
        this.$emit('dialogClose')
      }
      this.is_open = false
    }
  }
}
</script>
.dialog-wrapper {
  &.open {
    display: block;
  }
  height: 100%;
  display: none;
  &>.overlay {
    background: rgba(0, 0, 0.3, 0.2);
    z-index: 1;
    position: fixed;
    left: 0;
    top: 0;
    right: 0;
    bottom: 0;
  }
  &>.dialog {
    z-index: 10;
    background: #fff;
    position: fixed;
    top: 24px;
    right: 24px;
    left: 24px;
    bottom: 24px;
    padding: 24px 14px;
    box-shadow: rgba(0, 0, 0, .8);
    & heading {
      padding: 12px;
    }
  }
}
  • 5.2 修改BookList.vue黍析,添加點(diǎn)擊事件@click="$emit('onBookSelect', book)"
    點(diǎn)擊事件
  • 5.3 修改Home.vue,響應(yīng)點(diǎn)擊事件
    • book-list組件上添加@onBookSelect="preview($event)"響應(yīng)BookList.vue的點(diǎn)擊事件屎开,并觸發(fā)preview方法打開(kāi)彈出層阐枣;
    • Dialog.vue@click="close"關(guān)閉彈層類(lèi)似邏輯;
      Home.vue
  1. data數(shù)據(jù)改為接口獲取
  • 6.1 安裝vue-resource

    安裝vue-resource

    • main.js中引入奄抽,并添加配置
      修改main.js
    • Home.vuecreated中通過(guò)vue-resource測(cè)試請(qǐng)求
      vue-resource
  • 6.2 安裝axios

    image.png

    • main.js中引入
      修改main.js
    • Home.vuecreated中測(cè)試請(qǐng)求
      測(cè)試axios
  1. 沒(méi)有正式的接口蔼两,下面通過(guò)mockjs攔截模擬接口請(qǐng)求
  • 7.1 安裝mockjs
    image.png
  • 7.2 修改Home.vuedata
    image.png
  • 7.3 在src目錄下新建api/home.json文件,加入json數(shù)據(jù)
{
  "slides": [
    { "id": 1, "img_url": "1.png" },
    { "id": 2, "img_url": "2.png" },
    { "id": 3, "img_url": "3.png" }
  ],
  "announcement": "今日上架的圖書(shū)全部8折",
  "latestUpdated": [
    {
      "id": 1,
      "title": "揭開(kāi)數(shù)據(jù)真相:從小白到數(shù)據(jù)分析達(dá)人",
      "authors": [ "Edward Zaccaro", "Daniel Zaccaro" ],
      "img_url": "http://via.placeholder.com/100x150?text=1"
    },
    {
      "id": 2,
      "title": "Android高級(jí)進(jìn)階",
      "authors": ["顧浩鑫"],
      "img_url": "http://via.placeholder.com/100x150?text=2"
    },
    {
      "id": 3,
      "title": "淘寶天貓電商運(yùn)營(yíng)與數(shù)據(jù)化選品完全手冊(cè)",
      "authors": ["老夏"],
      "img_url": "http://via.placeholder.com/100x150?text=3"
    },
    {
      "id": 4,
      "title": "大數(shù)據(jù)架構(gòu)詳解:從數(shù)據(jù)獲取到深度學(xué)習(xí)",
      "authors": ["朱潔", "羅華霖"],
      "img_url": "http://via.placeholder.com/100x150?text=4"
    },
    {
      "id": 5,
      "title": "Meteor全棧開(kāi)發(fā)",
      "authors": ["杜亦舒"],
      "img_url": "http://via.placeholder.com/100x150?text=5"
    }
  ],
  "recommended": [
    {
      "id": 1,
      "title": "自己動(dòng)手做大數(shù)據(jù)系統(tǒng)",
      "authors": ["張粵磊"],
      "img_url": "http://via.placeholder.com/100x150?text=1"
    },
    {
      "id": 2,
      "title": "智能硬件安全",
      "authors": ["劉建皓"],
      "img_url": "http://via.placeholder.com/100x150?text=2"
    },
    {
      "id": 3,
      "title": "實(shí)戰(zhàn)數(shù)據(jù)庫(kù)營(yíng)銷(xiāo)--大數(shù)據(jù)時(shí)代輕松賺錢(qián)之道(第2版)",
      "authors": ["羅安林"],
      "img_url": "http://via.placeholder.com/100x150?text=3"
    },
    {
      "id": 4,
      "title": "大數(shù)據(jù)思維--從擲骰子到紙牌屋",
      "authors": ["馬繼華"],
      "img_url": "http://via.placeholder.com/100x150?text=4"
    },
    {
      "id": 5,
      "title": "從零開(kāi)始學(xué)數(shù)據(jù)營(yíng)銷(xiāo)",
      "authors": ["韓布韋"],
      "img_url": "http://via.placeholder.com/100x150?text=5"
    },
    {
      "id": 6,
      "title": "數(shù)據(jù)化營(yíng)銷(xiāo)",
      "authors": ["龔正", "吳治輝", "王偉", "崔秀龍", "閆建勇"],
      "img_url": "http://via.placeholder.com/100x150?text=6"
    }
  ]
}
  • 7.4 在src下新建mock.js逞度,并在main.js中引入
    mock.js
import Mock from 'mockjs'
import HomePageData from '@/api/home.json'

let sliderImages = require.context('./assets/sliders', false, /\.(png|jpg|gif|svg)$/)
HomePageData.slides.forEach((slide) => {
  slide.img_url = sliderImages('./' + slide.img_url)
})

Mock.mock('/api/home', 'post', HomePageData)
Mock.mock('https://api.coindesk.com/v1/bpi/currentprice.json', 'get', HomePageData)
在main.js中添加mock.js
  • 7.5 在src/assets下新建slides文件夾额划,并加入三張圖片
    slides圖片
  • 7.6 通過(guò)mock攔截接口請(qǐng)求,給data數(shù)據(jù)重新賦值


    mock模擬接口
  • 7.7 實(shí)現(xiàn)效果


    效果圖

結(jié)語(yǔ):當(dāng)前示例很簡(jiǎn)單档泽,入門(mén)學(xué)習(xí)理清思路可以俊戳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市馆匿,隨后出現(xiàn)的幾起案子抑胎,更是在濱河造成了極大的恐慌,老刑警劉巖渐北,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阿逃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赃蛛,警方通過(guò)查閱死者的電腦和手機(jī)恃锉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)呕臂,“玉大人淡喜,你說(shuō)我怎么就攤上這事∷斜眨” “怎么了炼团?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)疏尿。 經(jīng)常有香客問(wèn)我瘟芝,道長(zhǎng),這世上最難降的妖魔是什么褥琐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任锌俱,我火速辦了婚禮,結(jié)果婚禮上敌呈,老公的妹妹穿的比我還像新娘贸宏。我一直安慰自己造寝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布吭练。 她就那樣靜靜地躺著诫龙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鲫咽。 梳的紋絲不亂的頭發(fā)上签赃,一...
    開(kāi)封第一講書(shū)人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音分尸,去河邊找鬼锦聊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛箩绍,可吹牛的內(nèi)容都是我干的孔庭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼材蛛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼史飞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起仰税,我...
    開(kāi)封第一講書(shū)人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤构资,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后陨簇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吐绵,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年河绽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了己单。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耙饰,死狀恐怖纹笼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情苟跪,我是刑警寧澤廷痘,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站件已,受9級(jí)特大地震影響笋额,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜篷扩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一兄猩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦枢冤、人聲如沸鸠姨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)讶迁。三九已至,卻和暖如春趟咆,著一層夾襖步出監(jiān)牢的瞬間添瓷,已是汗流浹背梅屉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工值纱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坯汤。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓虐唠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親惰聂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疆偿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容