1. 程式人生 > >vue2.0 餓了麼學習筆記(14)food.vue的實現

vue2.0 餓了麼學習筆記(14)food.vue的實現

點選food展開詳情頁food.vue的實現

1)新建good資料夾和good.vue,設定樣式,並接受一個被選中的food

 props: { //接收傳入的food
        food: {
            type: Object
        }
    }
2)獲取food資料,goods.vue中

food是由goods元件傳出的,現在goods元件中引入food,並從data中將被選中的food傳入food.vue中

<food :food="selectedFood"></food>

其中,selectedFood初始化為空物件,一開始沒有food被選擇

data{
	 selectedFood: {} //一開始是空物件,點選food的時候再存入,在li(food)中新增點選事件
 }

之後在goos.vue的food列表中新增點選事件,點選food之後,更新selectedFood{}

<li @click="selectFood(food,$event)" v-for="food in item.foods" :key="food.id" class="food-item"  border-1px>
 <li @click="selectFood(food,$event)" v-for="food in item.foods" :key="food.id" class="food-item"  border-1px>
 selectFood(food, event){ //@click函式
    if (!event._constructed) { //瀏覽器直接return掉,去掉自帶click事件的點選
        return;
     }
      this.selectedFood = food; //更新data中的selectedFood
  }

最後,如1),在food.vue中接收food資料

3)在goods.vue中,點選一種food的時候會彈出food.vue中的詳情介面,新增this.$refs.food.show();

  <li v-for="food in item.foods" :key="food.id" class="food-item" border-1px @click="selectFood(food,$event)">

selectFood(food, event) { //@click函式
    if (!event._constructed) { //瀏覽器直接return掉,去掉自帶click事件的點選
        return;
     }
      this.selectedFood = food;
      //呼叫子元件的show()方法展開food元件
      this.$refs.food.show();
  }
 },

在food.vue中新增show()方法

    show() { //可以被父元件呼叫到,方法前加下劃線一般是私有方法
            this.showFlag = true;
            //初始化部分,ratingselect元件是被被不同的商品使用的,所以我們希望在點開不同的商品時,能有一樣的初始化狀態
            this.selectType = ALL;
            this.onlyContent = false;
            //展示介面時用到BScroll
            this.$nextTick(() => {
                if (!this.scroll) {
                    this.scroll = new BScroll(this.$refs.food, {
                        click: true // 可以被點選
                    });
                } else {
                   this.scroll.refresh();
                }
            });
        },
4)佈局food頁面,新增圖片,併為圖片左上角新增返回按鈕
    <div class="image-header">
       <img :src="food.image" alt="">
       <div class="back" @click="hide">
           <i class="icon-arrow_lift"></i>
        </div>
     </div>
        hide() {
            this.showFlag = false;
        },
<div v-show="showFlag" class="food" ref="food"> 實際上改變的是show方法中showFlage的值

5)新增商品名稱,月售價格等部分+CSS佈局

6) good.vue是定長的,我們希望新增BScroll實現滾動佈局,將BScroll繫結在最外層,為其新增ref,讓其DOM可以被訪問到,BScroll應該在介面呈現時用到,將其新增到show()方法(介面呈現)中

good.vue中
	show() { //可以被父元件呼叫到,方法前加下劃線一般是私有方法
            this.showFlag = true;
            //ratingselect元件是被被不同的商品使用的,所以我們希望在點開不同的商品時,能有一樣的初始化狀態
            this.selectType = ALL;
            this.onlyContent = true;
            //展示介面時用到BScroll
            this.$nextTick(() => {
                if (!this.scroll) {
                    this.scroll = new BScroll(this.$refs.food, {
                        click: true // 可以被點選
                    });
                } else {
                   this.scroll.refresh();
                }
            });
        },
food.vue中
 selectFood(food, event) { //@click函式
    if (!event._constructed) { //瀏覽器直接return掉,去掉自帶click事件的點選
        return;
     }
      this.selectedFood = food;
      //呼叫子元件的show()方法展開food元件
      this.$refs.food.show();
  }

7)新增加入購物車按鈕,點選加入購物車之後,出現cartcontrol加減號按鈕

 <div class="cartcontrol-wrapper"> <!-- 加減號元件cartcontrol -->
        <cartcontrol :food="food"></cartcontrol>
  </div>
                <transition name="fade"> 
                    <div @click.stop.prevent="addFirst" class="buy" v-show="food.count === 0 || !food.count">
                        加入購物車    
                    </div> <!-- 這兩種情況下加入購物車都會顯示,否則就會隱藏-->
                </transition>
