微信小程序开发—入门到跑路(二)

news2024/11/28 8:47:46

1、学习目标

知识点名称知识点内容难度系数要求程度
模板语法数据绑定、事件绑定、条件渲染、列表渲染2星掌握
WXSS样式WXSS3星掌握
配置操作全局配置、TabBar配置、页面配置、3星掌握
网络请求和案例网络数据请求、本地生活案例3星掌握

文章目录

    • 1、学习目标
    • 2、模板语法
      • 2.1、数据绑定
        • 数据绑定原则
        • 动态绑定属性
      • 2.2、事件绑定
        • 什么是事件
        • bindTap 的语法格式
        • 事件对象
        • target 和 currentTarget 的区别
        • 为 data 中的数据赋值
        • 事件传参
        • bindinput的语法格式
        • 模拟数据双向绑定
      • 2.3、条件渲染
        • if..elif..else
        • 基于 block 标签使用 if 条件判断
        • hidden
        • if 和 hidden 的区别
      • 2.4、列表渲染
        • wx:for
        • 手动指定索引和当前项的变量名
        • wx:key 的使用
    • 3、WXSS样式
        • 什么是 wxss及和 css 之间的关系
        • 什么是 rpx 及实现原理
        • rpx 与 px 以及设计稿之间的换算关系
        • @import 样式导入
        • 全局样式和局部样式
    • 4、配置操作
      • 4.1、全局配置
        • 全局配置文件以及常用的配置项
        • 小程序窗口的组成
      • 4.2、TabBar 配置
        • Tab bar的概念
        • TabBar 的组成部分
        • TabBar 节点的配置项
        • TabBar 案例
      • 4.3、页面配置
        • 页面配置文件的作用
        • 页面配置和全局配置的关系
    • 5、网络请求
      • 5.1、小程序中网络数据请求的限制
      • 5.2、配置 request 合法域名
      • 5.3、发起 GET 请求
      • 5.4、发起 POST 请求
      • 5.5、在页面刚加载时请求数据
      • 5.6、跳过 request 合法域名校验
        • 5.7、关于跨域和 AJAX 的说明
    • 5、案例
      • 5.1、案例效果
      • 5.2、实现思路
      • 5.3、代码实现

2、模板语法

2.1、数据绑定

思考

❓ Vue 中如何进行数据的渲染与属性绑定绑定?

  1. Vue 中重点使用 插值表达式 渲染数据
  2. 绑定的动态绑定使用 v-bind 语法或者 : 简写用法

数据绑定原则

1、基本原则

  • 在 data 中定义数据
  • 在 wxml 中使用数据

2、 在 data 中定义页面的数据

在页面对应的 .js 文件中,把数据定义在 data 对象中即可:

Page({
    data:{
        // 字符串类型的数据
        name:'小程序',
        
        // 数组类型的数据
        info:[
            {id:1,name:'Vue'},
            {id:2,name:'React'}
        ]
    }
})

3、Mustache 语法的格式

把 data 中的数据绑定到页面中渲染,使用 Mustache 语法 (双大括号) 将变量包起来即可。语法格式如下:

<view>
	<!--使用Mustache 语法渲染数据-->
    <view>{{ name }}</view>
    <view>{{ info[0].name }}</view>
</view>

动态绑定属性

1、Mustache 语法的应用场景

  • 绑定内容
  • 绑定属性
  • 运算(三元运算、算术运算符)

2、属性绑定

页面数据如下:

Page({
    data:{
        // 图片变量
        imgSrc: 'https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png'
    }
})

页面结构如下:

<view>
	<!--渲染图片-->
    <image src="{{ imgSrc }}" mode="aspectFit"></image>
</view>

3、三元运算

页面数据如下:

Page({
    data:{
        // 生成10以内的随机数
        randomNum: Math.random() * 10
    }
})

页面结构如下:

<view>
	<view>{{ randomNum >5  ? '随机数大于5' : '随机数小于5'  }}</view>
</view>

3、算术运算

页面数据如下:

Page({
    data:{
        // 生成100以内的随机数
        randomNumber: Math.random().toFixed(2)
    }
})

页面结构如下:

<view>
    <!--100以内的随机数-->
	<view>{{ randomNumber * 100 }}</view>
</view>

2.2、事件绑定

什么是事件

  1. 事件是视图层到逻辑层的通讯方式,事件可以将用户的行为或者组件的状态反馈到逻辑层进行处理

    在这里插入图片描述

  2. 小程序中常用的事件

