1)行内样式
2)页内样式 --> 通过类选择器在当前目录的 wxss文件中设置样式
3)全局样式 --> 在全局 app.wxss 文件中设置样式
优先级:行内 > 页内 > 全局
尺寸单位
样式导入
1)为什么要使用样式导入
在某些情况下,我们可能会将样式分布在多个wxss文件中,方便对样式进行管理
这个时候,我们就可以使用样式导入,让单独的wxss文件生效
2)我们可以在一个wxss文件中导入另一个wxss文件
官方样式库
wxml基本格式
// pages/wxml/test.wxml
{{message}}
{{firstName + " " + lastName}}
{{age>=18?"成年人":"未成年人"}}
{{nowTime}}
后晨好帅
// pages/wxml/test.js
Page({
/**
* 页面的初始数据
*/
data: {
message: "houchen",
firstName: "kebi",
lastName: "brant",
age: 20,
nowTime: new Date().toLocaleString(),
isActive: false
},
switchFontColor() {
this.setData({
isActive: !this.data.isActive
})
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
setInterval(() => {
this.setData({
nowTime: new Date().toLocaleString()
})
})
}
})
wx:if - wx:elif - wx:else
houchen haoshuai
优秀
良好
合格
较差
hidden属性,当hidden属性为true的时候,该dom元素会被隐藏
我是后晨
二者之间的区别
如何选择
基本使用
{{index}} {{item}}
{{index}} {{item}}
{}}语法 -->
{{index}} {{item}}
block标签
并不是一个组件,它仅仅是一个包裹元素,不会在页面中做任何渲染,只接受控制属性(wx:if wx:for)
使用block标签的两个好处
item、inidex起名字
默认情况下,item- index的名字是固定的
{{movie}}
key的作用 : 为了高效的更新虚拟dom
自从可以使用自定义组件时,模板语法就不经常使用了,但是你还是要知道有这么个东西
wxml提供模板(template),可以在模板中定义代码判断,在不同的地方调用(是一种wxml的代码复用机制)
后晨好帅
后晨好帅
{{name}}

小程序中提供了两种引入文件的方式:import和include
//绝对路径
//相对路径
wxs(weixin script)是小程序的一套的脚本语言,结合wxml,可以构建自己的页面
为什么要设计wxs语言呢
wxs使用的限制和特点
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rnx3AyG0-1664082303941)(小程序开发(王红元).assets/image-20220924143600614.png)]](https://1000bd.com/contentImg/2024/09/13/bf9ea7b21bbc03c9.png)
第一种写法就是wxs直接写在 wxl文件中

第二种写法就是wxs单独写在一个wxs文件中,然后在wxml文件中通过 wxs标签导入该文件

某些组件会有自己特性的事件类型

当某个事件触发时,会产生一个事件对象,并且这个对象会被传入到回调函数中,事件对象有哪些常见的属性呢?加粗样式


touches 和 changedTouches的区别
touches:记录当前你有几根手指在小程序上进行触摸,以及这些触摸点的信息
changedTouches: 记录变化的触摸点的信息(比如刚开始只有一根手指在屏幕上触摸,后来又加入了一根手指,则
touches中元素的个数为2 ,但是changedTouches中元素的个数为1)
target 和 currentTarget的区别

{{item}}

catch会阻止事件的进一步传递
小程序在刚开始的时候,是不支持组件化的




【注意细节】
组件内的样式对外部样式的影响
组件外的样式对组件内部样式的影响
如何让 class 可以相互影响:设置样式的隔离级别

1)自定义组件内部需要将事件传递出来
//param1: 发射出去的事件名称 param2: 传递出去的参数 param3:默认就是一个空对象
this.triggerEvent('handIncrement',{},{})

2)在使用组件的页面中接收传递出来的事件,并进行处理
<my-event bind:handIncrement="handIncrement">my-event>

代码就不粘贴了: 实现tab的切换

1)给自定义组件添加一个ID选择器

2)通过ID选择器,获取到自定义组件对象,然后调用自定义组件对象的方法

组件的插槽
单个插槽的使用
多个插槽的使用
1)在自定义组件wxml中申明多个插槽及其名称

2)在自定义组件js中配置允许使用多个插槽

3)在使用自定组件的地方,向插槽中替换内容时,指定插槽的名称
【注意】我故意将替换插槽1的内容写在了第二行,页面上显示在第一行,说明多个插槽确实生效了

