传统web和微信小程序结构上的区别
结构 | 传统web | 微信小程序 |
---|---|---|
结构 | HTML | WXML |
样式 | CSS | WXSS |
逻辑 | javascript | javascript |
配置 | 无 | JSON |
全局配置
app.json 是当前小程序的全局配置,包括了小程序的所有页面路径、界面表现、网络超时时间、底部 tab 等配置
属性 | 描述 |
---|---|
pages | 页面路径列表 |
window | 全局的默认窗口表现 |
tabBar | 底部 tab 栏的表现 |
链接:developers.weixin.qq.com/miniprogram…
页面配置
页面配置的文件是page.json。只能设置全局配置中关于window字段的功能。如设置页面标题,导航栏颜色等。
- 不用写window字段
- 优先级比全局配置高
数据绑定---插值表达式
- 数据绑定也叫插值表达式,是一种将变量渲染到页面中的技术
- 插值:把表达式插入到页面中的写法叫做插值, 符号是 {{}}
<view>{{a}}</view>
<view>{{flag?'小屁孩':'坏孩子'}}</view>
条件渲染
两种方式:
- wx:if
- hidden
<!-- wx:if 当判断条件为 true时,则显示元素,为false时,则移除元素 -->
<view wx:if="{{ifShow}}">{{ifShow?'if显示':'if移除'}}</view>
<!-- hidden:当判断条件为 true时,则隐藏元素,为false时,则显示元素 -->
<view hidden="{{ishidden}}">{{ishidden?'hidden隐藏':'hidden显示'}}</view>
注意:当使用条件渲染时,双引号和大括号 中间不能留有空白, 以下代码会导致 wx:if 的值为 true
wx:if 和 hidden 之间的区别:
相同点:
wx:if 和 hidden 都能控制标签的显示与隐藏
不同点:
- wx:if 实现标签隐藏时通过移除标签来实现的
- hidden 实现标签隐藏时通过添加样式来是现实的 建议:如果一个标签频繁切换显示,建议使用 hidden 实际开发中,很多人更多使用 wx:if
列表渲染
- wx:for-item 可以指定数组当前元素的变量名
- wx:for-index 可以指定数组当前下标的变量名
- wx:key 可以在渲染每一项时,指定一个唯一的标识,方便小程序查找和提高重新渲染的效率,防止数组种的元素频繁修改
wx:key 针对不同的数组类型有不同的写法
- 数组对象:wx:key = "字符串" 表示对象唯一属性
- 普通数组:wx:key = "*this"
<!-- 遍历数组 -->
<view>遍历数组</view>
<!-- <view wx:for="{{list}}">{{index}}{{item}}</view> -->
<!-- 改变固定的索引变量和属性值 -->
<!-- <view wx:for="{{list}}" wx:for-index="i" wx:for-item="v" >{{i}}{{v}}</view> -->
<!--
wx:key:针对不同的数组类型有不同的写法
数组对象:wx:key="字符串" 字符串表示对象唯一属性
普通数组:wx:key="*this"
-->
<view>````普通数组`````</view>
<view wx:for="{{list}}" wx:key="*this">{{item}}</view>
<view>````数组对象`````</view>
<view wx:for="{{list1}}" wx:key="id">{{item.name}}</view>
事件绑定
小程序中绑定事件,通过bind和catch关键字来实现。如 bindtap 和 catchtap
- bind:事件冒泡
- catch:事件捕获
<!-- bind:事件冒泡 -->
<view bindtap = "handleTap">
父标签(事件冒泡)
<view bindtap = "handleTap">
子标签
</view>
</view>
<!-- catch:事件捕获 -->
<view catchtap = "handleTap">
父标签(事件捕获)
<view catchtap = "handleTap">
子标签
</view>
</view>
Page({
// 事件冒泡和捕获
handleTap(){
console.log('text',);
}
})
事件传参
通过自定义属性的方式传参
<!-- 事件传参 -->
<!-- 如果没有加花括号,则传入的参数为字符串, -->
<view bindtap = "handleTap1" data-num="100">输出100</view>
<view bindtap = "handleTap1" data-num="{{200}}">输出200</view>
data 的获取和设置
- 获取 data 中的值
- this.data.属性名
- 设置 data 中的值
- this.setData({属性名:属性值})
<view bindtap = "handleTap">{{num}}点击自增</view>
<!-- 给数组添加元素 -->
<view bindtap = "handleAdd" >+</view>
<view wx:for="{{list}}" wx:key="*this">{{item}}</view>
<!-- 设置对象属性 -->
<view bindtap = "handleObj">{{person.name}}-{{person.age}}</view>
Page({
data: {
num: 100,
list:['🐕'],
person:{
name:'小狗',
age:1
}
},
handleTap(){
// 获取 data中的值
// ⭐this.data.属性名
console.log(this.data.num);
let num = this.data.num
// 设置 data中的值
// ⭐this.setData({属性名:属性值})
this.setData({num:++num})
},
handleAdd(){
// 1、获取到数组(不建议直接修改 数组和对象的值)
// 浅拷贝
const list = [...this.data.list]
list.push('🐒')
this.setData({list})
},
handleObj(){
// 高效
this.setData({'person.age':10})
// 复杂、低效、麻烦
// const person = {...this.data.person}
// person.age=20
// this.setData({person})
}
})
微信小程序的样式
- 后缀名:wxcss
- 全局样式(app.wxss)和 页面样式(页面.wxss)
- 页面样式的优先级比全局样式高
- 不支持通配符 *
- 通过挨个书写标签选择器来实现样式格式化
- 新增了一个单位 rpx
- rpx(responsive pixel): 规定不管屏幕为多少px,按照rpx来换算 为750rpx
- 屏幕的宽度 = 750rpx 注意:微信小程序不能使用 rem单位,因为rem是相对于web页面的根元素html标签的。
内置组件
image
- 默认大小为 320 * 240
- 支持懒加载
- 通过mode属性控制渲染效果
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
src | String | 图片资源地址 | |
mode | String | 'scaleToFill | 图片裁剪、缩放的模式 |
mode 裁剪模式,决定图片内容如何显示
模式 | 值 | 说明 |
---|---|---|
缩放 | scaleToFill | 不保持纵横比缩放图片,使图片的宽高完全拉伸至填满 image 元素 |
缩放 | aspectFit | 保持纵横比缩放图片,直到图片某一边碰到边界 |
缩放 | aspectFill | 保持纵横比缩放图片,直到图片完全铺满边界 |
缩放 | widthFix | 宽度不变,高度自动变化,保持原图宽高比不变 |
<image mode="widthFix" src="/images/1.jpg"></image>
swiper
swiper理解为小程序内置的轮播图标签,拥有了它可以让我们特别方便实现轮播功能
- 默认宽度 和 高度 为 100% * 150px
<!-- 轮播图 -->
<swiper indicator-dots circular autoplay>
<swiper-item><image src="/images/1.jpg"/></swiper-item>
<swiper-item><image src="/images/3.jpg"/></swiper-item>
<swiper-item><image src="/images/2.jpg"/></swiper-item>
</swiper>
swiper 和 image 相结合的难点
- swiper 默认高度是 150px
- image 默认高度是 240px 那么当两者在一起显示的时候,往往需要我们自行去微调两者的高度,已达到看起来比较和谐的效果
navigator
navigator:跳转的页面是当前小程序内时,根据页面的类型不同,要设置对应的open-type才有对应效果
值 | 说明 |
---|---|
navigate | 保留当前页面,跳转到应用内的某个页面,但是不能跳到 tabbar 页面 |
redirect | 关闭当前页面,跳转到应用内的某个页面,但是不允许跳转到 tabbar 页面 |
switchTab | 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面 |
reLaunch | 关闭所有页面,打开到应用内的某个页面 |
navigateBack | 关闭当前页面,返回上一页面或多级页面 |
当想要跳转到其他的小程序页面时
- 设置 target =“miniProgram”
- 填写 属性 short-link = “链接”(版本要求 2.18.1)或者设置 app-id (推荐)
<!-- 跳转页面 -->
<!-- open-type="navigate" -->
<navigator url="/pages/todo/todo">todo</navigator>
<navigator open-type="redirect" url="/pages/word/word">word</navigator>
<navigator open-type="switchTab" url="/pages/index/index">index</navigator>
<!-- 跳转小程序 -->
<navigator target="miniProgram" short-link="#小程序://不凡潮空间/不凡潮空间/xKdMOirAtr2sdRe">不凡潮空间</navigator>
<navigator target="miniProgram" app-id="wx8a5d6f9fad07544e">微信读书</navigator>
button
值 | 说明 |
---|---|
contact | 打开客服会话,如果用户在会话中点击消息卡片后返回小程序,可以从 bindcontact 回调中获得具体信息 |
share | 触发用户转发 |
getPhoneNumber | 获取用户手机号,可以从bindgetphonenumber回调中获取到用户信息 |
feedback | 打开“意见反馈”页面,用户可提交反馈内容并上传日志,开发者可以登录小程序管理后台后进入左侧菜单“客服反馈”页面获取到反馈内容 |
<button open-type="contact">联系客服</button>
<button open-type="share">转发</button>
<button open-type="getPhoneNumber" bindgetphonenumber = "handleGetPhoneNumber">获取手机号码</button>
<button open-type="feedback">意见反馈</button>
rich-text
小程序中内置的富文本标签,通过传入 nodes 属性来使用
自定义组件
定义组件理解为允许我们创造自己想要的某些效果的标签
- image是小程序指定的图片标签
- border-image 可以是我们自己创造的标签 3、自定义组件中的函数必须写在methods方法中 自定义组件还具有简化页面结构、封装复用代码的功能
组件的注册在页面中的 页面.json文件进行注册
组件在wxml中直接使用
父传子
父组件传递数据
<view class="borderImage">
<border-image bindsrcChange = "handleSrcChange" src="/images/1.jpg"></border-image>
<border-image bindsrcChange = "handleSrcChange" src="/images/2.jpg"></border-image>
<border-image bindsrcChange = "handleSrcChange" src="/images/3.jpg"></border-image>
</view>
子组件接收数据
properties: {
src:{
type:String,
value:'',
},
},
子组件使用数据
<image mode="widthFix" class="subImages" src="{{src}}"></image>
子传父
子组件绑定事件
<image mode="widthFix" bindtap = "handleSubImage" class="subImages" src="{{src}}"></image>
事件触发时,获取图片的 src数据,并触发父组件的自定义事件
methods: {
handleSubImage(e){
this.triggerEvent("srcChange",this.properties.src)
}
}
父组件在使用子组件时要监听自定义事件
<border-image bindsrcChange = "handleSrcChange" src="/images/1.jpg"></border-image>
父组件获取子组件传递过来的数据
handleSrcChange(e){
this.setData({
src:e.detail
})
}
微信小程序生命周期
分类
- 应用生命周期
- 页面生命周期
- 组件生命周期
应用生命周期
属性 | 说明 |
---|---|
onLaunch | 当小程序初始化完成时,会触发 onLaunch(全局只触发一次);作用:初始化,发送网络请求 获取全局都需要用到的数据(云开发的初始化!!! ) |
onShow | 当小程序启动,或从后台进入前台显示,会触发 onShow(重新开启播放 定时器) |
onHide | 当小程序从前台进入后台,会触发 onHide;屏幕看不见当前小程序 切换到其他的app应用(取消定时 异步任务 暂停 播放) |
onError | 当小程序发生脚本错误,或者 api 调用失败时,会触发 onError 并带上错误信息(发送网络请求 把错误信息 收集起来 ) |
onThemeChange | 监听系统主题变化 |
页面生命周期
属性 | 说明 |
---|---|
onLoad | 生命周期回调—监听页面加载;作用:发送异步网络请求 数据 页面渲染 |
onReady | 生命周期函数--监听页面初次渲染完成;作用:获取到页面元素 样式 宽度 高度 |
onShow | 生命周期函数--监听页面显示;作用:重新开启定时器 播放器 发送请求获取数据的功能!! |
onHide | 生命周期函数--监听页面隐藏 导航标签 A页面 跳转到B页面 A页面就被隐藏了 ;使用导航 跳转页面的时候 如果 保留当前页面 隐藏 就会触发;作用:停止定时器 暂停 播放器 |
onUnload | 生命周期函数--监听页面卸载;使用导航 跳转页面的时候 如果 关闭 卸载 就会触发;作用:停止定时器 暂停 播放器 |
onPullDownRefresh | 页面相关事件处理函数--监听用户下拉动作 |
onReachBottom | 页面上拉触底事件的处理函数 |
onShareAppMessage | 用户点击右上角分享 |
onShareTimeline | 用户点击右上角转发到朋友圈 |