在这里插入图片描述

bindTap 的语法格式

  1. 通过 bindtap,可以为组件绑定tap触摸事件
<button bindtap="btnHandle" type="warn">按钮</button>
  1. 页面的 .js中定义对应的事件处理函数
Page({
    btnHandle () {
        console.log('触发事件')
    }
})

事件对象

当事件回调触发的时候,会收到一个事件对象 event,它的详细属性如下:

在这里插入图片描述

target 和 currentTarget 的区别

  1. target 是触发该事件的源头组件
  2. currentTarget 则是当前事件所绑定的组件

在这里插入图片描述

  1. 点击内部的按钮时,点击事件以 冒泡 的方式向外扩散,也会触发外层 view 的 tap 事件处理程序,此时,对于外层的view 来说:
    • e.target 指定的是触发事件的源头组件,因为 e.target 是内部的按钮组件
    • e.currentTarget 指向的是当前正在触发事件的那个组件,因此 e.currentTarget 是当前的 view 组件

为 data 中的数据赋值

通过调用 this.setData(dataObject) 方法,可以给页面 data 中的数据重新赋值

this.setData() 方法有两个作用:1. 更新数据2. 驱动视图更新

Page({
    data: {
        age:0
    },
    btnHandle (e) {
       this.setData({
           // 键需要更新的字段
           // 值为最新的数据
           age: this.data.age + 1
       })
    }
})

事件传参

  1. 事件传参错误方式

    小程序中的事件传参比较特殊,不能在绑定事件的同时为事件处理程序传递参数

    例如,下面的代码将不能正常工作,因为小程序会把 bindtap 的属性值,统一当作事件名称来处理,相当于要调用一个名称为 btnHandler(123) 的事件处理函数

    在这里插入图片描述

  2. 事件传参正确的方式

可以为组件提供 data-* 自定义属性传参,其中 *** 代表的是参数的名字**,示例代码如下:

<view>
	<!--正确的绑定方式-->
    <button bindtap="fn" data-id="{{ 123 }}">事件传参</button>
</view>

最终:

  • id 会被解析为 参数的名称
  • 数值 123 会被解析为参数的值
  1. 接收事件传递的参数

    在事件处理函数中, **通过 event.target.dataset.参数名 **即可获得 具体的参数的值,示例代码如下:

Page({
    fn (e) {
        // dataset 是一个对象,包含了所有通过 data-* 传递的参数
        console.log(e.target.dataset)
        // 通过dataset 可以访问到具体的参数值
        console.log(e.target.dataset.id)
    }
})

bindinput的语法格式

在小程序中,通过 input事件来响应文本框的输入事件,语法格式如下:

  1. 通过 bindinput,可以为文本框绑定输入事件
<input type="input" bindinput="inputFn"/>
  1. 在页面的.js 文件中定义事件处理函数
Page({
    inputFn (e) {
        // e.detail.value 是文本框最新的值
        console.log(e.detail.value)
    }
})

模拟数据双向绑定

  1. 定义数据
Page({
    data:{
        msg:'Hi~'
    }
})
  1. 渲染结构
<input type="text" value="{{ msg }}"  bindinput="inputFn" /> 
输入框的数据是==>  {{ msg }}
  1. 美化样式
input{
    border:1px solid #ccc;
    padding:5px;
    margin:5px;
    border-radius:3px;
}
  1. 书写事件函数
Page({
   inputFn(e){
       // e.detail.value 是文本框最新的值
       this.setData({
           msg:e.detail.value
       })
   }
})

总结概况

❓ 小程序中事件如何传递参数?

  1. 为组件提供 data-* 自定义属性传参,其中 * 代表的是参数的名字
  2. 在事件处理函数中,通过 event.target.dataset.参数名 即可获取到具体参数的值

总结概况

❓ 如何获取到输入框最新的值

  1. 给 input 框绑定点击事件
  2. 通过事件对象 e.detail.value 获取到输入框最新的值

总结概况

❓ this.setData() 方法的作用是什么

  1. 更新数据
  2. 驱动视图更新

2.3、条件渲染

思考

❓ Vue 中如何进行条件渲染?

  1. v-if……v-else-if……v-else
  2. v-show

思考

❓ Vue 中两种条件渲染的区别是什么?

  1. v-if 会确保在切换过程中,将条件块内的事件监听器和子组件适当地被销毁和重建
  2. v-show 不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换

