开始前,请先完成首页的开发,详见

【微信小程序-原生开发】实用教程05-首页(含自定义调试模式、插入图片、图文排版、底部留白、添加本地图片)
https://blog.csdn.net/weixin_41192489/article/details/128729732

需求描述

今天整个稍微复杂点的,效果如下:


但在开始前,我们需要做几项其他的准备

升级到最新版的 Tdesign 组件库

按教程01 默认模板创建的项目的 Tdesign 组件不是最新版的,需手动升级一下,操作流程如下:

  1. 打开终端,执行命令
cnpm i tdesign-miniprogram -S --production

未安装 cnpm 的朋友,先执行 npm i cnpm 安装 cnpm


2. 执行 npm 构建

切换为最新版的调试基础库

默认的调试基础库版本比较低,请按下图进行切换

调整全局样式

通过 app.wxss 可以设置全局样式,以便所有页面共享,现将 app.wxss 里的代码全部替换为下方代码:

/* app.wxss 定义全局样式 */
page {/* 默认页面底色设置为白色 */background: white;/* 底部留白的高度需与底部导航的高度相同 */padding-bottom: 100rpx;
}

有了全局样式后,便可删除首页中底部的占位区间啦!

pages\index\index.wxml

<view class="blankBar">
</view>

pages\index\index.wxss

.blankBar {/* 底部留白的高度需与底部导航的高度相同 */height: 100rpx;
}

配置组件按需注入

修改全局配置文件 app.json

  • 删除 usingComponents 配置
  • 添加 lazyCodeLoading 配置
  "lazyCodeLoading": "requiredComponents",

这两项配置的改变,都是为了实现组件按需注入,从而提升微信小程序的加载和渲染速度。

添加网络图片素材

因微信小程序的限制,图片视频等媒体素材总大小不能超过200k,所以图片需先上传到 CDN 后引入其网址使用。

让我们将图片的网址整理存到 assets文件夹中(无相关路径的文件夹或文件,请自行创建)

assets\images\美女\data.js

export default {'1':'https://img-blog.csdnimg.cn/6dca0e87288a4c37b76e7d26e016e299.jpeg','2':'https://img-blog.csdnimg.cn/8dd7ab28ae6246b69a1722b3ad18d506.jpeg'
}

assets\images\帅哥\data.js

export default {'1':'https://img-blog.csdnimg.cn/de253e12408f4133adf8f82982e22ce5.jpeg','2':'https://img-blog.csdnimg.cn/e9fb6f4e461744e593ca305440760e16.jpeg','3':'https://img-blog.csdnimg.cn/63926e3235434cd8bd30285f5612d303.jpeg','4':'https://img-blog.csdnimg.cn/601a29123c17471dac01e358dce8e1fe.jpeg',
}

代码实现

准备工作完毕,终于可以开始开发啦!

我先给出最终的总代码,然后分别解析各部分的核心实现哈:

pages\member\index.json

{"usingComponents": {"t-swiper": "tdesign-miniprogram/swiper/swiper","t-tabs": "tdesign-miniprogram/tabs/tabs","t-tab-panel": "tdesign-miniprogram/tab-panel/tab-panel","t-avatar": "tdesign-miniprogram/avatar/avatar"}
}

pages\member\index.wxml

<!-- 轮播图 -->
<view class="swiperBox"><t-swiper image-props="{{imageProps}}" current="{{current}}" autoplay="{{autoplay}}" duration="{{duration}}" interval="{{interval}}" list="{{swiperList}}" navigation="{{ { type: 'dots-bar' } }}" />
</view>
<!-- 分类页签 tab -->
<t-tabs defaultValue="{{defaultTab}}" theme="card" bindchange='tabChange'><t-tab-panel wx:for="{{tabList}}" wx:key="index" label="{{item.label}}" value="{{item.index}}" />
</t-tabs>
<!-- 成员列表 -->
<view wx:for="{{filteredMemberList}}" wx:key="index" class="memberBox"><t-avatar class="avatar-example" shape="round" image="{{item.imgURL}}" /><view class="memberName">{{item.name}}</view><view class="memberStaus">{{item.status}} ing</view>
</view>

pages\member\index.wxss

.swiperBox{padding: 30rpx;
}.memberBox{padding: 20rpx;display: flex;align-items: center;border-bottom: 1rpx solid rgb(223, 217, 217);background-color: #ffffff;
}.memberName{font-weight: bold;font-size: 40rpx;padding-left: 30rpx;
}.memberStaus{padding-left: 40rpx;
}

pages\member\index.js

