01.小程序简要介绍
Posted Ruovan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了01.小程序简要介绍相关的知识,希望对你有一定的参考价值。
文章目录
写在开头
- 初步学习中,若有错误,还请谅解!
微信小程序的基本结构
01. 小程序简介
- 渲染层:web View渲染
- 有多个页面,可以有多个web View线程
- 逻辑层:JsCore线程
02. 项目基本结构
├
├── pages —————————————————— (页面文件夹)
│ │── index —————————————— (子页面文件夹)
│ │ ├── index.wxml ————— (子页面模板文件)
│ │ ├── index.js ——————— (子页面逻辑文件)
│ │ ├── index.json ————— (子页面配置文件)
│ │ └── index.wxss ————— (子页面样式文件)
│ └── logs
│ ├── logs.wxml
│ └── logs.js
├── utils —————————————————— (第三方工具文件夹)
├── app.js ————————————————— (全局入口文件)
├── app.json ——————————————— (全局配置文件)
├── app.wxss ——————————————— (全局公共样式)
├── project.config.json ———— (项目配置文件)
├── sitemap.json ——————————— (索引配置文件)
├─
03. 关于app.json
-
概念:
app.json
是小程序的全局配置,包括小程序的所有页面路径、界面表现等等 -
语法:键值对的形式,key值必须包裹在双引号
""
中,不能是单引号- value值只支持:
number
、string
、boolean
、array
、object
、null
- 不能使用注释
- value值只支持:
-
基本配置
{ ## 原则上 json 文件内不允许注释,这里为了方便学习加了一些注释 // 页面配置:项目所有页面路径都要在这里配置 "pages": [ "pages/index/index", // 一般,第一个页面默认为首页 // 后续所有页面都要在这里定义 // 但直接通过微信开发者工具添加pages,会自动添加在这里 // 所以一般情况下,不需要设置 "pages/logs/logs" ], // window选项:用于设置小程序的状态栏、导航条、标题、窗口背景色 "window": { "navigationBarBackgroundColor": "#ffffff", // 导航栏背景色 "navigationBarTextStyle": "black", // 导航栏标题颜色 "navigationBarTitleText": "微信小程序导航栏标题", // 导航栏标题 "backgroundColor": "#eeeeee", // 窗口背景色 "backgroundTextStyle": "light" // 下拉loading颜色 dark | light } // 底部tab栏 "tabBar": { "color": "#ccc", // 文字颜色 "selectedColor": "#f00", // 选中时的文字颜色 "backgroundColor": "#eee", // Tab栏的背景色 "position": "bottom", // Tab栏的位置-- bottom | top // Tab栏的选项 "list": [ { "text": "Tab1", // Tab上显示的按钮文字 "pagePath": "pages/index/index", // 绑定的页面路径 "iconPath": "", // 图标(未选中) "selectedIconPath": "" // 图标(已选中) }, { "text": "Tab2", "pagePath": "pages/logs/logs" } ] } }
注:这里只作简要介绍,具体配置需要到官网查看
04. 关于app.js
-
概念:
app.js
是小程序的逻辑文件 -
语法:同JS语法
-
基本结构:
- 需要使用
App()
构造器来注册一个程序App - 在其它页面JS文件中,可以使用
getApp()
来获取这个程序实例
App({ onLaunch: function(){ // 小程序初始化完成之后触发一次 }, onShow: function(options){ // 小程序启动时,或从后台进入前台显示时,触发 }, onHide: function(){ // 小程序从前台进入后台时触发 }, onError: function(){ // 小程序发生脚本错误,或者API调用失败时触发 }, globalData: "全局共享数据" })
onLaunch、onShow、onHide是小程序的生命周期函数
由用户主动触发,不应该从其它代码里来调用生命周期函数
因此,在打开小程序时,会传递
options
参数给onLaunch
和onShow
// options参数 options.path // 打开小程序的页面路径 options.query // 打开小程序的页面参数query options.scene // 打开小程序的场景值 options.shareTicket options.referrerInfo // 从另一个小程序|公众号|App打开时的参数
- 需要使用
05. 关于app.wxss
- 概念:
app.wxss
是小程序的一套样式语言,用于描述WXML
的组件样式,作用于全局样式 - 语法:同CSS语法
- 扩展了响应式长度单位:
rpx
(responsive pixel),可以根据屏幕宽度进行自适应,规定屏幕宽度为750rpx
- 扩展了样式导入:
@import
,导入外联样式表,只支持相对路径- 引入样式文件:
@import url('./test.css')
- 引入样式文件:
- 权重:
important
(最大)、style
(1000)、id
(100)、class
(10)、Tags
(1) - 不支持通配符
*
选择器
- 扩展了响应式长度单位:
注:以下用
page
代指每一个单独的页面
06. 关于page.json
-
概念:
page.json
用来单独定义每个页面的一些属性,如顶部颜色,是否允许下拉刷新等等 -
语法:同全局配置文件
app.json
-
页面的配置项会覆盖
app.json
的window
属性中相同的配置项 -
且,页面配置项只能设置部分
window
配置项的内容
-
07. 关于page.wxml
-
概念:
page.wxml
是微信小程序设计的一套标签语言,用于构建页面的基本架构 -
语法:同Vue中
<template>
的用法- 属性格式为键值对形式
- 大小写敏感
- 可进行数据绑定
- 可使用微信
wx:
指令
-
常见标签:
view
、text
、image
、button
、navigator
、swiper
、radio
、checkbox
<view>用法同div</view> <text>主要用于文本</text> <image>放置图像</image> <button>设置一个按钮</button> <block>块级标签,用法同template,用于包裹块,但不会渲染到DOM节点</block>
-
数据绑定
-
数据绑定方式同Vue中数据绑定方式一致,使用插值表达式来进行
注意,即使在属性里,也要使用插值表达式,这一点和Vue不一样
<!-- 普通绑定 --> <view>{{ name }}</view> <!-- 绑定属性 --> <view id="{{ myId }}"></view> <!-- 三元表达式 --> <view>{{ num === 0 ? '等于0' : '不等于0' }}</view> <!-- 算术运算 --> <view>{{ a + b }}</view>
-
-
微信指令:微信小程序的指令使用
wx
开头-
(1)条件渲染
-
使用
wx:if
来进行逻辑判断,有多个则使用:wx:if
、wx:elif
、wx:else
注意:这里和Vue不一样,
wx:elif
没有连接线
-
<!-- 进行条件逻辑判断 --> <view wx:if="{{ num < 10 }}"> 小于10 </view> <view wx:elif="{{ num > 10 }}"> 大于10 </view> <view wx:else> 等于10 </view>
<!-- 类似的用法:hidden --> <view hidden="{{ num < 10 }}">小于10</view> <view hidden="{{ num > 10 }}">大于10</view>
两者区别同Vue中的
v-if
和v-show
wx:if
:为真则渲染到页面,为假则不渲染hidden
:为真为假都会渲染到页面,为假则通过display:none
来隐藏元素
-
(2)循环渲染
-
使用
wx:for
来进行循环,可以作用于数组、对象-
使用
wx:for-index
来指定索引下标的变量名,如没有指定,则默认index
为索引项 -
使用
wx:for-item
来指定元素项的变量名,如没有指定,则默认item
为元素项 -
使用
ws:key
来标识唯一,用以提高渲染性能,同Vue中的key注意:这里和Vue不一样,小程序里的key使用循环值时,是不需要再加
item
前缀的<!-- 这里 id 和 name 均为 obj 的属性 --> <view wx:for="{{ obj }}" wx:key="id">{{ item.name }}</view>
-
<!-- 循环遍历 --> <view wx:for="{{ array }}"> {{ index }} : {{ item.message }} </view> <!-- 使用 wx:for-index 来定义索引下标变量名,使用 wx:for-item 来定义元素项的变量名--> <view wx:for="{{ array }}" wx:for-index="idx" wx:for-item="child" wx:key="index"> {{ idx }} : {{ child.message }} </view> <!-- 使用block块级来包裹多级节点,block不会渲染到DOM节点 --> <block wx:for="{{ [1,2,3,4,5] }}"> <view>{{ index }}</view> <view>{{ item }}</view> </block>
-
-
(3)事件绑定
- 小程序中的事件绑定需要使用
bind
,然后在后面直接跟事件名,不需要大写
<!-- handleTap、handleInput都是定义在 page.js 中的方法 --> <view bindtap="handleTap">点击事件</view> <input bindinput="handleInput" />
-
特别注意,小程序中事件绑定的方法不能携带参数,即不能写成
bindtap="handleTap(...)"
的形式- 如果要传值,则需要借助标签自定义属性的方式(
以前应该在H5新属性里学过)
自定义属性以
data
开头用短横线-
连接key
值:data-key="value"
可以用
e.target.dataset.key
或者e.currentTarget.dataset.key
来获取对应的value
值- 不同的是,
e.target
触发可以是事件委托、冒泡 e.currentTarget
触发的只能是绑定事件的对象
- 如果要传值,则需要借助标签自定义属性的方式(
<input bindinput="handleInput" data-item="这是自定义的参数" /> <script> handleInput: function(e) { // 在方法里,用 [e] 属性来接收 // e.currentTarget.dataset 将接收 所有自定义属性 组成的 key-value 键值对对象 console.log(e.currentTarget.dataset) // {item: "这是自定义的参数"} console.log(e.detail.value) // 直接获取到输入框的值 } </script>
- 小程序中的事件绑定需要使用
-
另外,使用
bind
绑定不会阻止冒泡事件,使用catch
绑定事件可以阻止冒泡事件<view catchtap="handleTap">阻止冒泡</view>
-
08. 关于page.wxss
- 概念:
page.wxss
是作用于每个page页面的样式文件 - 语法:同全局样式文件
app.wxss
- 会覆盖相同的全局样式
09. 关于page.js
-
概念:
page.js
是作用于每个page页面的逻辑文件 -
语法:同JS语法
-
基本结构:
- 需要使用
Page()
构造器注册一个页面
Page({ // 页面初始数据 data: { }, // 5个生命周期函数 onLoad: function(options) { // 页面加载时触发,触发时机早于onShow和onReady }, onShow: function() { // 页面显示时触发,早于onReady }, onReady: function() { // 页面初次渲染完成时触发,表示页面已准备妥当,可以进行交互了 }, onHide: function() { // 页面隐藏时触发,通过wx.navigateTo切换到其它页面 }, onUnload: function() { // 页面卸载时触发,通过wx.redirectTo和wx.navigateBack到其它页面 }, // 4个用户行为回调 onPullDownRefresh: function() { // 监听用户下拉动作 }, onReachBottom: function() { // 页面上拉触底事件 }, onShareAppMessage: function () { // 用户点击左上角转发 }, onPageScroll: function() { // 页面滚动触发事件 }, // 其它自定义事件、数据 })
生命周期函数由用户主动触发,不应该在其它代码主动调用
- 需要使用
10. 关于开发工具
-
微信开发者工具并不是那么好用,因此,这里使用VSCode来进行开发
-
相应插件:
-
minapp
:标签、属性的智能补全 -
wechat-snippet-vscode
:代码辅助、代码片段自动完成 -
Easy Less
:使用less语法写CSS,转换为wxss"less.compile": { "outExt": ".wxss" }
-
以上是关于01.小程序简要介绍的主要内容,如果未能解决你的问题,请参考以下文章