if…elif…else

  1. 在框架中,使用 wx:if=“” 来判断是否需要渲染该代码块
<view wx:if="{{ condition  }}">True</view>
  1. 也可以用 wx:elifwx:else 来添加一个 else
<!--条件渲染-->
<view wx:if="{{ type === 1 }}"></view>
<view wx:elif="{{ type === 2 }}"></view>
<view wx:else>保密</view>

基于 block 标签使用 if 条件判断

如果要一次性判断多个组件标签,可以使用一个<block/> 标签将多个组件包装起来,并在上边使用 wx:if

制属性

<block wx:if="{{ true }}">
    <view>View1</view>
    <view>View2</view>
</block>

注意:<block/> 并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。

hidden

在小程序框架中,直接使用 hidden=“” 也能控制元素的显示与隐藏

<view hidden="{{ false }}">条件为true 隐藏, 条件false表示显示</view>

if 和 hidden 的区别

  1. 运行方式不同
    • wx:if 以动态创建和移除元素的方式,控制元素的展示与隐藏
    • hidden 以切换样式的方式(display: none/block),控制元素的显示和隐藏
  2. 使用建议
    • 频繁切换时,建议使用 hidden
    • 控制条件复杂时,建议使用 wx:if 搭配 wx:elif 、wx:else

2.4、列表渲染

思考

❓ Vue 中如何进行列表渲染 ?

使用 v-for 指令进行渲染,在渲染时给渲染的元素添加 :key 属性

思考

❓ key 的作用是什么 ?

指定列表中项目的唯一的标识符,让每一项保持自己的特征和状态

wx:for

  1. 通过 wx:for 可以根据指定的数组,循环渲染重复的组件结构
Page({
    data:{
        array:[
            { message:'Tom' },
            { message:'Jerrry' }
        ]
    }
})
<view wx:for="{{ array }}" wx:key="index">
   {{index}} :  {{ item.message }}
</view>
  1. 默认数组的当前项的下标变量名默认为 index,数组当前项的变量名默认为 item

手动指定索引和当前项的变量名

  1. 使用 wx:for-item 可以指定数组当前元素的变量名
  2. 使用 wx:for-index 可以指定数组当前下标的变量名
<view wx:for="{{ array }}" wx:for-item="itemName" wx:key-index="i" wx:key="i">
	{{ i }} : {{ itemName.message }}
</view>

wx:key 的使用

如果列表中项目的位置会动态改变或者有新的项目添加到列表中,并且希望列表中的项目保持自己的特征和状态

(如 input 中的输入内容,switch 的选中状态),需要使用 wx:key 来指定列表中项目的唯一的标识符,从而

高渲染的效率,示例代码如下

<view wx:for="{{ array }}" wx:key="index">
	{{ index }} : {{ item.message }}
</view>

3、WXSS样式

什么是 wxss及和 css 之间的关系

  1. 什么是 WXSS
    • WXSS (WeiXin Style Sheets) 是一套样式语言,用于描述 WXML 的组件样式
    • WXSS 用来决定 WXML 的组件应该怎么显示
  2. WXSS 和 CSS 的关系
    • WXSS 具有 CSS 大部分特性,为了更适合开发微信小程序,WXSS 对 CSS 进行了扩充以及修改
    • 与 CSS 相比,WXSS 扩展的特性有
      • rpx 尺寸单位
      • @import 样式导入

在这里插入图片描述

什么是 rpx 及实现原理

  1. 什么是 rpx

    rpx(responsive pixel) 是微信小程序独有的,用来解决屏幕适配的尺寸单位

  2. rpx 的实现原理

    rpx 是实现原理非常简单:鉴于不同设备屏幕的大小不同,为了实现屏幕的自动适配,*rpx 把所有设置的屏幕,在***宽度上 等分为 750 份,即 当前屏幕的总宽度为750 rpx

    • 在较小的设备上,1rpx 所代表的宽度较小
    • 在较大的设备上,1rpx 所代表的宽度较大

小程序在不同的设备上运行的时候,会自动把 rpx 的样式单位换算成对应的像素单位来渲染,从而显示屏幕适配

rpx 与 px 以及设计稿之间的换算关系

  1. rpx 与 px 之间的换算

    以 iPhone6 为例,iPhone6 的屏幕宽度为 375px ,共有 750 个物理像素。则 750rpx = 375px = 750 物理像素,即 1rpx = 0.5px = 1 物理像素