Component({
//组件的使用者可以给组件传入一些数据
properties: {
},
//定义组件内部的初始化数据
data: {
counter: 0
},
//定义组件内部的函数
methods: {
btnClick() {
this.setData({
counter: this.data.counter+1
})
}
},
// 定义组件的一些配置选项(例如:允许多插槽,设置样式的隔离方式)
options: {
},
//外部给组件传入的额外的样式
externalClasses: [],
//监听properties、data中数据的改变
//只能监听到新的变化的值,newValue
observers: {
counter: function(newValue) {
console.info(newValue);
}
},
// -----------组件中监听生命周期函数--------------------
//1、监听组件所在页面的生命周期
pageLifetimes: {
show() {
console.info("监听组件所在页面显示出来时")
},
hide() {
console.info("监听组件所在页面隐藏时")
},
resize() {
console.info("监听组件所在页面调整大小时---> 用的很少")
}
},
//2、监听组件本身的声明周期
lifetimes: {
created() {
console.info("当组件被创建时")
},
attached() {
console.info("当组件被添加到页面时")
},
ready() {
console.info("当组件在页面中渲染完成时")
},
moved() {
console.info("当组件在页面中从一个地方被移动到另一个地方 ----> 用的比较少")
},
detached() {
console.info("当组件从页面中被移除时")
}
}
})
小程序进行网络请求前,需要先配置服务域名
https://developers.weixin.qq.com/miniprogram/dev/framework/ability/network.html
微信提供了专属的API接口,用于网络请求:wx.request( {} )
网络请求参数详解
https://developers.weixin.qq.com/miniprogram/dev/api/network/request/wx.request.html
1)为什么要进行网络请求的封装
export default function request(options) {
return new Promise((resolve, reject) => {
wx.request({
url: options.url,
method: options.method || 'get',
data: options.data || {},
success: function (res) {
resolve(res)
},
fail: function (err) {
reject(err)
}
})
})
}
//使用
//2、使用封装的request函数进行网络请求
request({
url: 'http://127.0.0.1:8083/sayHello',
method: "get"
}).then(res => {
console.info(res)
}).catch(err => {
console.error(err)
})
https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showToast.html
wx.showToast({
title: '你好啊',
})

https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showModal.html
wx.showModal({
title: "hello",
content: "后晨好帅"
})

wx.showLoading 是一直处于loading状态的,需要显示的调用wx.hiddenLoading 来隐藏loading框

分享是小程序扩散的一种重要方式,小程序中有两种分享方式:

上图是官网给出的小程序登录流程图
小程序登录代码
onLaunch: function () {
//1、先从缓存中取出token
const token = wx.getStorageSync(TOKEN)
if (token && token.length !== 0) {
//已经有token,则只需要验证token是否过期
this.check_token()
} else {
//没有token,则进行登录
this.login()
}
},
check_token() {
wx.request({
url: 'http://localhost:8080/auth',
method: 'post',
header: {
token
},
success: (res) => {
if(!res.data.errCode){
//错误码不存在的时候,代表校验token成功,更新token
wx.setStorageSync(TOKEN, res.data.token)
} else {
//否则代表,校验token失败,重新走登录接口
this.login()
}
},
fail: (err) => {
}
})
},
login() {
wx.login({
success: (res) => {
//1、获取code、code的有效期只有五分钟
const code = res.code;
//2、将code发送给我们的服务器
wx.request({
url: 'http://localhost:8080/login',
method: 'post',
data: {
code: code
},
success: (res) => {
console.info(res)
//3、将token保存到全局的地方
const token = res.data.token
wx.setStorageSync('token', token)
}
})
}
})
},
页面跳转提供两种方式进行 跳转:
navigator 组件主要是用于页面跳转的


在界面跳转过程中,我们需要传递一些参数,应该如何完成呢?
1)在页面跳转时设置参数
<navigator url="/pages/about/about?name=houchen&age=18">跳转到about页面navigator>
2)在跳转页面的 page对象的onload方法中通过options参数接收路径参数
1)在当前页面获取到首页的页面对象
const pages = getCurrentPages()
const home = pages[pages.length-2]
2) 调用page对象的setData
home.setData({
title: 'hehehe'
})
Page({
handleSkipToAboutPage() {
wx.redirectTo({
url: '/pages/about/about',
})
wx.navigateBack({
delta: 2, //返回的层级
})
}
})