微信小程序学习笔记
1.目录结构
#复习/微信小程序
1.1目录介绍
1.1.1
-app.js 小程序入口文件
-app.json 小程序的全局配置,
-app.wxss 小程序的全局样式
1.1.2页面文件
-pages文件下 ,index
xx.js 页面逻辑
xx.wxml 等同于html
xx.json 页面配置
xx.wxss 页面的样式(视觉)
1.1.3其它
components 组件
eslintrc.js 语法检查
3.1.2 配置文件
3.1.2.1 app.json
page:有多少页面
window:全局窗口的样式
3.1.2.2 页面配置文件
常用的:
navigationBarBackgroundColor HexColor #000000 导航栏背景颜色,如 #000000
navigationBarTextStyle string white 导航栏标题、状态栏颜色,仅支持 black / white
navigationBarTitleText string 导航栏标题文字内容
3.1.2.3 工程配置
project.private.config.json
project.config.json
用于保存开发者的信息,私人优先级高于公共

和这个是一样的
sitemap.json
能否被搜索到
3.2 webview渲染和纯净模式
3.2.1 webview渲染和skyline渲染
删除"componentFramework": "glass-easel",等
只留这些
{
"pages": [
"pages/index/index",
"pages/my/my"
],
"window": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "测试小程序",
"enablePullDownRefresh": true,
"navigationBarBackgroundColor": "#ffffff",
"backgroundTextStyle": "dark"
},
"style": "v2",
"sitemapLocation": "sitemap.json",
"lazyCodeLoading": "requiredComponents"
}
3.3新建页面
增加方式1:新建文件夹,新建page
2.在app.json新增一行
3.4调整启动页
1.调整app.json的页面顺序
2."entryPagePath": "pages/login/login",
3.调试时修改启动页面
3.5调试小程序
3.5.1基础库
因为不用功能时不用版本加入的

3.5.2调试终端

总结
学到了什么?微信开发前端的基础结构
微信小程序新建页面的两种方式::1新建文件夹2直接在app.json里添加一行代码
启动页面调整的三种方式::1.修改app.json代码的顺序2.使用entryPagePath:""3.编译时临时选择
小程序的文件结构,app.jsone的作用是==全局配置文件== ,包含了有哪些页面,全局窗口的样式.app.js的作用是==全局入口文件==的,工程文件是==project.config.json==,用来保存配置信息和开发者个人配置
+++
3.6开启纯净模式
app.json window几个函数功能
"navigationBarTitleText": "功能演示", # 标题
"navigationBarBackgroundColor": "#0000FF", #颜色
"enablePullDownRefresh": false, # 是否带下拉刷新
"backgroundColor": "#00FFFF", # 下拉刷新颜色
"backgroundTextStyle": "dark" # light ,下拉刷新的点点什么颜色
4快速上手
4.1常用组件
常用组件和HTML有区别
<!--index.wxml-->
<text>首页</text><text>首页</text>
<!-- 等于span -->
<view>等于div</view>
<image src="/image/16.jpg" style="height: 200px;width: 500px;"></image>
<icon type="success_no_circle" color="red"/>
<icon type="cancel" color="#ddd"/>
4.3tabbar配置
底部的按钮