在这里插入图片描述

  1. rpx 和 iPhone6 设计稿的关系

    官方建议:开发微信小程序时,设计师可以用 iPhone6 作为视觉稿的标准。(iPhone6 设计稿宽度为 750px)

    如果要根据 iPhone6 的设计稿,绘制小程序页面,可以直接把单位从 px 替换为 rpx

    例如,假设 iPhone6 设计稿上,要绘制一个 宽高为 200px 的盒子,换算为 rpx 为 200rpx

@import 样式导入

  1. 什么是样式导入
    • 使用 @import 语句可以导入外联样式表
  2. 语法格式
    • @import 后跟需要导入的外联样式表的相对路径,用 ; 表示语句结束
@import '../../styles/global.wxss';

全局样式和局部样式

  1. 什么是全局样式

    定义在 app.wxss 中的样式为全局样式,作用于每一个页面

  2. 局部样式

    • page 的 wxss 文件中定义的样式为局部样式只作用在对应的页面,并会覆盖 app.wxss 中相同的选择器
    • 注意:**当局部样式的**权重大于或等于全局样式的权重时,才会覆盖全局的样式效果

在这里插入图片描述

4、配置操作

4.1、全局配置

全局配置文件以及常用的配置项

小程序根目录下的 app.json 文件用来对微信小程序进行全局配置。常用的配置如下:

  1. pages 数组:配置小程序的页面路径
  2. window 对象:用于设置小程序窗口的外观
  3. tabBar 对象:配置小程序底部 tab 栏效果
  4. style 字段:是否启用新版的组件样式

小程序窗口的组成

小程序的窗口由 3 部分组成:导航栏区域、背景区域、页面主体区域

在这里插入图片描述

设置导航栏标题文字内容

设置步骤:app.json → window → navigationBarTitleText

在这里插入图片描述

设置导航栏背景色

设置步骤:app.json → window → navigationBarBackgroundColor

在这里插入图片描述

设置导航栏标题颜色

设置步骤:app.json → window → navigationBarTextStyle

注意:此选择仅支持 black / white

在这里插入图片描述

全局开启下拉刷新功能

通过手指在屏幕上的下拉滑动操作,从而重新加载页面数据的行为

设置步骤:app.json → window → enablePullDownRefresh

在这里插入图片描述

设置下拉刷新窗口的背景色

当全局开启下拉刷新功能之后,默认的窗口背景为白色

设置步骤:app.json → window → backgroundColor

在这里插入图片描述

设置下拉loading的样式

当全局开启下拉刷新功能之后,默认窗口的 loading 样式为白色

设置步骤:app.json → window → backgroundTextStyle

注意:仅支持 dark / light

在这里插入图片描述

设置上拉触底的距离

手指在屏幕上的上拉滑动操作,从而加载更多数据的行为

设置步骤:app.json → window → onReachBottomDistance

注意: 默认距离为 50px,如果没有特殊需求,建议使用默认值即可

在这里插入图片描述

4.2、TabBar 配置

Tab bar的概念

  1. tabBar 是移动端应用常见的页面效果,用于实现多页面的快速切换小程序中
  2. 通常将其分为 底部 tabBar顶部 tabBar

在这里插入图片描述

注意:

tabBar 中,只能配置最少 2 个、最多 5 个 tab 页签,

当渲染顶部 tabBar 的时候,不显示 icon,只显示文本

TabBar 的组成部分

  1. backgroundColor:导航条背景色
  2. selectedIconPath:选中时的图片路径
  3. borderStyle:tabBar上边框的颜色
  4. iconPath:未选中时的图片路径
  5. selectedColor:tab 上的文字选中时的颜色
  6. color:tab 上的文字默认(未选中)颜色

在这里插入图片描述

TabBar 节点的配置项

  1. TabBar 节点的配置项

在这里插入图片描述

  1. list 节点的配置项

在这里插入图片描述

TabBar 案例

  1. 根据素材中提供的小图标,实现下图中 TabBar 效果:

    在这里插入图片描述

  2. 实现步骤

    - 将 image 文件夹,拷贝到小程序项目根目录

    - 创建 3 个对应的 tab 页面

    - 设置 tabBar 字段,同时设置 list 字段,配置 TabBar 即可

  3. 案例代码

