小程序包含一个描述整体程序的app和多个描述各自页面的page
小程序的主体部分由三个问价组成,必须放在根目录,如下:
app.js =>小程序的逻辑
app.json=> 小程序的公共配置
app.wxss => 小程序的公共样式表
一个程序页面由四个相同路劲和文件名的文件组成,分别是:
- js 页面逻辑
- wxml 页面结构
- json 页面配置
- wxss 页面样式表
在项目中,一下的问价经过编译,因此上床之后无法直接访问.js app.json .wxml .wxss
小程序根目录下个的app.json 文件用来对微信小程序进行全局配置,决定页面文件的路径,窗口表现,设置网络超时时间,设置多tab
-
{ "pages": [ "pages/index/index", "pages/logs/index" ],//页面的地址 "window": { "navigationBarTitleText": "Demo" },//导航栏文本 "tabBar": { "list": [{ "pagePath": "pages/index/index", "text": "首页" }, { "pagePath": "pages/logs/index", "text": "日志" }]//导航页面 }, "networkTimeout": { "request": 10000, "downloadFile": 10000 }, "debug": true, "navigateToMiniProgramAppIdList": [ "wxe5f52902cf4de896" ] } 完整配置项说明请参考小程序全局配置 页面配置
什么是wxml和html的区别
- 标签名称不同 HTML(div,span,img,a) WXML(view,text,image,navigator)
- 属性节点不同
- 提供了类似于Vue中的模板语法 数据绑定 列表渲染 条件渲染
什么是wxss ,类似与css ,区别?
-
新增了rpx尺寸单位 在不同大小的屏幕上自动进行换算
-
提供了全局的样式和局部样式 形目有根目录中app.wxss会作用域所有小程序页面
-
-
局部页面的.wxss样式仅对当前页面生效
-
wxss仅支持部分选择器 类选择器,id选择器,元素选择器,并集选择器,后代选择器,::after和::before等伪类选择器
-
.js文件
- app.js是整个小程序项目的入口,通过调用App() 来调用启动整个小程序
- 页面的.js文件 是页面的入口文件,通过调用Page()函数来创建并运行页面
- 普通的.js文件 是普通的功能模文件,用来封装公共的函数或属性供页面使用
host environment 程序运行所必须依赖环境
手机微信依赖于安卓或ios系统 ,而微信则是小程序的宿主环境,小程序借助堵住环境提供的能力,可以完成许多普通网页无法完成的功能,例如微信扫码,微信登录,地理定位
host environment 包含的内容
- 通信模型
- 运行机制
- 组件
- API
通信的主体
小程序通信的主体是渲染层和逻辑层 ,
wxml模板和wxss样式工作在渲染层
js脚本工作在逻辑层
通信的模型分为两部分 1. 渲染层和逻辑层之间的通信 2.逻辑层和第三方服务器之间的通信都是由微信客户端进行转发
小程序启动的过程
把小程序的代码包下载到本地,解析app.json 全局配置文件 执行app.js小程序的入口文件,调用App()创建小程序实例 渲染小程序首页 小程序启动完成
页面渲染的过程
-
加载解析页面的.json配置文件
-
加载页面的.wxml模板和 wxss样式
-
执行页面的.js文件,调用Page()创建页面实例
host environment =>组件
组件也是由宿主环境提供的,开发者可以基于组件快速搭建出漂亮的页面结构.官方把小程序的组件分为了9大类
视图组件
view 相当于html中的div
sroll-view 可滚动的视图区域
swiper swiper-iten 轮播图容器组件和轮播图item组件
- indicator-dots 是否显示面板指示点
- indicator-color 指示点颜色
- indicator-active-color 选中的指示点的颜色
- autoplay 是否自动切换
- interval自动切换时间间隔
- circular 是否采用衔接滑动
text 和 rich-text
text 文本组件 类似于span ,行内标签 rich-text 富文本组件 支持把HTML字符串渲染为wxml结构
button
功能更加的强大 type size plain 更多功能查文档
image
image组件中的mode 属性用来指定图片的裁剪和缩放模式 ,常用的mode
-
scaleToFill 缩放模式,不保持纵横比缩放图片,使图片宽高完全拉伸填满image元素
-
aspectFit 缩放模式 保持纵横比 是图片不的长边能够完全显示出来 会留白
-
aspectFill 缩放模式 保持纵横比,只能保证图片的短边能完全显示出来 会删减
-
widthFix 宽不变,高度自动变化
-
height 高度不变,宽度自动变化
小程序版本
- 开发版本 使用开发者工具,可将代码上传到开发版本中,开发版本只保留没人最新的一份上传的代码,点击提交审核,可将代码提交审核,
- 体验版本,可以选择某个开发版本作为体验版,并选取一份体验版
- 审核中的版本 之后一份代码处于审核,有审核结果后以客发布发哦吸纳上也可以直接重新提交审核和,覆盖源审核版本
- 线上版本 线上所有用户使用的代码版本,该版本在最新版发布后被覆盖
基础内容
数据绑定
类似于vue,在.js中的page的data中定义数据,在wxml中使用数据,
特别注意
小程序中,无论标签的属性还是标签的内容,都是通过mustache {{meaasge}}语法进行数据绑定的,
事件绑定
事件是渲染层到逻辑层之间通讯的方式,用户在渲染层产生的行为,反馈到逻辑进行业务的处理
事件回调触发的时候,形参中的会默认有个事件对象event
特别注意
事件处理函数必须与data平级
有一下属性
- type 事件类型
- timeStamp 页面达赖书法事件所经过的毫秒数
- target 触发事件的组件的一些属性值集合 触发该事件的源头组件
- currentTarget 当前组件的一些属性值的集合 则是当前事件所绑定的组件
小程序传参
可以使用data-shuxing 在event.dataset中可以获取传入的参数
在小程序的双向绑定
类似于input 在小程序中加入了很多特殊的api 类似 于placeHolder-style focus type 可以拉取出小程序提供的自带的键盘类型
然后监听bindinput 事件 然后再回调函数中 调用小程序自带的this.setData({ })
条件渲染
wx:if="" wx:elif wx:else
如果一次性控制多个组件的展示,可以使用block这个标签进行包裹,类似于template,知识一个包裹性质的容器
wx:if 和hidden 的区别类似于v-if 和v-show 如果经常需要使用某个组件,最好使用hidden
wx:for类似于vue 的v-for
区别: wx:for="{{dataList}}" 用的时候默认是item与index 可以自定义wx:for-index="theIndex" wx:for-item="theItem" 而v-for="(theItem,theIndex) in dataList"
相同点: wx:key="theIndex" 与 :key="theIndex" diff算法
wxss模板样式
wxss具有css大部分的特性.同时,wxss还对css进行了扩充以及修改,以适应微信小程序的开发
主要集中再两点
rpx
rpx是微信小程序独有放入,用来解决屏幕适配的问题\
rpx的实现原理非常简单 就,监狱不同设备屏幕的大小不同,为了实现屏幕的自动适配,rpx把所有设备的屏幕,在宽度上等分750份,1份代表1rpx所以:在较小的 设备上,1rpx所代表的宽度较小,在较大的设备上,1rpx所代表的宽度较大
样式导入
使用wxss提供的@import语法,可以导入外联的样式表
全局样式和局部样式
定义在app.wxss中的样式为全局样式,作用于每一个页面
局部样式: 在页面的.wxss文件中定义的样式为局部样式,值作用于当前页面
注意:1 当局部样式和与 全局样式冲突的时候,根据就近原则,局部样式会覆盖全局样式
2.当局部样式的权重大于或等于全局样式的权重时,才会覆盖全局的样式
全局配置文件以及常用的配置项
小程序目录下的app.json时小程序的全局配置文件
- pages 记录当前小程序所有页面的存放路径 放在第一位的,就是最先渲染的页面
- window 全局设置小程序窗口的外观
- tabBar 设置小程序底部的tabBar效果
- style 是否启用新版的组件样式
window
-
导航栏 -顶部导航区域
-
背景去-默认不可见,下拉才显示
-
页面主体区-页面主体用来显示wxml中的布局
-
navigationBarTitleText 导航栏标题文字内容
-
navigationBarBackgroundColor 导航栏背景颜色
-
navigationBarTextStyle 导航栏标题颜色
-
backgroundColor 窗口的背景色
-
backgroundTextStyle 下拉loading 的样式,仅支持dark/light
特别注意: 有坑
-
tabBar配置的pagePath必须在同时在app.json中pages中同时配置 list 是数组类型
-
不同于vue和html ,在小程序中新增页面,不能独立运行,必须在相应的.js文件中写onLoad:function(){}
下拉刷新一般页面单独配置
网络数据请求
如何在小程序中发起网络请求
- 该请求不能称作ajax请求,微信官方要求使用于宁使用https协议
- 配置后台的request 合法域名
- 具体代码
- 小程序中的网络请求不存在在跨域的问题
小程序中网络数据请求的限制
处于安全性方面的考虑,小程序官方对数据接口的请求做出了如下两个限制
1.只能请求https 类型的接口
2.必须将接口的域名添加到信任列表之中
配置request 合法域名
需求描述:假设自己的微信小程序中,希望请求www.escook.cn/
配置步骤:登录小程序管理后台->开发->开发设置->服务器域名->修改request合法域名
小程序发送网络请求很类似jquery 的$.ajax
wx.request({
// 请求地址必须是https 开头的
// 必须在 开发的故武器域名中修改增添request合法域名
url:"https://escook.cn/api/get",
method:"get",
data:{
name :"niaho ",
age:22
},
success:(res)=>{
console.log(res)
}
})
跳过request 合法域名校验
如果只有http协议
可以临时开启[开发环境不校验合法域名,web-view,tls,https]选项 ,跳过request 合法域名的校验,跳过仅限在开发和调试阶段使用
ajax依赖于XMLHttpRequest 这个对象,小程序叫做发起网络数据请求
页面配置
小程序中,每个页面都有自己的.json文件,用来对当前页面的窗口外观,页面效果等进行配置
小程序中,app.json中的window节点,可以全局配置 小程序中每个页面的窗口表现
如果某些小程序想要拥有特殊的窗口表现,此时,页面级别的.json配置文件 很典型的例子navigationBarTitleText , 符合就近原则
API的3大分类
1.事件监听API ,监听事件的触发 wx.onWidthResize(function callback)
2.同步API 以Sync 结尾的API都是同步API ,执行的结果 可以通过函数返回值直接获取
wx.setStorageSync('key','value')
3.异步API 类似于jQury 中的$.ajax(options)函数 ,需要通过success,fall ,complete 接受调用的结果
表单组件
导航组件
媒体组件
map地图组件
canva 画布组件
开放能力
无障碍访问
杂乱知识点积累
url的编码与解码
为什么要编码?
Global 对象的encodeURL()和encodeURLComponent()方法可以对URL(uniform Resourse Identifiers ,通用资源标识符) 进行编码 以便发送给浏览器,有效的URL中不能包含某些字符,如空格,而这两个URL编码方法就可以对URL进行编码,他们用特殊的UTF_8编码替换所有无效的字符,从而让浏览器3能够结构和理解
编码
其中encodeURL()主要用于整个URL 例如 www.wrox.com/illegal 而encodeURLComponent()主要用于对URL中的某一段进行编码 主要区别在于encodeURL()不会对本身属于URL的特殊字符进行编码,例如冒号,正斜杠,问好,井字号 ,encodeURLComponent 则会对它所发现的任何非标准字符进行编码
解码
与以上两个方法对应的方法使decode URL()和decodeURLComponent().
decodeURL只能对encodeURL替换的字符进行解码,例如,它可将%20替换成一个空格,但不会对%23作任何处理,因为%23表示井字号而不是使用encodeURL()替换的,
而decodeURLComponent 能够解码使用任何特殊字符的编码
rpx?
rpx是微信小程序的尺寸单位,一般以iphone6为例子,屏幕宽度375px,共有750px个物理像素,则1rpx=0.5px=1物理像素
Object.keys()方法的常见用法
传入对象,返回对象的key值
var obj=new Object()
obj={a:1,b:2}
console.lof(Object.keys(obj)) //返回数组中所有属性的值所组成的数组
传入字符串 ,返回索引
var str=new String()
str="abc123"
OBject.keys(str)//将字符串所有每一个字符化为数组中的每一项
传入构造函数,返回数组或属性名