// 导入图片素材
import girlImgDic from '../../assets/images/美女/data'
import boyImgDic from '../../assets/images/帅哥/data'
Page({data: {// 添加轮播图片的属性imageProps: {// 图片按宽度自适应mode: 'widthFix'},// 轮播从下标为 0 的图片开始current: 0,// 自动轮播autoplay: true,//  每张图片的停留时间duration: 500,// 轮播时间间隔interval: 5000,// 轮播图的图片列表swiperList: [girlImgDic['1'],girlImgDic['2'],boyImgDic['4'],],// 默认 tab 页签的 indexdefaultTab: '0',// 分类页签 tab 列表tabList: [{index: '0',label: '全部'},{index: '1',label: '男'},{index: '2',label: '女'},],// 过滤后的成员列表filteredMemberList: [],// 总成员列表,其中 gender '1'为男,'2'为女allMemberList: [{imgURL: girlImgDic['1'],name: '小霞',gender: '2',status: '筹备婚礼'},{imgURL: girlImgDic['2'],name: '若依',gender: '2',status: '享受泡澡'},{imgURL: boyImgDic['1'],name: '约翰',gender: '1',status: '忧郁'},{imgURL: boyImgDic['2'],name: '陈翔',gender: '1',status: '思考'},{imgURL: boyImgDic['4'],name: '李阳',gender: '1',status: '沉醉'},]},// 切换页签时触发tabChange: function (e) {let gender = e.detail.valueif (gender !== '0') {this.setData({filteredMemberList: this.data.allMemberList.filter(item => item.gender === gender)})} else {this.setData({filteredMemberList: this.data.allMemberList})}},// 生命周期--页面加载时执行onLoad(options) {this.setData({filteredMemberList: this.data.allMemberList})},onShow() {this.getTabBar().init();},
})

轮播图

组件文档见
https://tdesign.tencent.com/miniprogram/components/swiper

<!-- 轮播图 -->
<view class="swiperBox"><t-swiper image-props="{{imageProps}}" current="{{current}}" autoplay="{{autoplay}}" duration="{{duration}}" interval="{{interval}}" list="{{swiperList}}" navigation="{{ { type: 'dots-bar' } }}" />
</view>
.swiperBox{padding: 30rpx;
}
    // 添加轮播图片的属性imageProps: {// 图片按宽度自适应mode: 'widthFix'},// 轮播从下标为 0 的图片开始current: 0,// 自动轮播autoplay: true,//  每张图片的停留时间duration: 500,// 轮播时间间隔interval: 5000,// 轮播图的图片列表swiperList: [girlImgDic['1'],girlImgDic['2'],boyImgDic['4'],],

重点留意:

  1. 需设置 padding,因默认效果轮播图是圆角的,直接紧挨手机边缘不美观
  2. 需设置轮播图片的适配模式 widthFix,以便按手机宽度自适应。

分类页签 tab

<!-- 分类页签 tab -->
<t-tabs defaultValue="{{defaultTab}}" theme="card" bindchange='tabChange'><t-tab-panel wx:for="{{tabList}}" wx:key="index" label="{{item.label}}" value="{{item.index}}" />
</t-tabs>
    // 默认 tab 页签的 indexdefaultTab: '0',// 分类页签 tab 列表tabList: [{index: '0',label: '全部'},{index: '1',label: '男'},{index: '2',label: '女'},],

重点留意:页签的切换事件

  // 切换页签时触发tabChange: function (e) {let gender = e.detail.valueif (gender !== '0') {this.setData({filteredMemberList: this.data.allMemberList.filter(item => item.gender === gender)})} else {this.setData({filteredMemberList: this.data.allMemberList})}},

此处因未访问接口,只是前端按性别字段,对成员列表进行了过滤。

成员列表

<!-- 成员列表 -->
<view wx:for="{{filteredMemberList}}" wx:key="index" class="memberBox"><t-avatar class="avatar-example" shape="round" image="{{item.imgURL}}" /><view class="memberName">{{item.name}}</view><view class="memberStaus">{{item.status}} ing</view>
</view>
.memberBox{padding: 20rpx;display: flex;align-items: center;border-bottom: 1rpx solid rgb(223, 217, 217);background-color: #ffffff;
}.memberName{font-weight: bold;font-size: 40rpx;padding-left: 30rpx;
}.memberStaus{padding-left: 40rpx;
}

样式部分即最基础的 flex 布局,注意提一下 wxml 中的新语法 wx:for

wx:for

类似 vue 中的 v-for,用于循环遍历渲染列表,注意其书写格式

  • 无需在 wx:for 中声明,index 即下标
  • 无需在 wx:for 中声明,item 即被遍历的每一项
wx:for="{{filteredMemberList}}" wx:key="index"
  <view class="memberName">{{item.name}}</view>

生命周期 onLoad

本例中,最终渲染的成员列表是 filteredMemberList,但其在最开始是空的,需在页面加载时,赋予初始值 allMemberList,故需使用页面加载时的生命周期 onLoad

  // 生命周期--页面加载时执行onLoad(options) {this.setData({filteredMemberList: this.data.allMemberList})},

【微信小程序-原生开发】实用教程06-轮播图、分类页签 tab 、成员列表(含Tdesign升级,切换调试基础库,设置全局样式,配置组件按需注入,添加图片素材,wx:for,生命周期 onLoad)相关推荐

  1. 微信小程序轮播图中间变大_微信小程序实现带放大效果的轮播图

    本文实例为大家分享了微信小程序实现带放大效果的轮播图,供大家参考,具体内容如下 效果如图 WXML WXSS .Carousel{ margin-top: 49px; background-color ...

  2. 微信小程序前端动态获取最新的轮播图优化

    现在我们有一个这样的需求 就是后台改了轮播图的图片以及更新或者换位置 这是前端不能即使知道 就需要用到websocket 这样做虽然很简单但代码量也很大 所以我想出了一个方案: 思路 : 1.既然我们 ...

  3. 微信小程序用swiper做旋转木马缩放轮播图

    主要还是用到css3的特性,利用transition动画和transform:scal()属性. wxml <view class="vip-center-container" ...

  4. 【微信小程序-原生开发】watch 的实现

    微信小程序-原生开发本身并没有 vue 中 watch 的功能,可以通过以下方式实现 定义监听器 utils\watch.js /*** 设置监听器*/ export function setWatc ...

  5. 【微信小程序-原生开发】实用教程08 - 开通微信云开发,操作云数据库新增数据(含修改数据权限),初始化云服务(含获取微信云环境 id),获取云数据,滚动公告栏

    开始前,请先完成圆梦宝典中宫格导航的开发,详见 [微信小程序-原生开发]实用教程 07 - Grid 宫格导航,详情页,侧边导航(含自定义页面顶部导航文字) https://blog.csdn.net ...

  6. 【微信小程序-原生开发】实用教程09 - 可滚动选项,动态列表-步骤条(含事件传参),动态详情(含微信云查询单条数据 doc)

    开始前,请先完成圆梦宝典中滚动公告栏的开发,详见 [微信小程序-原生开发]实用教程 08 - 开通微信云开发,操作云数据库新增数据(含修改数据权限),初始化云服务(含获取微信云环境 id),获取云数据 ...

  7. 【微信小程序-原生开发】实用教程20 - 生成海报(实战范例为生成活动海报,内含生成指定页面的小程序二维码,保存图片到手机,canvas 系列教程)

    可在系列教程的基础上继续开发,也可以单独使用 [微信小程序-原生开发]系列教程 效果预览 代码实现 点击触发生成海报 在活动详情页,指定点击某图标/按钮,触发跳转到生成海报的页面 pages\comp ...

  8. 【微信小程序-原生开发】实用教程05-首页(含自定义调试模式、插入图片、图文排版、底部留白、添加本地图片)

    开始前,请先完成启动/欢迎/首屏广告页的开发,详见 [微信小程序-原生开发]实用教程04-启动/欢迎/首屏广告页(含倒计时.添加文字.rpx.定义变量和函数.读取变量.修改变量.wx.reLaunch ...

  9. 【微信小程序-原生开发】实用教程02-添加全局页面配置、页面、底部导航

    开始前,请先完成项目创建,详见 [微信小程序-原生开发]实用教程01-注册登录账号,获取 AppID.下载安装开发工具.创建项目.上传体验 前期准备 因我们的项目是根据模板创建的,需先清理掉无效的页面 ...

最新文章

  1. ylb:SQL 表的高级查询-多表连接和子查询
  2. 0基础java应聘_不想搞Java了,6年经验去面试10分钟结束,现在Java面试为这么难...
  3. 盘点分库分表中,你一定要避开的那些坑!
  4. 鸿蒙硬件HI3861-连接WIFI
  5. VMware-vRealize-Log-Insight-8.2.0.0安装部署指南
  6. idea生成类中序列化id
  7. SocketServer模块中的几种类
  8. linux 0891端口,凯立德导航专用版本号及分辨率、端口、波特率
  9. ios 基础知识点总结
  10. php工程师绩效考核表_如何对程序员绩效考核?
  11. 【ELIXIR】简单说下elixir的历史
  12. 计算机桌面为什么没有语言栏了,电脑还原桌面的时候语言栏里怎么什么都没有了,只有到打字的时候才显示 ,这是为什么啊...
  13. 基于机器学习算法的LTE高投诉小区预判方法
  14. 大数据的应用场景你知道哪些?
  15. Android任务栈的理解
  16. android动态请求权限
  17. 实时即未来,车联网项目之远程诊断实时故障分析【七】
  18. 7-35 猴子吃桃问题 (15 分) 一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到
  19. windows安装配置opencv opencv_contrib
  20. 会声会影和pr到底哪个好,2023年要学那个视频剪辑软件好?

热门文章

  1. 什么是磁盘克隆软件?为什么需要它?
  2. 微信小程序内容安全校验(遇到的问题解决方案)
  3. 4800万像素超级夜景最强自拍,这才是摄影旗舰该有的样子
  4. vue项目中引入bootstrap的方法
  5. 支持苹果IPV6 ONLY 的socket 修改方法
  6. 研究 | 健康大数据平台的“区块链治理”
  7. js跳转到指定url
  8. 无人机不能解锁四个电机发出滴滴滴的声音
  9. Linux折腾触摸屏,最近有一个触摸屏想接入到Linux 上面,从网上购买了LVDS驱动板,转成HDMI信号然后做Linux系统输出,屏幕旋转后,使用xinput-calibrator解决触摸屏错乱
  10. SIM卡ICCID的编码方案