"tabBar":{
    "list":[
    	{
        	"pagePath":"pages/home/home",
        	"text":"首页",
        	"iconPath":"/images/tabs/home.png",
        	"selectedIconPath":"/images/tabs/home-active.png"
		},
		{
            "pagePath":"pages/message/message",
            "text":"消息",
            "iconPath":"/images/tabs/message.png",
            "selectedIconPath":"/images/tabs/message-active.png"
        }
}    

思考

❓ TabBar 配置项中注意事项

  1. List 配置项最多 5 个,最少 2 个
  2. 当 postision 的值为 Top 时,不显示 icon 图标

4.3、页面配置

页面配置文件的作用

小程序每个页面都有自己的 .json 文件,用来对本页面的窗口表现进行配置。页面中配置项在当前页面会覆盖 app.json 的 window 中相同的配置项

页面配置和全局配置的关系

小程序中, app.json 中的 window 节点,可以全局配置小程序中每个页面的窗口表现

如果某些小程序页面想要拥有特殊的窗口表现,此时,页面级别的 .json 配置文件就可以实现这种需求

注意:当页面配置与全局配置冲突时,根据就近原则,最终的效果以页面配置为准

在这里插入图片描述

5、网络请求

思考

❓ jQuery 中如何发起网络请求 ? 同时我们思考什么是跨域?小程序中是否存在跨域 ?

$.ajax({
    url: ‘xxx’,
    method:GET,
    success: function (data) {
    	console.log(data)
    }
})

5.1、小程序中网络数据请求的限制

出于安全性方面的考虑,小程序官方对数据接口的请求做出了如下两个限制:

  • 只能请求 HTTPS 类型的接口
  • 必须将接口的域名添加到信任列表中 (上线)

在这里插入图片描述

5.2、配置 request 合法域名

需求描述:假设在自己的微信小程序中,希望请求 https://www.escook.cn/ 域名下的接口

配置步骤:\登录微信小程序\管理后台 → 开发 → 开发设置 → 服务器域名 → 修改 request 合法域名

修改时需要注意事项

  • 域名只支持 https (request、uploadFile、downloadFile) 和 wss (connectSocket) 协议
  • 域名不能使用 IP 地址或 localhost
  • 域名必须经过 ICP 备案
  • 服务器域名一个月内可申请 15 次修改

5.3、发起 GET 请求

调用微信小程序提供的 wx.request() 方法,可以发起 GET 数据请求

Page({
    getHandler(){
        wx.request({
            url:'https://www.escook.cn/api/get',
            method:'GET', // 请求方式
            data:{  // 请求参数
                id:1
            },
            success:(data)=>{  // 请求成功的回调函数
                const { data:res } = data
                console.log(res)
            }
        })
    }
})

5.4、发起 POST 请求

调用微信小程序提供的 wx.request() 方法,可以发起 POST 数据请求

Page({
    postHandler(){
        wx.request({
            url:'https://www.escook.cn/api/post',
            method:'POST', // 请求方式
            data:{  // 请求参数
                id:1
            },
            success:(data)=>{  // 请求成功的回调函数
                const { data:res } = data
                console.log(res)
            }
        })
    }
})

5.5、在页面刚加载时请求数据

在很多情况下,我们需要在页面刚加载的时候,自动请求一些初始化的数据。此时需要在页面的 onload 事件中调用获取数据的函数

onLoad: function(options){
    this.postHandler()
}

5.6、跳过 request 合法域名校验

如果后端程序员 仅仅提供了 http 协议的接口、暂时没有提供 https 协议的接口,此时为了不耽误开发的进度,我们需要在微信开发者工具中,临时开启 [开发环境不校验请求域名、TLS 版本及 HTTPS 证书」 选项,跳过服务器域名的校验。此时,在微信开发者工具中及手机开启调试模式时,不会进行服务器域名的校验。

在这里插入图片描述

注意:在服务器域名配置成功后,建议开发者关闭此选项进行开发,并在各平台下进行测试,以确认服务器域名配置正确。

5.7、关于跨域和 AJAX 的说明

  1. 跨域问题只存在于基于浏览器的 Web 开发中。由于小程序的宿主环境不是浏览器,而是微信客户端,所以小程序中不存在跨域问题
  2. AJAX 技术的核心是依赖于浏览器中的 XMLHttpRequest 这个对象,由于 小程序宿主环境是微信客户端,所以小程序中不能叫做 发起 AJAX 请求,而是叫做 发起网络数据请求

5、案例

5.1、案例效果

在这里插入图片描述

5.2、实现思路

  1. 新建项目并梳理项目结构
  2. 配置 导航栏 效果
  3. 配置 tabBar 效果
  4. 实现 轮播图 效果
  5. 实现 九宫格 效果
  6. 实现 图片布局

5.3、代码实现

1、新建项目并梳理项目结构

  • 使用微信开发者工具新建项目
  • 创建三个页面,分别是
    • pages/home/home
    • pages/message/message
    • pages/contact/contact
  • 删除 index 和 log 页面

在这里插入图片描述

2、配置导航栏效果

app.json 里面的配置

"window": {
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#2b4b6b",
    "navigationBarTitleText": "本地生活",
    "navigationBarTextStyle": "white"
}

在这里插入图片描述

3、配置 tabBar

app.json里面配置

"tabBar": {
    "selectedColor": "#ed523c",
    "backgroundColor": "#fff",
    "list": [
      {
        "pagePath": "pages/home/home",
        "text": "主页",
        "iconPath": "/images/tabs/home.png",
        "selectedIconPath": "/images/tabs/home-active.png"
      },
      {
        "pagePath": "pages/message/message",
        "text": "消息",
        "iconPath": "/images/tabs/message.png",
        "selectedIconPath": "/images/tabs/message-active.png"
      },
      {
        "pagePath": "pages/contact/contact",
        "text": "联系我们",
        "iconPath": "/images/tabs/contact.png",
        "selectedIconPath": "/images/tabs/contact-active.png"
      }
    ]
 }

在这里插入图片描述

4、实现轮播图效果

  • 配置轮播图数据 home.js
// pages/home/home.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    // 1. 创建存放轮播图数据的列表
    swiperList:[]
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    // 3. 调用获取轮播图数据方法
    this.getSwiperList()
  },
  // 2. 定义获取轮播图数据的方法
  getSwiperList () {
    wx.request({
      url: 'https://www.escook.cn/slides',
      method:'GET',
      success: res=>{
        this.setData({
          swiperList:res.data
        })
      }
    })
  }
})   
  • 渲染轮播图结构和样式