1.當food.count=0或者是不存在food.count(沒有在goods.vue介面被點選過的情況)時,才會出現新增購物車字樣,否則顯示cartcontrol加減號元件

2.點選了加入購物車按鈕之後,出發addFirst()事件,即第一次新增事件,這是加入購物車字樣轉變為加減號元件

        addFirst(event) { // 預設的引數是event,點選按鈕的時候新增的是第一個商品
            if (!event._constructed) { //瀏覽器直接return掉,去掉自帶click事件的點選
                return;
            }
            //第一次的時候el消失,找不到小球發出的其實位置,所以第一次小球動畫消失
            //解決辦法就是將購物車的消失做成一個動畫,而不是立馬display:none
            //新增的時候新增小球動畫,派發事件,之後goods.vue就可以監聽到cart-add,並傳遞給shopcart.vue
            this.$emit('cart-add', event.target);
            Vue.set(this.food, 'count', 1); //初始化this.food.count = 1;
        }

3.父元件goods.vue中進行監聽

 cartAdd(target) {
     //拿到traget(DOM物件)之後,將其傳入shopcart元件中drop(target){}方法,
     //此處用this.$refs呼叫子元件,訪問DOM時用的是ref="menuWrapper"
    this.$nextTick(() => { //回撥函式非同步執行,兩個動畫效果就不會卡頓了
      this.$refs.shopcart.drop(target);
    });
   },
      <div class="cartcontrol-wrapper">
          <cartcontrol v-on:cart-add="cartAdd" :food="food"></cartcontrol> <!-- 傳入food!!!-->
      </div>
CSS:
.cartcontrol-wrapper
        position absolute
        right 12px
        bottom 12px
    .buy
        position absolute
        right 18px
        bottom 18px
        z-index 10 // 要蓋住加減號元件
        height 24px
        line-height 24px
        padding 0 12px
        box-sizing border-box
        font-size 10px
        border-radius 10px
        color #ffffff
        background rgb(0,160,220)
        &.fade-enter-active, &.fade-leave-active
            transition all 0.2s 
            opacity 1
        &.fade-enter, &fade-leave-active
            opacity 0

8)在goods元件點選加減號cartcontrol的時候,也會引起good詳情頁的出現,此時在cartcontrol中阻止加減號的冒泡即可,同時對加入購物車的click也設定阻止冒泡

<div class="cart-decrease" v-show="food.count>0" @click.stop.prevent="decreaseCart">
<div class="cart-add icon-add_circle" @click.stop.prevent="addCart"></div>
<div @click.stop.prevent="addFirst" class="buy" v-show="food.count === 0 || !food.count">
9)split元件的實現(多次出現的一個分割樣式,將其抽象為元件)
<template>
  <div class="split"></div>
</template>

<script type="text/ecmascript-6">
  export default {};
</script>

<style lang="stylus" rel="stylesheet/stylus">
    .split
        width 100%
        height 16px
        border-top: 1px solid rgba(1, 17, 27, 0.1);
        border-bottom: 1px solid rgba(1, 17, 27, 0.1);
        background: #f3f5f7
</style>
在food.vue引入註冊之後就可以使用了

相關推薦

vue2.0 學習筆記14food.vue實現

