Vue項目實戰:產品站與商品詳情頁面實現

目錄

1. 產品站頁面

2. 商品詳情頁面

產品站頁面

(1)組件吸頂實現

  • 在要實現吸頂的組件文件ProductParam.Vue中
<template>
    <div class="nav-bar">
        <div class="container">
            <div class="pro-title">
                小米8
            </div>
            <div class="pro-param">
                <a href="javascript:;">概述</a><span>|</span>
                <a href="javascript:;">參數</a><span>|</span>
                <a href="javascript:;">用戶評價</a>
                <slot name="buy"></slot>
            </div>
        </div>
    </div>
</template>
<script>
export default {
    name:'nav-bar',
    data() {
      return {
        isFixed: false
      }
    },
    mounted() {
      window.addEventListener('scroll', this.initHeight)  
    },
    methods: {
      initHeight() {
        let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
        this.isFixed = scrollTop > 152? true: false

      },
      destroyed() {
      window.removeEventListener('scroll', this.initHeight, false)
      }
    }
}
</script>
<style lang="scss">
  @import './../assets/scss/config.scss';
  @import './../assets/scss/mixin.scss';
  .nav-bar{
    height:70px;
    line-height:70px;
    border-top:1px solid $colorH;
    background-color:$colorG;
    z-index:10;
    &.is_fixed{
      position:fixed;
      top:0;
      width:100%;
      box-shadow: 0 5px 5px $colorE;
    }
  }
</style>

(2)視頻模塊實現

  • 在需要視頻模塊的文件product.vue中:
        <div class="video-box">
          <div class="overlay"></div>
          <div class="video">
            <span class="icon-close"></span>
            <!--controls屬性指定視頻控件, muted靜音輸出  -->
            <video src="/imgs/product/video.mp4" muted autoplay controls="controls"></video>  
          </div>
        </div>
<style lang="scss">
        .video-box{
          .overlay{
            @include position(fixed);
            background-color:#333333;
            opacity:.4;
            z-index:10;
          }
          .video{
            position:fixed;
            top:-50%;
            left:50%;
            transform:translate(-50%,-50%);
            z-index:10;
            width:1000px;
            height:536px;
            .icon-close{
              position:absolute;
              top:20px;
              right:20px;
              @include bgImg(20px,20px,'/imgs/icon-close.png');
              cursor:pointer;
              z-index:11;
            }
            video{
              width:100%;
              height:100%;
              object-fit:cover;
              outline:none;
            }
          }
        }
</style>

(3)視頻模塊實現

  • 在文件product.vue中:
       <div class="video-bg" @click="showSlide='slideDown'"></div>
        <div class="video-box">
          <div class="overlay" v-if="showSlide='slideDown'"></div>
          <div class="video" v-bind:class="showSlide">
            <span class="icon-close" @click="showSlide='slideUp'"></span>
            <video src="/imgs/product/video.mp4" muted autoplay controls="controls"></video>
          </div>
        </div>
<script>
  export default{
    name:'product',
    data(){
      return {
        showSlide:'',//控制動畫效果
      }
    }
  }
</script>
<style>
 /*省略重複樣式代碼*/
    .video-box{
          @keyframes slideDown{
            from{
              top:-50%;
              opacity:0;
            }
            to{
              top:50%;
              opacity:1;
            }
          }
          @keyframes slideUp{
            from{
              top:50%;
              opacity:1;
            }
            to{ 
              top:-50%;
              opacity:0;
            }
          }
          .video{
            opacity:1; 
            &.slideDown{
              animation:slideDown .6s linear;
              top:50%;
            }
            &.slideUp{
              animation:slideUp .6s linear;
            }
          }
        }
</style>

(4)交互實現

  • 在product.vue頁面中:
<!--省略了無關代碼-->
<template>
  <div class="product">
    <product-param v-bind:title="product.name">
      <template v-slot:buy>
        <button class="btn" @click="buy">立即購買</button>
      </template>
    </product-param>
    <div class="content">
      <div class="item-bg">
        <h2>{{product.name}}</h2>
        <h3>{{product.subtitle}}</h3>
        <div class="price">
          <span><em>{{product.price}}</em></span>
        </div>
      </div>
  </div>
</template>
    <script>
  export default{
    name:'product',
    data(){
      return {
        product:{},//商品信息
        }
      }
    },
    mounted(){
      this.getProductInfo();
    },
    methods:{
      getProductInfo(){
        let id = this.$route.params.id;
        this.axios.get(`/products/${id}`).then((res)=>{
          this.product = res;
        })
      },
      buy(){
        let id = this.$route.params.id;
        this.$router.push(`/detail/${id}`); //跳轉到商品詳情頁面
      }
    }
  }
</script>

(5)解決一個視頻模塊bug

問題:在調試時,用於頁面窗口變小時,視頻樣式出現問題。

  • 在文件product.vue中修改:
       <div class="video-bg" @click="showSlide='slideDown'"></div>
        <div class="video-box"  v-show="showSlide">
          <div class="overlay"></div>
          <div class="video" v-bind:class="showSlide">
            <span class="icon-close" @click="closeVideo'"></span>
            <video src="/imgs/product/video.mp4" muted autoplay controls="controls"></video>
          </div>
        </div>
<script>
  export default{
    name:'product',
    data(){
      return {
        showSlide:'',//控制動畫效果
      },
      methods: {
      	 closeVideo(){
        	this.showSlide='slideUp';
        	setTimeout(()=>{
          	this.showSlide='';
        },600)
      }
      }
    }
  }
</script>

商品詳情頁面

(1)清除浮動

  • 在需要清除浮動的頁面:
<div class="item-version clearfix">
     <div class="phone fl" :class="{'checked':version==1}" @click="version=1">6GB+64GB 全網通</div>
     <div class="phone fr" :class="{'checked':version==2}" @click="version=2">4GB+64GB 移動4G</div>
</div>

在base.scss文件中:

.clearfix:before,.clearfix:after{
  content:' ';
  display:table;
}
.clearfix:after{
  clear: both;
}

(2)交互實現

  • 在detail.vue文件中:
<script>
export default{
  name:'detail',
  data(){
    return {
      err:'',
      id: this.$router.params.id,
      Product: {},
    }
  },
  mounted(){
    this.getProductInfo();
  },
  methods:{
    getProductInfo() {
      this.axois.get(`/product/${this.id}`).then((res) => {
        this.Product = res;
      })
    },
    addCart() {
      this.axios.post('/carts', {
        productId: this.id,
        selected: true
      }).then((res = {cartProductVoList:0}) => {
        this.$store.dispatch('saveCartCount', res.cartProductVoList.length);
        this.$router.push('/cart');
      }).catch((res) => {
        this.error = res;
      })
    }
  }
}
</script>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章