home.wxml绘制结构

<!-- 轮播图区域 -->
<swiper indicator-dots circular>
	<swiper-item wx:for="{{ swiperList }}" wx:key="id">
    	<image src="{{ item.image }}"></image>
    </swiper-item>
</swiper>

home.wxss绘制样式

swiper{
  height: 350rpx;
}
swiper-item image{
  width: 100%;
  height: 100%;
}

在这里插入图片描述

5、获取九宫格数据

  • 配置九宫格数据 home.js
// pages/home/home.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    // 创建存放轮播图数据的列表
    swiperList:[],
    // 存放九宫格数据的列表
    gridList:[]
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    // 调用获取轮播图数据方法
    this.getSwiperList()
    // 调用获取宫格数据的方法
    this.getGridList()
  },
  // 定义获取轮播图数据的方法
  getSwiperList () {
    wx.request({
      url: 'https://www.escook.cn/slides',
      method:'GET',
      success: res=>{
        this.setData({
          swiperList:res.data
        })
      }
    })
  },
  // 定义获取九宫格数据的方法
  getGridList () {
    wx.request({
      url: 'https://www.escook.cn/categories',
      method:'GET',
      success: res=>{
        this.setData({
          gridList: res.data
        })
      }
    })
  }
})    
  • 绘制九宫格结构和样式

home.wxml绘制结构

<!-- 轮播图区域 -->
<swiper indicator-dots circular>
	<swiper-item wx:for="{{ swiperList }}" wx:key="id">
    	<image src="{{ item.image }}"></image>
    </swiper-item>
</swiper>
<!-- 九宫格区域 -->
<view class="grid-list">
  <view class="grid-item" wx:for="{{ gridList }}" wx:key="id">
    <image src="{{ item.icon }}"></image>
    <text>{{ item.name }}</text>
  </view>
</view>

home.wxss绘制样式

.grid-list{
  display: flex;
  flex-wrap: wrap;
  border-top: 1px solid #efefef;
  border-left:1px solid #efefef;
}
.grid-item{
  width: 32.333%;
  height: 200rpx;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  border-right: 1px solid #efefef;
  border-bottom: 1px solid #efefef;
  box-sizing: border-box;
  flex-grow: 1;
}
.grid-item image{
  width: 60rpx;
  height: 60rpx;
}
.grid-item text{
  font-size: 24rpx;
  margin-top: 10rpx;
}

在这里插入图片描述

6、实现 图片布局

  • 渲染底部图片结构
