准备工作
小程序的构成
-
小程序的主题部分由三个文件组成,必须放在项目的根目录
| 文件 | 必需 | 作用 |
| :-------- | --------:| :--: |
| app.js | 是 | 小程序逻辑 |
| app.json | 是 | 小程序公共配置 |
| app.wxss | 否 | 小程序公共样式表 |
app.js: 每个小程序都需要在app.js
中调用App
方法注册小程序实例,App()
必需在app.js
中使用且只能使用一次。
app.js中生命周期函数实例代码
App({
onLaunch (options) {
// 监听小程序的初始化,全局只触发一次
},
onShow (options) {
// 监听小程序启动或切前台。
},
onHide () {
// 监听小程序从前台进入后台时触发。
},
onError (msg) {
//小程序发生脚本错误或 API 调用报错时触发
}
})
app.json 小程序根目录下的app.json
文件用来对微信小程序进行全局配置,决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 等。
{
"pages": [
//页面路由
"pages/index/index",
"pages/logs/index"
],
"window": {
"navigationBarTitleText": "Demo", //导航栏标题文字内容
"navigationBarBackgroundColor":"#000000", //导航栏背景颜色
"navigationBarTextStyle":"white", //导航栏标题颜色,仅支持 black / white
"backgroundColor":"#ffffff", //窗口的背景色
"backgroundColorTop":"#ffffff", //顶部窗口的背景色,仅 iOS 支持
"backgroundColorBottom":"#ffffff", //底部窗口的背景色,仅 iOS 支持
},
"tabBar": {
//底部导航设计
"list": [{
"pagePath": "pages/index/index",
"text": "首页"
}, {
"pagePath": "pages/logs/logs",
"text": "日志"
}]
},
//网络请求超时时间
"networkTimeout": {
"request": 10000,
"downloadFile": 10000
},
"debug": true,//开启debug模式
}
-
小程序的页面由四个文件组成
| 文件 | 必需 | 作用 |
| :-------- | --------:| :--: |
| js | 是 | 页面逻辑 |
| wxml | 是 | 页面结构 |
| json | 否 | 页面配置 |
| wxss | 否 | 页面样式表 |
语法功能介绍
wxml功能介绍
@(数据绑定)[简单绑定,组件属性,控制属性,关键字,三元运算,列表渲染,条件渲染]
- 简单绑定
数据绑定使用双大括号将变量包起来,然后再js中data中使用,如:
<view> {{ message }} </view>
Page({
data: {
message: 'Hello world!'
}
})
- 组件属性(需要写在双引号内)
<view id="item-{{id}}"> </view>
Page({
data: {
id: 0
}
})
- 控制属性(需要在双引号之内)
<view wx:if="{{condition}}"> </view>
Page({
data: {
condition: true
}
})
- 关键字(需要在双引号之内)
true:boolean 类型的 true,代表真值。
false: boolean 类型的 false,代表假值。
<checkbox checked="{{false}}"> </checkbox>
特别注意:不要直接写checked="false"
,其计算结果是一个字符串,转成 boolean 类型后代表真值。
- 列表渲染 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:if
在框架中,使用
wx:if=""
来判断是否需要渲染该代码块:
<view wx:if="{{condition}}"> True </view>
也可以用
wx:elif
和wx:else
来添加一个 else 块:
<view wx:if="{{length > 5}}"> 1 </view>
<view wx:elif="{{length > 2}}"> 2 </view>
<view wx:else> 3 </view>
因为 wx:if 是一个控制属性,需要将它添加到一个标签上。如果要一次性判断多个组件标签,可以使用一个
<block/>
标签将多个组件包装起来,并在上边使用 wx:if 控制属性。
<block wx:if="{{true}}">
<view> view1 </view>
<view> view2 </view>
</block>
注意: <block/>
并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。
模块化开发
@(require)[module,exports]
-
require(string path) 用于引入模块
path
放入需要引入的模块文件的相对路径,或者npm模块名,或者npm模块路径。不支持绝对路径 - module.exports或者exports 用于对外暴露接口
- 实例代码
// common.js
function sayHello(name) {
console.log(`Hello ${name} !`)
}
function sayGoodbye(name) {
console.log(`Goodbye ${name} !`)
}
module.exports.sayHello = sayHello
exports.sayGoodbye = sayGoodbye
// index.js
var common = require('common.js')
Page({
helloMINA: function() {
common.sayHello('hello')
},
goodbyeMINA: function() {
common.sayGoodbye('goodbye')
}
})
网络请求
-
wx:request 发起https网络请求
| 属性 | 类型 | 默认值 | 必填 | 说明 |
| :-------- | --------:| :--: | :--: | :--: |
| url | string | | 是 | 开发者服务器接口地址|
| data | string/object/ArrayBuffer | | 否 | 请求参数 |
| header | Object | GET | 否 | 设置请求的 header,header 中不能设置 Referer,content-type 默认为 application/json|
| method | string | json | 否 | HTTP请求方法 |
|dataType | string | text | 否 | 返回数据格式|
|responseType| string | text | 否 | 响应的数据类型 |
|success | function| | 否 | 接口调用成功的回调函数|
|fail | function| | 否 | 接口调用失败的回调函数|
|complete| function| | 否 | 接口调用结束的回调函数(成功失败都会执行)| -
methods的合法值
@(OPTIONS)[GET,POST,HEAD,PUT,DELETE,TRACE,CONNECT]
wx.request({
url: 'xxx.php',
data: {
x: '',
y: ''
},
header: {
'content-type': 'application/json' // 默认值
},
success (res) {
console.log(res.data)
}
})
路由跳转
- wx.navigateTo
保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。使用
wx.navigateBack
可以返回到原页面。小程序中页面栈最多十层。
wx.navigateTo({
url:'页面的路由',
//跳转的页面不能为tabbar, 路径后可以带参数。参数与路径之间使用 ? 分隔,参数键与参数值用 = 相连,不同参数用 & 分隔;如 'path?key=value&key2=value2'
succrss:function(res){
//成功的回调
},
fail:function(res){
//失败的回调
}
})
父子组件通信
- 创建组件
- 右键新建 Component,创建组件,和正常创建page类似,创建名为child1的组件,如下:
默认组件的js文件:
// component/child1/child1.js
Component({
/**
* 组件的属性列表
*/
properties: {
},
/**
* 组件的初始数据
*/
data: {
paramsOne:String
},
/**
* 组件的方法列表
*/
methods: {
}
})
- 在你需要引入的页面的json文件中引入,
child1
是自定义的标签名,后面跟着路径,一定要写在usingComponents
中
{
"usingComponents": {
"child1": "../../component/child1/child1"
},
"navigationBarTitleText": "详情"
}
- 在要引入的页面wxml中,用你自定义的标签名
<child1 />
就可以引入了
<view>
<child1 />
</view>
- 父子组件传值--------------父向子传值
创建child2组件 ,在child1中按上述方法引入
声明:child1为父组件,child2为子组件
<!--component/child1/child1.wxml-->
<view>
<text>child1组件</text>
<child2 paramsTwo="从父组件传入子组件的数据" />
<!--这是child2组件-->
<!--paramsTwo是自定义的参数,用来绑定当前的数据,传入子组件-->
</view>
<!--component/child2/child2.wxml-->
<text>{{paramsTwo}}</text>
// component/child2/child2.js
Component({
/**
* 组件的属性列表
*/
properties: {
/**子组件设置参数接收,参数名与child1中的<child2 paramsTwo=""/>标签参数一致**/
paramsTwo: String
},
})
- 父子组件传值--------------子向父传值
声明:child1为父组件,child2为子组件
要让子组件给父组件传参,首先得在父组件引入子组件的时候,在父组件中加个触发事件,如下:
<!--component/child1/child1.wxml-->
<view>
<view>接收子组件传来的数据:{{paramsOne}}</view>
<child2 paramsTwo="从父组件传入子组件的数据" bind:myEvent="onMyEvent" />
</view>
myEvent
就是绑定的触发事件,paramsOne
是接收子组件的变量,写在js文件的data中即可,然后时间触发时候执行 onMyEvent()
方法,在onMyEvent()
方法中把子组件传来的值赋值给 paramsOne
,如下:
// component/child1/child1.js
Component({
properties: {
},
data: {
paramsOne:String,
},
methods: {
onMyEvent:function(e){
this.setData({
paramsOne: e.detail.paramsOne
})
}
}
})
子组件里面可以写个触发事件来触发父组件中的myEvent
,比如写个button在按钮点击的时候通过 triggerEvent
方法将事件和值代入父组件,如下:
<!--component/child2/child2.wxml-->
<button bindtap='change'>向child1中传入参数</button>
// component/child2/child2.js
Component({
methods: {
change:function(){
this.triggerEvent('myEvent', { paramsOne:'123'})
}
}
})
triggerEvent
在点击之后被触发,将myEvent
事件和参数传入父组件,在父组件中,通过bind绑定的myEvent
被激活后开始执行父组件中的onMyEvent
方法。onMyEvent
通过打印e.detail.paramsOne
就能拿到子组件中的值,然后通过this.setData({})
把接收的值 赋值给 父组件中的变量,子父组件通信完成。
ps: 触发事件 ----triggerEvent
内容补充
自定义组件触发事件时,需要使用 triggerEvent 方法,指定事件名、detail对象和事件选项 实例代码:
<!-- 在自定义组件中 -->
<button bindtap="onTap">点击这个按钮将触发“myevent”事件</button>
Component({
properties: {},
methods: {
onTap: function(){
var myEventDetail = {} // detail对象,提供给事件监听函数
var myEventOption = {} // 触发事件的选项
this.triggerEvent('myevent', myEventDetail, myEventOption)
}
}
})
网友评论