赞
踩
现在把导航的数据放入 data,通过 v-for 循环展示,然后给导航增加 click 事件,点击跳转对应页面(要跳转的页面暂时没有,后边会新增)
<template> <view class="content"> <!--轮播图--> ...... <!--导航--> <view class='nav'> <view class='nav_item' v-for="item in navs" @click='navItemClick(item.path)'> <view :class="item.icon"></view> <text>{{item.title}}</text> </view> </view> <!--推荐商品--> ...... </view> </template> <script> export default { data() { return { ...... navs:[ { icon:'iconfont icon-shangpin', title:'uni-超市', path:'/pages/goods/goods' }, { icon:'iconfont icon-xinxi', title:'联系我们', path:'/pages/contact/contact' }, { icon:'iconfont icon-tuku', title:'社区图片', path:'/pages/pics/pics' }, { icon:'iconfont icon-diannao', title:'学习视频', path:'/pages/videos/videos' } ] } }, ...... methods: { ...... //导航点击跳转 navItemClick(url){ uni.navigateTo({ url }) } } } </script> ......
接下来写商品列表页面,由于商品列表页的样式和首页的推荐商品是一样的,所以创建一个商品列表组件,我们在根目录下创建 components/goods-list/goods-list.vue,内容就是 index.vue 中的商品列表,同时样式也要记得剪切过来
<template> <view class="goods_list"> <view class="goods_item" v-for="item in goods"> <image :src="item.goods_big_logo"></image> <view class="price"> <text>{{item.goods_price}}</text> <text>¥2499</text> </view> <view class="name"> <text>{{item.goods_name}}</text> </view> </view> </view> </template> <script> export default { name:"goods-list", props:['goods'], data() { return { }; } } </script> <style lang="scss"> .goods_list{ padding: 0 15rpx; display: flex; flex-wrap: wrap; justify-content: space-between; .goods_item{ background: #fff; width: 355rpx; margin: 10px 0; padding: 15rpx; box-sizing: border-box; image{ width: 80%; height: 150px; display: block; margin: 5px auto; } .price{ color: $shop-color; font-size: 36rpx; text:nth-child(2){ color: #ccc; font-size: 28rpx; margin-left: 17rpx; text-decoration: line-through; } } .name{ font-size: 28rpx; line-height: 50rpx; padding-bottom: 15rpx; padding-top: 10rpx; } } } </style>
看上边的代码,由于是 v-for 循环展示,所以需要接收 index.vue 中传过来的商品列表数据,所以用 props
接收 goods 数据
我们修改 index.vue,使用 import
引入刚才写的商品列表组件,然后在 components
中注册,最后在页面中使用,同时传入 goods 数据即可
<template> <view class="content"> ...... <!--推荐商品--> <view class="hot_goods"> <view class="title">推荐商品</view> <goods-list :goods='goods'></goods-list> </view> </view> </template> <script> import goodsList from '@/components/goods-list/goods-list.vue' export default { data() { return { ...... } }, onLoad() { ...... }, components:{ 'goods-list':goodsList }, methods: { ...... } } </script> ......
运行结果和之前一样
现在继续商品列表页,修改 goods.vue
<template> <view> <goods-list :goods='goods'></goods-list> </view> </template> <script> import goodsList from '../../components/goods-list/goods-list.vue' export default { data() { return { goods:[] } }, onLoad() { this.getGoodsList() }, components:{ 'goods-list':goodsList }, methods: { async getGoodsList(){ const res = await this.$myRequest({ url:'/api/public/v1/goods/search', data:{ query:'零食' } }) this.goods = res.data.message.goods } } } </script> <style lang="scss"> .goods_list{ background: #eee; } </style>
同时修改 pages.json,修改这个页面的标题:
{
"pages": [
......
,{
"path" : "pages/goods/goods",
"style" :
{
"navigationBarTitleText": "商品列表"
}
}
],
......
}
运行程序,点击 uni-商城即可跳转这个商品列表页:
我们之前已经讲了下拉刷新、上拉加载。我们根据之前学习过的课程写就可以了
要想实现上拉加载更多,就要监听onReachBottom
事件,让当前页 +1,再次请求商品列表数据,把数据追加到 当前 goods 数据中即可
为了更好的展示数据,我们修改 getGoodsList
方法,传入参数 query
来搜索关键词"宝宝零食",pagesize
来限定每页加载10条数据,pagenum
来限定请求第几页的数据
在 data 中增加变量 curPage
来方便修改页码
我们在页面增加一个 view,在数据加载完成时展示“我是有底线的”,用变量 flag 来表示展示与否,开始为 false,不展示。当数据加载完成时,修改为 true,展示
如何判断数据是否加载完成呢?正常情况下会返回总页数,用总页数和当前页数作比较即可得出是否加载完成,由于我们的测试数据没有返回总页数,我们可以换一种方式判断,由于我们每页加载10条数据,同时也知道当前页码,所以可以根据当前全部 goods 数据的长度和 当前页面*10 作比较即可
我们来看下整个过程:当上拉页面触底时,onReachBottom
被调用,判断数据是否加载完成,如果加载完成,把 flag 置为 true,展示“我是有底线的”,return,不走下面的加载数据代码;如果没有加载完成,则把当前页 +1,同时调用获取数据列表方法即可
<template> <view> <goods-list :goods='goods'></goods-list> <view class="isOver" v-if="flag">-----我是有底线的-----</view> </view> </template> <script> import goodsList from '../../components/goods-list/goods-list.vue' export default { data() { return { goods:[], curPage:1, flag:false } }, onLoad() { this.getGoodsList() }, components:{ 'goods-list':goodsList }, methods: { async getGoodsList(){ const res = await this.$myRequest({ url:'/api/public/v1/goods/search', data:{ query:'宝宝零食', pagesize:10, pagenum:this.curPage, } }) this.goods = [...this.goods,...res.data.message.goods] } }, onReachBottom() { if(this.goods.length < this.curPage*10) return this.flag = true this.curPage++ this.getGoodsList() } } </script> <style lang="scss"> .goods_list{ background: #eee; } .isOver{ width: 100%; height: 50rpx; line-height: 50rpx; background: #eee; text-align: center; font-size: 28rpx; } </style>
运行程序:
要实现下拉刷新,首先需要在 pages.json 中增加 enablePullDownRefresh
{
"path" : "pages/goods/goods",
"style" :
{
"navigationBarTitleText": "商品列表",
"enablePullDownRefresh": true
}
}
然后修改 goods.vue
...... <script> ...... export default { ...... methods: { async getGoodsList(callback) { ...... this.goods = [...this.goods, ...res.data.message.goods] callback && callback() } }, ...... onPullDownRefresh() { this.curPage = 1 this.flag = false this.goods = [] setTimeout(()=>{ this.getGoodsList(()=>{ uni.stopPullDownRefresh() }) },1000) } } </script> ......
运行程序:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。