React实战项目—04首页数据接口联调

404 阅读2分钟

这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战

一、 使用fetch获取轮播图数据

git地址

https://github.com/liujun8892/reactshop

1.1 先测试接口是否正常返回数据

componentDidMount(){
    this.getSwiperData()
    new Swiper('.swiper-container', {
        loop:true,
        autoplay: 3000,//可选选项,自动滑动
        pagination : '.swiper-pagination',
        autoplayDisableOnInteraction : false
    })
    window.addEventListener('scroll', this.handlePageScroll.bind(this), false)
}
// 获取轮播图数据
getSwiperData() {
    fetch(`http://vueshop.glbuys.com/api/home/index/slide?token=1ec949a15fb709370f`)
        .then(res => {
            return res.json()
        }).then(res => {
        console.log(res,'轮播图数据')
    })
}

获取数据正常

截屏2021-08-16 上午4.53.05.png

1.2 完成数据的渲染

state中
this.state = {
    // 滚动导航栏变色开关
    isScroll: false,
    aSwiper: []
}

fetch中
if(res.code === 200) {
    this.setState({
        aSwiper: res.data
    }, () => {
        new Swiper('.swiper-container', {
            loop:true,
            autoplay: 3000,//可选选项,自动滑动
            pagination : '.swiper-pagination',
            autoplayDisableOnInteraction : false
        })
    })
}

render中
{this.state.aSwiper.map((item,index) => (
    <div className="swiper-slide" key={index}>
        <a href={item.webs} target='_blank' rel='noreferrer noopener'>
            <img src={item.image} alt={item.title}/>
        </a>
    </div>
))}

轮播图渲染成功

image.png

1.3 解决fetch兼容性问题

1. 安装
npm i whatwg-fetch --save
2. 在src/index.js中引入
import 'whatwg-fetch'

1.4 配置本地开发代理,解决跨域问题

image.png

proxy:{
  "/proxy": {
    "target": "http://vueshop.glbuys.com",
    "changeOrigin": "true",
    "pathRewrite": {
      "^/proxy":""
    }
  }
},

1.5 封装fetch请求

js/conf/config.js

let prodUrl="http://vueshop.glbuys.com";
let devUrl="/proxy";
let baseUrl=process.env.NODE_ENV==='development'?devUrl:prodUrl;
export default {
    baseUrl:baseUrl,
    path:"/",
    token:"1ec949a15fb709370f"
}

js/libs/request.js
import config from  '../conf/config'

function request(url,method = 'get') {
    return  fetch(`${config.baseUrl}${url}?token=${config.token}`,{method: method})
        .then(res => res.json())
}

export {request}

首页通过封装的request获取数据
import {request} from "../../../assets/js/libs/request";
request('/api/home/index/slide')
    .then(res => {
        if(res.code === 200) {
            this.setState({
                aSwiper: res.data
            }, () => {
                new Swiper('.swiper-container', {
                    loop:true,
                    autoplay: 3000,//可选选项,自动滑动
                    pagination : '.swiper-pagination',
                    autoplayDisableOnInteraction : false
                })
            })
        }
    })

二、获取快速导航栏数据

componentDidMount(){
    this.getSwiperData()
    this.getQuickNavs()
    window.addEventListener('scroll', this.handlePageScroll.bind(this), false)
}


// 获取快速导航栏数据
getQuickNavs() {
    request('/api/home/index/nav')
        .then(res => {
            if(res.code === 200) {
                this.setState({
                    quickNavs: res.data
                })
            }
        })
}


<div className="quick-nav">
    {this.state.quickNavs.map((item,index) => (
        <div className="quick-nav-item" key={index}>
            <img src={item.image} alt={item.title} className="nav-icon" />
            <span className="nav-title">{item.title}</span>
        </div>
    ))}

</div>

渲染成功

image.png

三、显示主商品列表数据

// 获取主商品数据
getMainGoodsList() {
    request('/api/home/index/goodsLevel')
        .then(res => {
            if(res.code === 200) {
                this.setState({
                    mainGoodsList: res.data
                })
            }
        })
}

截屏2021-08-16 上午6.15.16.png

使用www.json.cn/ 在线解析数据

截屏2021-08-16 上午6.17.23.png

后面使用双层循环遍历渲染数据

{this.state.mainGoodsList.map((item,index) => (
    <div className="recommend-list" key={index}>
        <div className={index === 0 ? "title title-red" : index === 1 ? 'title title-orange': 'title title-green'} >
            —— {item.title} ——
        </div>
        <div className="goods-level-1">
            {index % 2 === 1? (
                item.items.slice(0,2).map((item2,index2) => (
                    <div className="goods-level-1-3 goods-level-1-3-left" key={index2}>
                        <div className="level-1-3-title">{item2.title}</div>
                        <div className="level-1-3-desc">火爆开售</div>
                        <img className="level-1-3-img" src={item2.image} alt={item.title} />
                    </div>
                ))
            ) : (
                <React.Fragment>
                    <div className="left">
                        <div className="goods-name">
                            {item.items[0].title}
                        </div>
                        <div className="goods-desc">
                    <span className="goods-text">
                        精品打折
                    </span>
                            <span className="goods-price">
                         {item.items[0].price}元
                    </span>
                        </div>
                        <div className="goods-img">
                            <img src={item.items[0].image} alt={item.items[0].title} />
                        </div>
                    </div>
                    <div className="right">
                        <div className="right-items top">
                            <div className="left-goods">
                                <div className="main-title">{item.items[1].title}</div>
                                <div className="sub-title">品质精挑</div>
                            </div>
                            <div className="goods-right">
                                <img src={item.items[1].image} alt={item.items[0].title} />
                            </div>
                        </div>
                        <div className="right-items">
                            <div className="left-goods">
                                <div className="main-title">{item.items[2].title}</div>
                                <div className="sub-title">品质精挑</div>
                            </div>
                            <div className="goods-right">
                                <img src={item.items[2].image} alt={item.items[2].title}/>
                            </div>
                        </div>
                    </div>
                </React.Fragment>
            )}
        </div>
        <div className="goods-level-2">
            {item.items.slice(index % 2 === 1 ? 2 : 3).map((item2,index2) => (
                <div className="goods-level-2-item" key={index2}>
                    <div className="level-2-title">
                        {item2.title}
                    </div>
                    <img className="level-2-img" src={item2.image} />
                    <div className="level-2-current-price">
                        ¥{item2.price}
                    </div>
                    <div className="level-2-old-price">
                        ¥ <span>{item2.price *2}</span>
                    </div>

                </div>
            ))}
        </div>
    </div>
))}

四、获取商品推荐列表数据

getRecommendGoodsList() {
    request('/api/home/index/recom')
        .then(res => {
            console.log(res,'获取商品推荐数据')
            if(res.code === 200) {
                this.setState({
                    recommendGoodsList: res.data
                })
            }
        })
}

<div className="goods-list">
    {this.state.recommendGoodsList.map((item,index) => (
        <div className="goods-item" key={index}>
            <div className="goods-content">
                <img className="goods-cover" src={item.image} alt={item.title}/>
                <div className="goods-title">{item.title}</div>
                <div className="goods-price">¥{item.price}.00</div>
            </div>
        </div>
    ))}
</div>

好了,首页的接口就调完了, 效果如下

Kapture 2021-08-16 at 07.02.56.gif