微信小程序快速上手
1、微信小程序构成
- wxml (类比于html)
- wxss (类比于css)
- JavaScript (和传统js文件一样)
- json (配置文件)
2、项目结构
-
pages
-
index文件夹
- wxml
- wxss
- JavaScript
- json (这个这个页面的配置文件)
-
-
utils
-
utils帮助文档的js(可选)
-
app.js 全局入口文件
-
app.json 全局配置文件
-
app.wxss全局样式文件
-
project.config.json 这里面的内容和微信开发者工具详情里面的内容是一致的,可以修改内容进行配置
-
sitemap.json 配置小程序及其页面是否能被微信搜索到(只在发布的时候用得到)
3、app.json里面的一些个配置项见官方文档。
- 其中在微信开发者工具中pages部分添加一个路径,会自动帮你生成目录;
- window的话主要是navigationBar相关的样式配置,其中enablePullDownRefresh可以开启下拉刷新,backgroundTextStyle对于下拉刷新样式进行配置。其中对于颜色的设置的话微信只支持十六进制的颜色值!
- tabBar可以配置下方的tab栏,其中 list 接受一个数组,只能配置最少 2 个、最多 5 个 tab。
4、数据绑定
在微信里面div、span这些标签就不再适用了,我们需要使用微信提供的标签,其中view就相当于div,text就相当于span。
对于数据绑定呢,如果你之前学过vue或者其他的框架应该不陌生,就是在js的data里面定义一个数据,然后在wxml里面用{{}}来接收这个数据。
注意: 当我们使用布尔类型充当属性的时候,一定要注意字符串和花括号之前一定不要有空格,否则会导致识别失败 ,例如:
<checkbox check=" {{isChecked}}"> </checkbox>
//其中isChecked为布尔值,在data中定义为false
5、运算
运算 => 表达式
可以在{{}}中加入表达式
表达式:指的是一些简单 运算 数字运算 字符串 拼接 逻辑运算 。。
- 数字加减
- 字符串的拼接
- 三元表达式
语句:指的是复杂的代码段
- if else
- switch
- do while
- for
语句是不能直接放到表达式里面的!!!
6、列表渲染
关键:wx:for
在组件上使用 wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。
默认数组的当前项的下标变量名默认为 index,数组当前项的变量名默认为 item
<view wx:for="{{array}}">
{{index}}: {{item.message}}
</view>
Page({
data: {
array: [{
message: 'foo',
}, {
message: 'bar'
}]
}
})
使用 wx:for-item 可以指定数组当前元素的变量名,
使用 wx:for-index 可以指定数组当前下标的变量名:
<view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itemName">
{{idx}}: {{itemName.message}}
</view>
wx:for 也可以嵌套,下边是一个九九乘法表
<view wx:for="{{[1, 2, 3, 4, 5, 6, 7, 8, 9]}}" wx:for-item="i">
<view wx:for="{{[1, 2, 3, 4, 5, 6, 7, 8, 9]}}" wx:for-item="j">
<view wx:if="{{i <= j}}">
{{i}} * {{j}} = {{i * j}}
</view>
</view>
</view>
注意: 1、当 wx:for 的值为字符串时,会将字符串解析成字符串数组
<view wx:for="array">
{{item}}
</view>
就等同于
<view wx:for="{{['a','r','r','a','y']}}">
{{item}}
</view>
注意:2、 花括号和引号之间如果有空格,将最终被解析成为字符串
<view wx:for="{{[1,2,3]}} ">
{{item}}
</view>
就等同于
<view wx:for="{{[1,2,3] + ' '}}" >
{{item}}
</view>
Wx:key
如果列表中项目的位置会动态改变或者有新的项目添加到列表中,并且希望列表中的项目保持自己的特征和状态(如 input 中的输入内容,switch 的选中状态),需要使用 wx:key 来指定列表中项目的唯一的标识符。
wx:key 的值以两种形式提供
- 字符串,代表在 for 循环的 array 中 item 的某个 property,该 property 的值需要是列表中唯一的字符串或数字,且不能动态改变。
- 保留关键字
*this代表在 for 循环中的 item 本身,这种表示需要 item 本身是一个唯一的字符串或者数字。
当数据改变触发渲染层重新渲染的时候,会校正带有 key 的组件,框架会确保他们被重新排序,而不是重新创建,以确保使组件保持自身的状态,并且提高列表渲染时的效率。
如不提供 wx:key,会报一个 warning, 如果明确知道该列表是静态,或者不必关注其顺序,可以选择忽略。
7、条件渲染
wx:if = "{{true/false}}" --->双花括号一定要用""包裹起来
- wx:if
- wx:elif
- Wx:else
hidden
- 在标签上直接加上熟悉hidden
- hidden = "{{true/false}}"
使用场景: wx:if vs hidden
因为 wx:if 之中的模板也可能包含数据绑定,所以当 wx:if 的条件值切换时,框架有一个局部渲染的过程,因为它会确保条件块在切换时销毁或重新渲染。
同时 wx:if 也是惰性的,如果在初始渲染条件为 false,框架什么也不做,在条件第一次变成真的时候才开始局部渲染。
相比之下,hidden 就简单的多,组件始终会被渲染,只是简单的控制显示与隐藏。
一般来说,wx:if 有更高的切换消耗而 hidden 有更高的初始渲染消耗。因此,如果需要频繁切换的情景下,用 hidden 更好,如果在运行时条件不大可能改变则 wx:if 较好。
8、事件绑定
情景描述:点击+按钮数字加一,点击 - 按钮数字减一。
实现:
-
需要给input标签绑定input事件,绑定关键字 bindinput
-
如何获取输入框的值?通过事件源对象来获取e.detail.value
-
把输入框的值赋值到data当中,不能直接this.data.num = e.detail.value/this.num = e.detail.value
正确的写法是this.setData({
num:e.detail.value //通过对象的方式来赋值
})
事件绑定参数的传递:
在小程序中不能像我们之前一样,在方法名后的括号里面直接传参。比如bindtap="handletap(1)",这样是错误的,微信小程序会把handletap(1)当成一个整体,导致出错。
我们需要:
- 加入一个点击事件 bindtap
- 无法在小程序当中的事件中直接传参的
- 通过自定义属性的方式 data-自定义属性名
- 事件源(e)中获取自定义属性
9、样式wxss
-
尺寸单位
- rpx -->可以根据屏幕宽度自适应。规定屏幕宽度为750 rpx,比如在iphone6上屏幕宽度为375px共有750个物理像素,则750px = 375 rpx,1 rpx = 0.5px = 1 物理像素。
-
样式导入
- 样式通过@Import导入
- 路径只支持相对路径
-
选择器
- 小程序里面不支持*通配符,所以以下代码无效
*{ margin:0; padding:0; box-sizing:border-box; } -
预处理器
-
less预处理器
-
如果使用的是vscode编译器的话,我们需要先安装easy less插件,然后在setting.json中进行配置
"less.compile":{
"outExt": '.wxss'
}
//1、使用less定义变量 @color:yellow //2、使用变量 text{ color:@color }- less文件天生支持import导入
-
10、常见组件
-
view ---div
-
text ---span 里面只能嵌套text 、只有这个标签可以实现长按文字 复制、可以对回车、空格进行识别
-
image
- 腾讯规定打包上线的项目大小不能超过2M,所以很多资源我们都需要把它放到网上,所以当我们要使用图片的时候我们默认使用外网的图片;
- 我们的图片是存在默认宽高的,默认宽度320px,默认高度240px;
- 其中image里面的mode属性来决定我们的图片内容如何和图片标签宽高做适配;
- 小程序中的图片自动就支持懒加载的lazy-load;
-
swiper(轮播图)
- 一定要搭配swiper-item使用,最外层是swiper;里面嵌套swiper-item
- 每一个轮播项是swiper-item,swiper存在默认样式,width:100% height:150px;
- swiper的高度无法由内容撑开,所以需要我们先找出来原图的宽高,然后再等比例的给swiper定宽高;
-
navigator导航组件
- 类似超链接标签 --里面有一个url是要跳转的路径,可以放绝对路径和相对路径;
- 块级元素,会自动换行,可以加宽度和高度;
- target属性--可以跳到当前小程序的页面或者其他小程序的页面 self 默认值 是当前的小程序,miniProgramma;
- open-type 跳转的方式
-
rich-text(富文本)
-
可以将字符串解析成对应标签类似于vue中的v-html功能
-
nodes属性来实现
- 接收标签字符串
- 接收对象数组
-
-
button标签 ---开放能力 open-type
- contact :打开客服会话 ---只能真机调试打开
- share :转发当前小程序 ---只能发给朋友,不能发到朋友圈
- getPhoneNumber :获取当前用户的手机号,要结合一个事件来使用,必须是企业才可以获取
- getUserInfo :获取当前用户信息
- lanuchApp:在小程序中直接打开app ---需要先在app中通过app的某个链接打开小程序,在小程序中再通过这个功能重新打开app
- openSetting:打开小程序中默认的授权页面 --授权页面中只会出现用户曾经点击过的权限
- feedback:打开小程序中内置的意见反馈 -- -只能真机调试打开
11、自定义组件
-
创建组件
- 自定义组件也是由四个页面构成,在components里面建好文件夹之后,在微信开发者工具操作台左上角点击➕或者鼠标右键,选择新增components就自动建好啦~
-
声明组件
- 哪个页面要用这个自定义组件,就在他的json文件中声明。在usingComponents:{ "组件名":相对路径}
-
在页面中使用组件
- 在wxml中通过标签的方式使用组件