"tabBar": {
"selectedColor": "#123456",
"list": [{
"pagePath": "pages/index/index",
"text": "首页",
"iconPath": "image/home.png",
"selectedIconPath": "image/home_select.png"
},
{
"pagePath": "pages/my/my",
"text": "我的",
"iconPath": "image/my.png",
"selectedIconPath": "image/my_select.png"
}
]
},
总结
tabbar写在哪里,配置代码::app.json"tabbar":{"list:[{}{}]"}
第二天
1 创建纯净环境
1.2尺寸单位
小程序的尺寸单位最宽是::750rpx
1.3样式
1.3.1 全局样式 app.wxss
# 1 以后在这里面写css 样式
# 2 整个小程序 都生效
.myview {
height: 500rpx;
width: 750rpx;
background-color: aquamarine;
font-size: 30rpx;
}
1.3.2 局部样式 页面.wxss
# 1 以后在这里面写css 样式
# 2 只在当前页面中生效
.myview{
background-color: rebeccapurple;
}
- 缩进只能对view用
2.1 button组件使用
margin-top : 200rpx; 表示元素的上外边距为 200rpx
1 在 页面.wxml 中
2 在 页面.wxss中使用 标签选择器
button{
/* 距离顶部30rpx /
margin-top: 300rpx;
/ 距离底部30rpx */
margin-bottom: 30rpx;/* 优先以这个样式为准 */
background-color: red !important;
}3 后续其它属性,参照官网
-按钮带加载
-按钮不可点击
。。。。
margain的用法::上右下左,顺时针
2.2 swiper+swiper-item首页轮播图
2.2.1 index.wxml
<swiper
autoplay
indicator-dots
circular
indicator-color='#FFFFF'
interval='3000'
>
<swiper-item>
<image src="/images/banner/banner1.jpg" mode="widthFix"/>
</swiper-item>
<swiper-item>
<image src="/images/banner/banner2.png" mode="widthFix"/>
</swiper-item>
<swiper-item>
<image src="/images/banner/banner3.jpg" mode="widthFix"/>
</swiper-item>
</swiper>
轮播图的使用方法,包括其自身所带的属性::swipe
2.2.2 把轮播图放在 images/banner目录下
2.3 首页提示板块
## index.wxml
<view class="tips">
<text class="iconfont icon-tishi icon"></text>
<text>欢迎使用我们的系统,谢谢~~</text>
</view>
/*## index.wxss*/
.tips {
/* 背景色 */
background-color: #f5eedf;
/* 字大小 */
font-size: 32rpx;
/* 字颜色 */
color:#e9ab4e;
/* 圆角效果 */
border-radius: 50rpx;
/* 距离上下右左距离 */
margin:30rpx 10rpx 30rpx 10rpx;
padding-left:20rpx ;
}
.icon{
padding-right: 10rpx;
}
2.4Flex布局
.menu {
display: flex;
justify-content: space-between;
/* 主轴方向上间距相等 */
padding: 16rpx;
/* 间距 */
border-radius: 10rpx;
/* 圆角 */
flex-wrap: wrap;
/* 自动换行 */
}
.item {
display: flex;
flex-direction: column;
/* 纵向排列 */
justify-content: center;
/* 主轴上居中 */
align-items: center;
/* 非主轴上居中 */
width: 150rpx;
height: 200rpx;
border: rgb(78, 230, 7) solid 1rpx;
/* 边框大小及颜色 */
margin: 1rpx;
background-color: rgb(191, 255, 0);
}
.img {
width: 88rpx;
height: 88rpx;
border-radius: 10rpx;
}
3.矢量图的引入
3.1矢量图库引入
通过base64方式将矢量图转成字符,插入到css中
什么是Base64::一种将二进制数据转化为ASC字符的方法
如何引入矢量图
???
1.新建一个css文件,方便管理
2.到网站转一个base64格式的代码放上去
3.在文本类里用class="iconfont icon-tishi icon".这种方式引用
4.转换成base64就是字体,css代码可用字体来改
+++
4.事件绑定
4.1
# 1 按钮,某些组件--》点击--》触发事件执行
-打印xx
-向后端发送请求
。。。。
# 2 最简单使用
## 2.1 wxml中
<button type="warn" plain size="mini" bind:tap="handleConsole">点击控制台打印</button>
## 2.2 js中
Page({
handleConsole(){
console.log('我被点了')
},
})
# 3 bind:tap="handleConsole" 可以简写 bindtap="handleConsole"
事件绑定如何实现,如何阻止事件冒泡::button里使用bintap.使用catchtap
4.2事件冒泡
子组件有个事件,父组件也有事件.点击子组件,这时父组件也会触发.
如何避免父组件触发?
bind vs catch
bind:tap: 会触发事件冒泡(事件向上传递到父元素)
catch:tap: 不会触发事件冒泡(事件被截断,不再向上传递)
4.3事件对象,传参数
4.3.1 data