<!-- 轮播图区域 -->
<swiper indicator-dots circular>
	<swiper-item wx:for="{{ swiperList }}" wx:key="id">
    	<image src="{{ item.image }}"></image>
    </swiper-item>
</swiper>
<!-- 九宫格区域 -->
<view class="grid-list">
  <view class="grid-item" wx:for="{{ gridList }}" wx:key="id">
    <image src="{{ item.icon }}"></image>
    <text>{{ item.name }}</text>
  </view>
</view>
<!-- 图片区域 -->
<view class="img-box">
  <image src="/images/link-01.png" mode="widthFix"></image>
  <image src="/images/link-02.png" mode="widthFix"></image>
</view>
  • 渲染底部图片样式
.img-box{
  display: flex;
  justify-content: space-around;
  padding: 20rpx 10rpx;
}
.img-box image{
  width: 45%;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/88285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AVS-代码路径说明

训练 1 config.py里面有backbone的路径,这里最好写在外面&#xff0c;写成绝对路径 不然每个算法都要放如下三个与训练模型&#xff0c;会很占地方vggishxxx.pth resnetxxx.pth pvt_v2_xxx.py AVS/AVSBenchmark1/avs_ms3/config.py 本来pretrained_backbones/xxx.pth文件在AVSB…

【C++】STL——list的常用接口

list的常用接口 文章目录list的常用接口一、list的介绍二、list的使用1.list的构造2.迭代器的使用2.1.begin和end2.2.rbegin和rend2.3.范围for2.4.迭代器的分类3.list的元素访问函数3.1.front和back4.list的容量操作函数4.1.empty4.2.size和max_size5.list修改的相关函数5.1.pu…

内卷起来,2023年外贸B2B企业怎么通过独立站吸引客户的注意

从国外疫情解封后&#xff0c;中国在2022年的最后一个月也解封了&#xff0c;我们努力了三年&#xff0c;现在不再查核酸、健康码&#xff0c;多家航空公司重新开通了国际航班。对许多外贸公司来说&#xff0c;是“外贸春天”的到来。那么即将到来的2023年&#xff0c;外贸B2B企…

十三、JavaScript——类型转化

一、类型转化 1 定义 类型转化&#xff1a;指将一种数据类型转化为其他的数据类型 - 指将其他类型转化为&#xff08;字符串、数值、布尔值&#xff09; 转化为字符串、调用toString()方法将其他类型转化为字符串 调用String&#xff08;&#xff09;函数将其他类型转化为字…

彻底理解并解决服务器出现大量TIME_WAIT

首先我们说下状态 TIME_WAIT 出现的原因 TCP的新建连接&#xff0c;断开连接的流程和各个状态&#xff0c;如下图所示 由上图可知&#xff1a;TIME_WAIT 是主动断开连接的一方会出现的&#xff0c;客户端&#xff0c;服务器都有可能出现 当客户端主动断开连接时&#xff0c;发…

C语言回调函数,提升C技巧必备

一、函数指针 在讲回调函数之前&#xff0c;我们需要了解函数指针。 我们都知道&#xff0c;C语言的灵魂是指针&#xff0c;我们经常使用整型指针&#xff0c;字符串指针&#xff0c;结构体指针等 int *p1; char *p2; STRUCT *p3; //STRUCT为我们定义的结构体 但是好像我们…

今天又get到一个小技能,collect_set函数

collect_set函数今天又get到一个小技能&#xff0c;掌握了hive一个关于列转行专用函数 collect_set函数。在这里做个学习笔记。collect_set是Hive内置的一个聚合函数, 结果返回一个消除了重复元素的对象集合, 其返回值类型是 array 。和collect_set相似的还有另一个函数collect…

Android12指纹调用流程介绍(一)

Android12指纹框架流程介绍(一) 前言&#xff1a;根据网上的相关资料&#xff0c;Android 12开始支持屏下指纹方案&#xff0c;根据自己手中的测试机&#xff0c; ​ 下载了android 12的源码&#xff0c;准备学习下新的指纹框架 注&#xff1a;目前笔者使用的版本是android_…

Qt扫盲-QSlider理论总结

QSlider理论总结1. 简述2. 常用功能3. 外观4. 最常用信号5. 键盘功能1. 简述 QSlider是用于控制边界值的经典小部件。它允许用户沿水平或垂直凹槽移动QSlider 的滑块&#xff0c;并将 滑块 的位置转换为合法范围内的整数值。但是 QSlider 仅提供整数范围。如果QSlider处理非常…

RSTP快速生成树简介、RSTP与STP的区别、RSTP BPDU字段信息、RSTP角色与端口状态介绍、RSTP工作过程之P/A机制详细分解)

