1.导航组件(声明式导航)
<!--navigate: 保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面
redirect:关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面
switchTab:跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
reLaunch 关闭所有页面,打开到应用内的某个页面(包含tabbar页面)
navigateBack: 关闭当前页面,返回上一页面或多级页面
能够tabber的: switchTab, reLaunch
跳转普通页面: navigate,reLaunch,redirect
-->
<navigator target="self" open-type="navigate" url="/pages/index01/index01">
<button>跳转-navigate</button>
</navigator>
<navigator target="self" open-type="redirect" url="/pages/list/list">
<button>跳转-redirect</button>
</navigator>
<navigator target="self" open-type="switchTab" url="/pages/list/list">
<button>跳转-switchTab</button>
</navigator>
<navigator target="self" open-type="reLaunch" url="/pages/index01/index01">
<button>跳转-reLaunch</button>
</navigator>
2.路由API(编程式导航)
// wx.navigateTo({
// url: '../index01/index01',
// })
wx.switchTab({
url: '../list/list',
})
3.导航传参
组件传参:在路径后问号拼接
<navigator target="self" open-type="navigate" url="/pages/index01/index01?title=hello&id=99">
<button>跳转-navigate</button>
</navigator>
api传参:
wx.navigateTo({
// url: '../index01/index01?id='+id+'&name='+name
url:`../index01/index01?id=${id}&name=${name}`
})
4.接收导航传参
在跳转到的页面里的onLoad函数里通过options形参接收
A-B 在B的onload接
onLoad(options){
console.log(options)
},
/注意: 跳转到tabber页面时。无法接参
5、跳转到外部小程序
引流使用
<!-- 跳转到外部小程序 appid必须写 -->
<navigator target="miniProgram" app-id="wx8ca0e15a6a544407">
<button>跳到外部小程序</button>
</navigator>
api:
wx.navigateToMiniProgram
说明**:可以在微信开发者工具选择普通编译–继续选择添加编译模式–选择启动页面–添加启动参数即可,然后即可在当前目标页面的onLoad中获取参数
五、自定义组件(自己写组件)
1.概述
小程序支持简洁的组件化编程,开发者可以将页面内的功能模块抽象成自定义组件,以便在不同的页面中重复使用;自定义组件在使用时与基础组件非常相似
2.创建自定义组件
1、新建一个components目录
2、在目录里新建一个组件子目录
3、右击-选择新建component
3.组件引用与使用
1、局部引入(在某个页面的json里写)
"usingComponents": {
"my-btn":"/components/my-btn/my-btn"
}
2、全局引入,(在app.json里引入)
"usingComponents": {
"my-btn":"/components/my-btn/my-btn"
}
4.组件样式(丰富组件)
1、组件的wxml
<view bindtap="_click" class="{{size}}" style="background-color:{{color}}">{{color}}</view>
2、组件的wxss
/* components/my-btn/my-btn.wxss */
.mini{
width: 120rpx;
height: 80rpx;
background-color: #999;
border-radius: 40rpx;
text-align: center;
line-height: 80rpx;
}
.default{
width:180rpx;
height: 120rpx;
background-color: #999;
border-radius: 60rpx;
text-align: center;
line-height: 120rpx;
}
3、组件的js
properties: {
size:{
type:String, // 传递的属性的值的类型
value:'default'// size属性默认值
},
color:{
type:String,
value:'#999'
}
},
5.数据与方法
注意: properties 里的属性 如果和data林相同,properties的优先级更高
data: {
msg:"hello"
},
/**
* 组件的方法列表
*/
methods: {
_click(){
console.log(this.data.msg)
this.setData({
msg:"123"
})
}
}
6.properties组件对外开放属性
组件的对外属性,用来接收外界传递到组件中的数据,组件的 properties
和 data
的用法类似,它们都是可读可写的,只不过:
data
更倾向于存储组件的私有数据properties
更倾向于存储外界传递到组件中的数据
properties属性不需要在自定义组件内部进行修改,是通过组件调用时传递进来的!!!
语法结构:
属性名称:{
type:String,NUmber,【null不限制数据类型】
value:""
}
7.slot插槽使用
7.1默认插槽
自定义组件的wxml里写的:
<view bindtap="_click" class="{{size}}" style="background-color:{{color}}">
<slot></slot>
</view>
7.2多个插槽
默认情况下,一个组件的 wxml 中只能有一个 slot 。需要使用多 slot 时,可以在组件 js 中声明启用
// 使用多个插槽 在自定义组件的js文件里写
options:{
multipleSlots:true
},
wxml:
<view bindtap="_click" class="{{size}}" style="background-color:{{color}}">
<slot name="one"></slot>
<slot name="two"></slot>
</view>
页面中调用组件:
<my-btn size="mini" color="red">
<view slot="one">123</view>
<view slot="two">456</view>
</my-btn>
8.组件间通信与事件
1、父(页面)传子(自定义的组件)
在页面的调用处,传递属性 size color 都是向子组件传递的数据
2、子传父
vue this.$emit("事件类型","值")
如下图:
3、子传父(通过this.selectComponent获取子组件的数据)
-1、在父组件里设置选择器 <my-view class="com" bindtap="_getdata"></my-view>
-2、在父组件的js里写函数
_getdata(){
let res = this.selectComponent(".com")
console.log(res)
},
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XRTPjfxJ-1620906687454)(img/day03-1.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w0LMoVVm-1620906687456)(img/day03-2.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-agPPg3oU-1620906687457)(img/day03-3.png)]
9.observers数据监听器
组件的wxml:
<view>num1:{{num1}}</view>
<view>num2:{{num2}}</view>
<view>sum:{{sum}}</view>
<button bindtap="_change">change</button>
监听单个数据的改变
组件的js:
data: {
title:"",
num1:10,
num2:20,
sum:0
},
attached(){
this.setData({
sum:this.data.num1+this.data.num2
})
},
methods: {
_change(){
this.data.num1++
this.data.num2++
this.setData({
num1:this.data.num1,
num2:this.data.num2
})
}
}
数据监听:
observers:{
"num1,num2":function(aa,bb){
console.log(aa,bb)
this.setData({
sum:aa+bb
})
}
},
监听对象, **
data: {
title:"",
num1:10,
num2:20,
sum:0,
obj:{
fieldId:10,
price:99
}
},
_change(){
this.data.num1++
this.data.num2++
this.data.obj.fieldId++
this.setData({
num1:this.data.num1,
num2:this.data.num2,
obj:this.data.obj
})
},
observers:{
"**":function(obj){
console.log(obj)
}
"obj.**":function(obj){
console.log(obj)
}
},
10.组件的生命周期
- 组件实例刚刚被创建好时,
created
生命周期被触发。此时还不能调用setData
。 通常情况下,这个生命周期只应该用于给组件 this 添加一些自定义属性字段。 - 在组件完全初始化完毕、进入页面节点树后,
attached
生命周期被触发。此时,this.data
已被初始化完毕。这个生命周期很有用,绝大多数初始化工作可以在这个时机进行。 - 在组件离开页面节点树后,
detached
生命周期被触发。退出一个页面时,如果组件还在页面节点树中,则detached
会被触发。
六、API
1.API概述
API(Application Programming Interface,应用程序接口)是一些预先定义的接口(函数),目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力。
小程序提供主要的API:小程序开发框架提供丰富的微信原生 API,可以方便的调起微信提供的能力,如获取用户信息,本地存储,支付功能等。
1.1api分类
1、事件监听api
以 on 开头的 API 用来监听某个事件是否触发,如:wx.onSocketOpen,wx.onCompassChange 等。
2、同步api
以 Sync 结尾的 API 都是同步 API, 如 wx.setStorageSync,wx.getSystemInfoSync 等
3、异步api
大多数 API 都是异步 API,如 wx.request,wx.login 等,异步api有回调函数,同样也支持promise的写法
2.缓存
在小程序里,单条缓存的大小不能超过1M,缓存的总数据量,不能超过10M,
缓存会一直存在,除非手动清空
_setStorage(){
let userinfo = {
name:"admin",
age:"18"
},
cart=[1,2,3,4]
// wx.setStorageSync('userinfo', userinfo)
wx.setStorage({
key:"cart",
data:cart,
success(res){
console.log(res)
}
})
},
_getStorage(){
let res = wx.getStorageSync('cart')
// console.log(res)
wx.getStorage({
key:"cart",
success(res1){
console.log(res1.data)
}
})
},
_deleteStorage(){
// let res = wx.removeStorageSync('cart')
// console.log(res)
wx.removeStorage({
key: 'logs',
success(res){
console.log(res)
}
})
},
_clearStorage(){
// let res = wx.clearStorageSync()
// console.log(res)
wx.clearStorage()
}
3.网络(重点)
语法
wx.request({
url:"",
method:"get/post",
data:{},
header:{"content-type":"application/json"},
success(){
},
fail(){
}
})
3.1get
_get(){
wx.request({
url: 'http://localhost:3000/products',
method:"GET",
data:{},
header:{"content-type":"application/json"},
success(res){
console.log(res)
},fail(err){
console.log(err)
}
})
},
3.2post请求
_post(){
wx.request({
url: 'http://localhost:3000/login',
method:"POST",
data:{name:"lisi"},
header:{"content-type":"application/json"},
success(res){
console.log(res)
}
})
}