学习coderwhy老师利用vue开发supermall

网络请求request.jsimport axios from 'axios'export function request(config) { // 1、创建axios的实例 const instance = axios.create({ baseURL: 'http://', timeout: 5000 }) // 2、axios的拦截器 // 2...
摘要由CSDN通过智能技术生成

网络请求

request.js

import axios from 'axios'

export function request(config) {
   
  // 1、创建axios的实例
  const instance = axios.create({
   
    baseURL: 'http://',
    timeout: 5000
  })

  // 2、axios的拦截器
  // 2.1. 请求拦截的作用
  instance.interceptors.request.use(config =>{
   
    return config
  }, err => {
   
    console.log(err)
  })

  // 2.2. 响应拦截
  instance.interceptors.response.use(res => {
   
    return res.data
  }, err => {
   
    console.log(err);
  })

  // 3、发送真正的网络请求
  return instance(config)
}

home.js

  • home页面到网络请求单独放在一个js中 home.js
import {
   request} from "./request";

// 首页的网络请求都从这边发出
export function getHomeMultiData() {
   
  return request({
   
    url: '/home/multidata'
  })
}

export function getHomeGoods(type, page) {
   
  return request({
   
    url: '/home/data',
    params: {
   
      type,
      page,
    }
  })
}

detail.js

  • 商品细节页面到网络请求 detail.js
import {
   request} from './request'

export function getDetail(iid) {
   
  return request({
   
    url: '/detail',
    params: {
   
      iid,
    }
  })
}

export function getRecommend() {
   
  return request({
   
    url: '/recommend',
  })
}

export class Goods {
   
  constructor(itemInfo, columns, services) {
   
    this.title = itemInfo.title
    this.desc = itemInfo.desc
    this.newPrice = itemInfo.price
    this.oldPrice = itemInfo.oldPrice
    this.discount = itemInfo.discountDesc
    this.columns = columns
    this.services = services
    this.realPrice = itemInfo.lowNowPrice
  }
}

export class Shop {
   
  constructor(shopInfo) {
   
    this.logo = shopInfo.shopLogo
    this.name = shopInfo.name
    this.fans = shopInfo.cFans
    this.sells = shopInfo.cSells
    this.score = shopInfo.score
    this.goodsCount = shopInfo.cGoods
  }
}

export class GoodsParam {
   
  constructor(info, rule) {
   
    // images可能没有值(某些商品有值,某些商品没有值)
    this.image = info.images ? info.images[0] : ''
    this.infos = info.set
    this.sizes = rule.tables
  }
}

代码与思路

home页面

一、导航栏封装成组件

  • 分了左、中、右三个插槽,使用的使用随意用

  • 让文字居中

    display: flex;
    text-align: center;
    

二、轮播图(直接拿的组件)

三、推荐目录RecommendView

  • 从网络接口中获取数据

    import {
         getHomeMultiData, getHomeGoods} from "network/home";
    
    getHomeMultiData(){
         
            // getHomeMultiData()表示调用方法
            getHomeMultiData().then(res =>{
         
              // this.result = res;
              // res和result指向同一个对象 即使res被回收 result也有值
              this.banners = res.data.banner.list;
              this.recommends = res.data.recommend.list;
            })
          }
    
  • 父组件获取数据后传递给子组件,子组件进行展示

<template>
    <div class="recommend">
      <div v-for="item in recommends" class="recommend-item">
        <a :href="item.link">
          <img :src="item.image" alt="">
          <div>{
  {item.title}}</div>
        </a>
      </div>
    </div>
</template>

<script>
  export default {
    name: "RecommendView",
    props: {
      recommends: {
        type: Array,
        default() {
          return [];
        }
      }
    }
  }
</script>

四、FeatureView

  • 独立组件封装FeatureView

    • div>a>img

五、TabControl

  • 独立组件封装
    • props -> titles
    • div->根据titles v-for遍历 生成多少个div div->span{ {title}}
    • css相关
    • 选中哪一个tab,哪一个tab文字颜色变色,并且下面border-bottom
      • currentIndex
<template>
  <div class="tab-control">
    <div v-for="(item,index) in titles"
         class="tab-control-item" 
         :class="{active: index === currentIndex}" @click="itemClick(index)">
      <span>{
  {item}}</span>
    </div>
  </div>
</template>

<script>
  export default {
    name: "TabControl",
    props: {
      titles: {
        type: Array,
        default() {
          return []
        }
      }
    },
    data() {
      return {
        currentIndex: 0,
      }
    },
    methods: {
      itemClick(index) {
        this.currentIndex = index;
      //  内部数据往外面传送,点击后下面展示的数据也随之改变
        this.$emit('tabClick', index)
      }
    }
  }
</script>

<style scoped>
  .tab-control{
    display: flex;
    text-align: center;
    font-size: 15px;
  }

  .tab-control-item{
    flex: 1;
    height: 40px;
    line-height: 40px;
  }

  .tab-control-item span{
    padding: 5px;
  }

  .active {
    color: var(--color-high-text);
  }

  .active span{
    border-bottom: 3px solid var(--color-tint);
  }
</style>

六、首页商品数据的请求

6.1设计数据结构,用于保存数据
goods: {
          'pop
  • 12
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值