2.11.0 以太网 RSTP快速生成树&#xff08;简介、RSTP与STP、RSTP BPDU、RSTP端口状态、RSTP工作过程之P/A机制&#xff09; RSTP快速生成树简介RSTP、STP的区别RSTP BPDU格式RSTP与STP的兼容性RSTP如何兼容STP&#xff1f;RSTP端口状态RSTP的5种端口角色RSTP的3种端口状态RSTP…

Windows OS中关闭445 Port

445端口是什么&#xff1f; 445端口是一个毁誉参半的端口&#xff0c;它和139端口一起是IPC$入侵的主要通道。有了它我们可以在局域网中轻松访问各种共享文件夹或共享打印机&#xff0c;但也正是因为有了它&#xff0c;黑客们才有了可乘之机&#xff0c;他们能通过该端口偷偷共…

Aba | 全自动biomarker分析神包!~(原作者用这个包发了三篇Nature啦~)

1写在前面 今天介绍一个Github上的神包吧, 主要是用于Biomarker的临床分析, 原作者用这个包已经发了3篇Nature了, 一起看看吧:&#x1f447; 在一些针对Biomarker的临床研究中, 我们常常需对Biomarker进行模型拟合, 预测效果评估等等.&#x1f970; 这个包可以完美解决这些问题…

[附源码]Python计算机毕业设计SSM基于web的火车订票管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Ansible概述及命令行模块

目录 一、Ansible概述 1 Ansible是什么 2 Ansible的四个组件&#xff1a; 3 Ansible的特性 二、Ansible 环境安装部署 三、ansible常用的命令行模块 1 command模块 2 shell模块 3 cron模块 4 user模块 5 group模块 6 copy模块 7 file模块 8 hostname模块 9 ping模块 10 …

Web端H5播放FLV、HLS、MP4 (二)

使用video.js播放HLS、FLV、MP4。 MP4、FLV、HLS、RTMP等协协和播放器之间的支持情况&#xff0c;参看这里。 一、主要JS插件&#xff1a; jquery(v3.6.0) video.js (v7.21.0&#xff0c;其它版本没试) https://cdn.bootcdn.net/ajax/libs/video.js/7.21.0/video.min.js f…

基于FPGA的RGB转HSV图像算法设计

一、什么是HSV色彩空间&#xff1f; RGB色彩空间是基于三基色而言&#xff0c;即红色、绿色、蓝色。而HSV色彩空间则是基于色调、饱和度和亮度而言的。 色调&#xff08;H&#xff09;是指光的颜色&#xff0c;例如&#xff0c;彩虹中的赤&#xff0c;橙&#xff0c;黄&#…

如何自学黑客?自学黑客技术需要学多久?

问题一&#xff1a;黑客如何学起&#xff1f; 答&#xff1a;必须从学习者的角度来看&#xff0c;如果你是一个已经学过编程&#xff0c;通晓几门语言的人那么这个答案就会和一个从没有接触过的计算机&#xff0c;甚至连什么叫高级语言还不知道的人有所区别的对待。 这就像是登…

LeetCode題目笔记——面试题 01.01. 判定字符是否唯一

文章目录题目描述题目难度——简单方法一&#xff1a;使用集合代码/Python方法二——用一个数组代码/Python方法三——位运算代码/Python总结题目描述 实现一个算法&#xff0c;确定一个字符串 s 的所有字符是否全都不同。 示例 1&#xff1a; 输入: s “leetcode” 输出: …

nvm 实战过程

文章目录前情提要应用场景实战解析最后前情提要 nvm是什么&#xff1a; nvm 全名 node.js version management&#xff0c;顾名思义是一个nodejs的版本管理工具。通过它可以安装和切换不同版本的nodejs。 应用场景 在我们前端工程师的日常工作中&#xff0c;不免要与不同基于n…

解决JavaWeb报错:此处不允许注解

目录 前言必读 一、遇到问题 二、解决办法 前言必读 读者手册&#xff08;必读&#xff09;_云边的快乐猫的博客-CSDN博客 一、遇到问题 1.在使用时候会发现报错为此处不允许使用注解&#xff0c;其实这是粗心和不熟练使用导致的 二、解决办法 2.把WebServlet("/ddd&…