#wxml
<button type="warn" plain size ="mini" bind:tap="handleConsole" data-id="1001" data-nihao="2000">传递参数</button>
#JS
handleConsole(event){
console.log('好的');
console.log(event.target.dataset);
},
4.3.2 mark
<!-- 定义 mark 属性 -->
<button
bind:tap="handleClick"
mark:userId="123"
mark:username="Alice"
>
点击
</button>
<JAVASCRIPT>
Page({
handleClick(event) {
// 通过 event.mark 获取值(无需 dataset 转换)
console.log(event.mark.userId); // 123(数字类型)
console.log(event.mark.username); // "Alice"(字符串)
}
})
在小程序事件跳转中如何实现参数传递(两种), 两个target有何不同::使用data-id="1001"或者mark:name="".currentTarget是事件绑定者,会随事件冒泡传递.target是事件触发着,原始按钮
传参数都是以键值对的方式传递比如::data-id="1" data-name="".mark:id="" mark:name=""
5.页面跳转
5.1组件跳转(声明式)
| open-type | 说明 | 使用场景 | 替代 API |
|---|---|---|---|
navigate |
默认值,保留当前页面 | 普通页面跳转 | wx.navigateTo |
redirect |
关闭当前页面 | 登录/支付成功后跳转 | wx.redirectTo |
switchTab |
跳转到 tabBar 页面 | 底部导航切换 | wx.switchTab |
navigateBack |
返回上一页 | 自定义返回按钮 | wx.navigateBack |
exit |
退出小程序 | 特殊场景 | - |
tab不加跳不过去
# 1 navigator 组件 ,加属性--》实现跳转
# 2 最基本的跳转
<navigator url="/pages/login/login"><button type="primary" plain>去登录</button></navigator>
# 3 更多跳转方式--》open-type属性跳转方式
navigate(默认):保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面
redirect: 关闭当前页面,跳转到应用内的某个页面。但不能跳转到 tabbar 页面
switchTab:跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
reLaunch:关闭所有页面,打开到应用内的某个页面
navigateBack:关闭当前页面,返回上一页面或多级页面
## 3.1 上述演示
<navigator url="/pages/login/login"><button type="primary" plain>去登录</button></navigator>
<navigator url="/pages/login/login" open-type="navigate"><button type="primary" plain>去登录2</button></navigator>
<navigator url="/pages/login/login" open-type="redirect"><button type="primary" plain>去登录3</button></navigator>
<navigator url="/pages/index/index" open-type="switchTab"><button type="primary" plain>去首页</button></navigator>
<navigator url="/pages/login/login" open-type="reLaunch"><button type="primary" plain>去登录4</button></navigator>
# 4 跳转携带参数
-跳转:
<navigator url="/pages/login/login?name=justin&age=19"><button type="primary" plain>去登录</button></navigator>
-另一个页面获取:js
onLoad(options) {
console.log(options)
},
组件式页面跳转怎么用,怎么修改跳转类型::navigator.用open-type更改跳转类型.
5.2js跳转(编程式)
#1 使用js控制跳转
# 2 5个方法--》跟上面是对应的
wx.navigateTo({
url: 'url',
})
wx.redirectTo({
url: 'url',
})
wx.switchTab({
url: 'url',
})
wx.reLaunch({
url: 'url',
})
wx.navigateBack()
# 3 页面
<button type="default" bind:tap="handlenavigateTo">navigateTo</button>
<button type="warn" bind:tap="handleredirectTo">redirectTo</button>
<button type="primary" bind:tap="handleswitchTab">switchTab</button>
<button type="default" bind:tap="handlereLaunch">reLaunch</button>
<button type="warn" bind:tap="handlenavigateBack">navigateBack</button>
# 4 js
handlenavigateTo(){
wx.navigateTo({
url: '/pages/login/login',
})
},
handleredirectTo(){
wx.redirectTo({
url: '/pages/login/login',
})
},
handleswitchTab(){
wx.switchTab({
url: '/pages/my/my',
})
},
handlereLaunch(){
wx.reLaunch({
url: '/pages/login/login',
})
},
handlenavigateBack(){
// 关闭当前页面,返回上一页或上某一页,传入数字
wx.navigateBack()
wx.navigateBack({
delta:2
})
},
编程式跳转怎么用::练习下
6.wxml语法
6.1 模板语法与增删改查元素
- 在js中定义的变量,在页面中显示
1.如何在页面显示变量,能用什么::用 {{}} ,计算,三目运算符
2.如何在通过页面按钮来修改模板语法中的键值对值.改变字符串时需要注意什么
???
触发函数中使用setData方法this.setData({
age:this.data.age +1
})
+++
3.js中解压赋值::const user = {...this.data.xinxi,age}.相当于解压后又添加了一个变量
4.小程序中快速添加对象元素
???
const xinxi = {...this.data.xinxi,age};
this.setData({
xinxi
})
需要注意的是
this.setData({
xinxi
//xinxi相当于xinxi:xinxi.前面的xinxi是this.data.xinxi 而后面的只是本方法内的xinxi
})
+++
5.在使用push时,返回的是==数组长度==,所以const xihuan = this.data.xihuan.push('亚瑟王');这样写是不行的.
+++
6.小程序中添加对象元素的三种方法,修改和删除.练习
???
# 7 setData 修改数组
## 7.1 js
data: {
names:['刘亦菲','迪丽热巴','古力娜扎','马尔扎哈']
},
handleChangeList(){
//1 增加数组
// 1.1 增加再设置值
this.data.names.push('亚瑟王')
this.setData({
names:this.data.names
})
// 1.2 通过数组拼接
// const newList=this.data.names.concat("甄姬")
// this.setData({
// names:newList
// })
// 1.3 通过解构赋值
const newList=[...this.data.names,"李白"]
this.setData({
names:newList
})
// 2 修改数组
this.setData({
'names[1]':'justin'
})
// 3 删除数组
this.data.names.slice(1)
this.setData({
names:this.data.names.slice(1)
})
},
+++
7.如何通过文本框输入,改变对象内容并且在页面显示出来
???
通过input按钮,inputbind对应一个函数,把内容传过去.
再通过一个this.setData按钮把数组内容修改并实时显示出来.
+++
6.2列表渲染与条件渲染
如何实现通过按钮控制图片的显示与否,练习下.还有if和hide的区别是什么::1.先定义一个变量,再由函数控制,图片里添加控制规则2.一个删除一个隐藏
7.发送网络请求
思路是什么?
首先得有个后端,能返回什么信息,前端用什么结构接收
发送网络请求怎么做,怎么添加正在加载弹窗
???
js里先创建一个空的对象.使用wx.request函数,方法 数据 成功就导入数据并更新页面,失败打印错误信息
使用showLocding,在执行完request函数后结束运行hideLoading
+++
8对话框
8.1模态对话框
怎么要使用模态对话框::和之前的一样,绑定函数,然后使用wx.showmodal
8.2消息对话框
怎么要使用消息对话框::和之前的一样,绑定函数,然后使用wx.showToast
9.存储
9.1增删改查
9.1.1 同步存储
微信小程序存储用哪个函数,对象是怎么存的
???
handleSave() {
wx.setStorageSync('id', 1);
wx.setStorageSync('name', '小明');
wx.setStorageSync('wife', {name:'laopo',add:'dafsdfsadf'});
// 对于对象是转成json格式存储的
},
+++
微信小程序获取 删除 清空数据用哪个函数::getStorageSync removeStorage clearStorage
9.1.2 异步存储
异步存储和同步存储有什么不同,get如何写
???
异步存储和同步存储的主要区别在于数据写入或读取操作是否阻塞当前程序的执行。
同步存储:在执行存储操作(如写入或读取数据)时,程序会一直等待该操作完成,期间不能执行其他任务。这种方式简单直观,但在处理大量数据或慢速设备时可能导致性能瓶颈。
异步存储:存储操作在后台进行,程序发起请求后可以立即继续执行后续代码,无需等待操作完成。通常通过回调函数、Promise 或 async/await 等机制来处理操作完成后的结果。这种方式提高了程序的并发性和响应速度,但逻辑相对复杂。
对于微信小程序,异步存储中,存储数据是存对象,取数据也是取对象.
async handleGet (){
const name = await wx.getStorage({key:'name'})
}
如果不使用回调函数,将会返回promise对象
Promise {<pending>}
__proto__: Promise
catch: ƒ catch()
arguments: (...)
caller: (...)
length: 1
name: "catch"
nv_length: (...)
__proto__: ƒ ()
[[Scopes]]: Scopes[0]
constructor: ƒ Promise()
all: ƒ all()
allSettled: ƒ allSettled()
any: ƒ any()
arguments: (...)
caller: (...)
length: 1
name: "Promise"
nv_length: (...)
prototype: Promise {Symbol(Symbol.toStringTag): "Promise", constructor: ƒ, then: ƒ, catch: ƒ, finally: ƒ}
race: ƒ race()
reject: ƒ reject()
resolve: ƒ resolve()
try: ƒ try()
withResolvers: ƒ withResolvers()
Symbol(Symbol.hasInstance): ƒ value(e)
Symbol(Symbol.species): (...)
get Symbol(Symbol.species): ƒ [Symbol.species]()
__proto__: ƒ ()
[[Scopes]]: Scopes[0]
finally: ƒ finally()
then: ƒ then()
Symbol(Symbol.toStringTag): "Promise"
__proto__: Object
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: Object
pending进行中,fulfilled表示已经完成.只用使用异步调参函数,才能获得数值
Promise 是个承诺,三种状态要记得:
pending 是进行中,fulfilled 已成功
rejected 是失败,状态改变就固定不能直接拿结果,then/await 才能得
链式调用真方便,错误冒泡好处理
async function example() {
// 这一行代码
const result = await somePromise
// 实际上相当于
const result = await new Promise((resolve, reject) => {
// 异步操作
})
}
+++
10上拉下拉加载更多
### wxml####
<view wx:for="{{good_list}}" wx:key="*this">{{item}}</view>
### js###
Page({
data: {
good_list: [1, 2, 3]
},
// 当滑动到底部还有50rpx时,就会触发这个函数执行---》发送请求获取数据
onReachBottom() {
console.log('下拉了')
// 发送请求获取数据
wx.request({
url: 'http://127.0.0.1:8000/app01/random/',
method:'GET',
success:(res)=>{
this.setData({
good_list:this.data.good_list.concat(res.data)
})
}
})
},
})
###wxss###
view{
height: 400rpx;
display: flex;
justify-content: center;
align-items: center;
}
/* 奇数背景色是粉色 */
view:nth-child(odd){
background-color: pink;
}
/* 偶数背景色绿色 */
view:nth-child(even){
background-color: rgb(17, 133, 88);
}
### json###
{
"usingComponents": {},
"onReachBottomDistance": 100
}
###后端###
def random_view(request):
l = []
for i in range(3):
l.append(random.randint(0, 99999))
return JsonResponse(l,safe=False) # 返回json格式,如果里面有列表,必须加safe=False
### json中配置###
{
"usingComponents": {},
"onReachBottomDistance": 100,
"enablePullDownRefresh": true,
"backgroundColor": "#efefef",
"backgroundTextStyle":"dark"
}
### wxml
<view wx:for="{{good_list}}" wx:key="*this">{{item}}</view>
### js
// 下拉刷新-
onPullDownRefresh(){
console.log('下拉了,刷新')
// 只要下来,把数据恢复
this.setData({
good_list:[1,2,3]
})
// 下拉刷新后,loading效果回弹
if(this.data.good_list.length==3){
wx.stopPullDownRefresh()
}
}
微信小程序中如何简单实现上拉加载,下拉刷新
???
先在json中开启下拉刷新功能,不用在html中再写关联函数,这是原生自带的函数.然后写获取后端数据的函数,更新页面.
下拉刷新类似,不用再json中写.直接找到对应的函数,在里面恢复原来的数据,更新页面.设置数据恢复后关掉下拉刷新
+++
##### wxml####
<scroll-view
class="scroll"
scroll-y # 运行y轴滑动
lower-threshold="100" # 距离底部还有100px时,触发事件
bindscrolltolower="handleGetData"# 事件处理函数
refresher-enabled="true" # 开启 下拉刷新
refresher-default-style="black" # 下拉默认样式
refresher-background="#f0f0f0" # 下拉背景色
bindrefresherrefresh="handleReload" # 下拉触发事件
refresher-triggered="{{isRefresh}}" # 设置下拉回弹,false允许回弹,
enable-back-to-top="true" # 快速回到顶部,ios点顶部,安卓点tab
>
<view wx:for="{{goods}}" wx:key="index">{{item}}</view>
</scroll-view>
### json###
{
"usingComponents": {}
}
###wxss###
.scroll{
/* 100vh就是指元素的高度等于当前浏览器的视窗高度,即浏览器内部的可视区域的高度大小 */
height: 100vh;
background-color: grey;
}
view{
height: 400rpx;
display: flex;
justify-content: center;
align-items: center;
}
/* 奇数 */
view:nth-child(odd){
background-color: pink;
}
/* 偶数 */
view:nth-child(even){
background-color: green;
}
#### js####
data: {
goods:[1,2,3,4],
isRefresh:false
},
handleGetData(){
console.log('上拉了')
// 发送请求,加载数据
wx.request({
url: 'http://192.168.71.100:5000',
method:'GET',
success:(res)=>{
console.log(res)
this.setData({
goods:this.data.goods.concat(res.data)
})
}
})
},
handleReload(){
console.log('下拉刷新了')
wx.showToast({
title: '下拉刷新',
})
this.setData({
goods:[1,2,3,4]
})
this.setData({
isRefresh:false
})
}
微信小程序中如何通过scroll-view来控制下拉刷新和上滑加载更多
???
不同于自带的,比较麻烦,使用
scroll-y //y轴上刷新
lower-threshold="50"
bindscrolltolower="handleGet" //绑定上滑加载更多函数
refresher-enabled="true" //开启下拉刷新
refresher-background="block"
bindrefresherrefresh="chongzhidata" //绑定下拉刷新函数
refresher-triggered=" {{isrefresh}} " //绑定是否有下拉动画参数
+++
11.小程序更新-声明周期
11.1小程序强制更新
app.js中加入代码
// app.js
App({
onLaunch(){
const update=wx.getUpdateManager()
update.onUpdateReady(function(){
wx.showModal({
title: '发现新版本',
content: '重启应用,更新版本新版本?',
success:(res)=>{
if(res.confirm){
update.applyUpdate()
}
}
})
})
}
})
这段代码是微信小程序中用于检测并应用新版本更新的逻辑。具体解释如下:
在小程序启动时(onLaunch 生命周期函数中),调用 wx.getUpdateManager() 获取全局唯一的版本更新管理器。
通过 update.onUpdateReady() 监听新版本下载完成的事件。
当新版本准备就绪后,弹出一个模态框(wx.showModal),提示用户“发现新版本”,并询问是否重启应用以更新到新版本。
如果用户点击“确定”(res.confirm 为 true),则调用 update.applyUpdate() 方法,强制小程序重启并应用新版本。