點選food展開詳情頁food.vue的實現1)新建good資料夾和good.vue,設定樣式,並接受一個被選中的food props: { //接收傳入的food food: { type: Object }

VUE2.0 學習筆記10加減號元件cartcontrol

建立cartcontrol元件,元件關聯到food的相關屬性,價格,數量等,所以元件要props父元件goods傳過來的food資料 export default { //父元件傳過來的,接收一個props屬性來計算商品的個數,food.count,去goods元件

vue學習筆記4icon字型載入問題,提示 These relative modules were not found: ./font/sell-icon.eot...

  https://blog.csdn.net/qq_22317389/article/details/79601407 https://blog.csdn.net/mxf_bear/article/details/80505295 使用 icon 字型圖標出現小方塊問題

Vue2.x實戰專案筆記

mack資料 如果後端介面尚未開發完成,前端開發一般使用mock資料。 注意:新版的vue-cli 自動搭建的build 檔案裡沒有dev-server.js 和 dev-client.js ,因此我們要在webpack.dev.conf.js 裡配置 複製data.json 到sr

vue學習筆記配置mock資料的Router

vue餓了嗎學習筆記(一) 最近在學習慕課網的vue.js高仿餓了麼外賣APP,在專案準備時就遇到了webpack版本問題。視訊中使用的webpack是1.12.2,而現在的webpack 版本已經到了3.6,原先的程式碼已經不適用了。 言歸正傳,當我們想

VUE2.0學習筆記VUE-CLI 腳手架

個人理解:搭建vue-cli vue腳手架的作用是,寫的專案可以通過webpack 快速打包,加密程式碼,避免原始碼洩露。腳手架的搭建步驟(摘錄自技術胖部落格:點選開啟技術胖部落格):1、前提:安裝了npm(在終端可以用npm -V檢查版本)2、開啟終端,在當前資料夾下執行命

vue 學習筆記

詳情頁主要程式碼 <template> <transition name="move"> <div v-show="showFlag" class="food" ref="food"> <div clas

vue2.0--header資料獲取後進行header元件的編寫

首先我們通過props屬性接受到父元件App.vue傳過來的資料 export default { //:seller = "seller" props接收傳過來的seller物件 props: { seller: { type: Object

編寫網路爬蟲獲取商家資訊

利用HttpClient和Jsoup兩種工具分別進行爬取資料 maven座標: <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons

藍芽4.0/BLE協議棧學習筆記

 需要的軟體工具: 1、BLE協議棧(BLE-CC254x-1.4.0) 2、IAR開發軟體(IAR Embedded Workbench8.20.2) 注:1.4.0協議棧使用8.2

QT學習筆記14 定時器類DTimer的使用

fin isa play htm number conn stat alt .cn 一、   在前面的學習筆記中,我們已經學習定時器事件http://www.cnblogs.com/blog-ccs/p/7445323.html   現在,我們學習QTimer定時器類,比較

redis學習筆記14---redis基本命令總結

del diff lan 命令 列表 對象 很多 順序 reg http://doc.redisfans.com/ 網頁,對所有redis命令的用法與示例進行了詳細的描述 概述 Redis的鍵值可以使用物種數據類型:字符串,散列表,列表,集合,有序集合。本文詳細介紹這

Linux學習筆記14

14一、df命令df 匯報文件系統磁盤空間使用情況文件系統名稱 文件系統大小 已用空間 可用空間 已用百分比% 掛載點-h 顯示磁盤單位(根據磁盤大小)Byte字節 (1024) KB (1024) MB兆 (1024) GB (102

Linux第一周學習筆記14

script white 網卡 第一個 roo nor nbsp inux sys Linux第一周學習筆記(14)2.6,相對和絕對路徑(1).路徑:就是某一個文件存放的地方,只要鍵入這個文件的路徑系統就只能直接找到這文件所在位置,所以找一個文件需要輸入這個文件的路徑。(

ActiveMQ學習筆記14----Destination高階特性

1. Visual Destinations   1.1 概述   虛擬Destination用來建立邏輯Destinations,客戶端可以通過它來產生和消費訊息,它會把訊息對映到物理Destinations。ActiveMQ支援兩種方式:   1. 虛擬主題(Virtual Topics)   2

Spark學習筆記14——Spark Streaming 資料累加的案例

1 原始碼 package mystreaming import org.apache.spark.{HashPartitioner, SparkConf, SparkContext} import org.apache.spark.streaming.{Seconds, Stre

VUE學習筆記—安裝vue-cli和建立專案

Github:https://github.com/sueRimn 1.cmd開啟控制檯進行建立專案 (1)全域性安裝腳手架 在命令列輸入:npm install vue-cli -g (2)初始化專案 繼續輸入:vue init webpack myvue(myvue是我取的專案名,

SpringBoot學習筆記14:使用SpringBootAdmin管理監控你的應用

SpringBoot學習筆記(14):使用SpringBootAdmin管理監控你的應用 Spring Boot Admin是一個管理和監控Spring Boot應用程式的應用程式。本文參考文件: 官方文件:http://codecentric.github.io/spring-boot-

RocketMQ學習筆記14----RocketMQ的去重策略

1. Exactly Only Once   (1). 傳送訊息階段,不允許傳送重複的訊息   (2). 消費訊息階段,不允許消費重複的訊息。   只有以上兩個條件都滿足情況下,才能認為訊息是“Exactly Only Once”,而要實現以上兩點,在分散式系統環   境下,不可避免要產生巨大的開銷。

機器學習筆記線性迴歸實現

一、向量化 對於大量的求和運算,向量化思想往往能提高計算效率(利用線性代數運算庫),無論我們在使用MATLAB、Java等任何高階語言來編寫程式碼。 運算思想及程式碼對比   的同步更新過程向量化   向量化後的式子表示成為: 其中是一個向量,是一個實數,是一個向量,