微信小程序

yuhuo2023-03-21开发库移动端库
参考链接

WXML

部分组件

WXML 组件对应 HTML5 标签说明
<block></block><template></template>模板
<view></view><div></div>容器
<text></text><h1></h1>~<h6></h6>
<p></p>
<span></span>
文本
<input /><input type="text">输入框
<checkbox /><input type="checkbox">多选框
<radio /><input type="radio">单选框
<picker><view></view></picker><select><option></option></select>
<navigator url="#" redirect></navigator><a href="#"></a>链接
<image src=""><img src="">图片
<icon></icon> <i></i>图标

语法

page.wxml

<view class="container">
    <!-- 数据绑定 -->
	<!-- 内容和属性 -->
    <view id="item-{{id}}">:{{ message }}</view>
	<!-- 布尔类型(直接写会变成字符串) -->
    <checkbox checked="{{false}}"></checkbox>
	<!-- 三元/算术/字符串运算 -->
    <view>{{ 1+1==2? ("1+1=" + "2"): "1+1!=2"}}</view>

    <!-- 列表渲染 -->
	<!-- 默认序号为 index,元素为 item -->
    <view wx:for="{{array}}" wx:key="index">
        {{ index }}:{{ item }}
    </view>
	<!-- 自定义序号名和元素名 -->
    <view wx:for="{{['张三', '李四']}}" wx:key="id" wx:for-index="id" wx:for-item="name">
        {{ id }}:{{ name }}
    </view>
	<!-- 将字符串解析为字符串数据,即等同于:{{['a','r','r','a','y']}} -->
	<view wx:for="array">
  		{{item}}
	</view>

    <!-- 条件渲染 -->
    <view wx:if="{{view == 'WEBVIEW'}}"> WEBVIEW </view>
    <view wx:elif="{{view == 'APP'}}"> APP </view>
    <view wx:else="{{view == 'MINA'}}"> MINA </view>

    <!-- 模板 -->
    <template name="staffName">
        <view>
            FirstName: {{firstName}}, LastName: {{lastName}}
        </view>
    </template>
    <template is="staffName" data="{{...staffA}}"></template>
    <template is="staffName" data="{{...staffB}}"></template>
    <template is="staffName" data="{{...staffC}}"></template>
    
    <!-- 引用 -->
    <!-- import,使用目标文件定义的template -->
    <import src="body.wxml"/>
	<template is="body" data="{{text: 'forbar'}}"/>
    <!-- include,相当于将代码直接 -->
    <include src="footer.wxml"/>
    
    <!-- 事件绑定 -->
    <view bindtap="viewTap"> click me </view>
</view>

body.wxml

<template name="body">
	<text>{{text}}</text>
</template>

footer.wxml

<view> footer </view>

page.js

Page({
    data: {
        id: 1001,
        message: "Hello MINA!",
        array: ["zero", "one", "two", "three", "four"],
        view: "MINA",
        staffA: { firstName: "Hulk", lastName: "Hu" },
        staffB: { firstName: "Shang", lastName: "You" },
        staffC: { firstName: "Gideon", lastName: "Lin" },
    },
    viewTap() {
        console.log("view tap");
    }
});

WXSS

注意事项:

  • 长度单位:rpx(屏幕宽度 = 750rpx)
  • background 只能使用网络图片或 base64,本地图片只能用 image 使用

JS

App

// app.js
App({
     // 自定义全局数据
    globalData: "全局数据",
    // 自定义全局方法
    globalMethod() {
        console.log(this.globalData);
    },
    // 小程序初始化事件
    onLaunch(options) {},
    // 小程序启动或切前台事件
    onShow(options) {},
    // 小程序切后台事件
    onHide() {},
    // 错误事件
    onError(error) {},
    // 页面不存在事件
    onPageNotFound(options) {},
    // 未处理的 Promise 拒绝事件
    onUnhandledRejection() {},
    // 监听系统主题变化事件
    onThemeChange(options) {},
});

getApp

// 在 page.js 中获取全局对象
const app = getApp();
// 获取自定义的全局数据和方法
console.log(app.globalData);
app.globalMethod();

getCurrentPages

// page.js
Page({
    onShow() {
        // 获取当前页面栈。数组中第一个元素为首页,最后一个元素为当前页面
        const pages = getCurrentPages();
        console.log(pages[pages.length - 1] == this);
    },
});

Page

// page.js
Page({
    // 页面视图数据
    data: {
        message: "文本",
    },
    // 自定义页面普通数据
    customData: "页面普通数据",
    // 自定义页面方法
    customMethod() {
        // 获取普通数据
        console.log(this.customData);
        // 获取视图数据
        console.log(this.data.message);
    },
    // 页面的组件选项
    options: {},
    // 类似于mixins和traits的组件间代码复用机制
    behaviors: [],
    // 页面加载完成事件
    onLoad() {},
    // 页面显示事件
    onShow() {},
    // 页面初次渲染完成事件
    onReady() {},
    // 页面隐藏事件
    onHide() {},
    // 页面卸载事件
    onUnload() {},
    // 路由动画完成事件
    onRouteDone() {},
    // 页面下拉事件
    onPullDownRefresh() {},
    // 页面上拉触底事件
    onReachBottom() {},
    // 用户点击右上角转发事件
    onShareAppMessage() {},
    // 用户点击右上角转发到朋友圈事件
    onShareTimeline() {},
    // 用户点击右上角收藏事件
    onAddToFavorites() {},
    // 页面滚动事件
    onPageScroll() {},
    // 页面尺寸变化事件
    onResize() {},
    // 当前是 tab 页时,点击 tab 事件
    onTabItemTap(item) {},
    // 页面销毁前事件
    onSaveExitState() {},
});

setData

// page.js
Page({
    // 页面视图数据
    data: {
        message: "文本",
        list: [{ name: "张三" }, { name: "李四" }],
        object: {
      		text: 'init data'
    	}
    },
    customMethod() {
        // 修改视图数据,并发送到视图层
        this.setData({
            message: "changed data",
        }, () => {
            // 界面更新渲染完毕后的回调函数
        });
        // 直接修改数组中某个元素
        this.setData({
      		"list[0].name": "王五"
    	});
        // 直接修改对象中某个属性
        this.setData({
      		"object.text": "changed data"
    	});
        // 添加一个新数据
        this.setData({
      		"newField.text": "new data"
    	});
    },
});

route

// page.js
Page({
    customMethod() {
        // 获取当前路由:pages/home/home
        console.log(this.route);
    },
});

router:路由器对象,相对路径相对自身所在组件或页面

pageRouter:页面路由器对象,相对路径相对自身所在页面

wx 对象中同名路由方法,相对路径相对当前页面

// page.js
Page({
    customMethod() {
        // 跳转到 tabBar 页面(在 app.json 的 tabBar 字段定义的页面),
        // 并关闭其他所有非 tabBar 页面
        this.router.switchTab({
  			url: "/index",
            // 成功回调
            success() {},
            // 失败回调
            fail() {},
            // 结束回调(成功,失败都会执行)
            complete() {},
		});
        
        // 关闭所有页面,打开到应用内的某个页面
        this.router.reLaunch({
            url: "/index",
            success() {},
            fail() {},
            complete() {},
        });
        
        // 关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面
        this.router.redirectTo({
            url: "/index",
            success() {},
            fail() {},
            complete() {},
        });
        
        // 保留当前页面A,跳转到应用内的某个页面B。但是不能跳到 tabbar 页面。
        // 使用 wx.navigateBack 可以返回到原页面。小程序中页面栈最多十层。
        this.router.navigateTo({
            url: "/pages/blank/blank",
            events:{
                // 监听页面B传来的事件
                bEvent(data) {
                    console.log(data);
                }
            },
            success(res) {
            	// 向页面B发送事件
            	res.eventChannel.emit('aEvent', { message: '来自页面B的数据' })
        	},
            fail() {},
            complete() {},
        });
        
        // 关闭当前页面,返回上一页面或多级页面
        this.router.navigateBack({
            // 返回的页面数,如果 delta 大于现有页面数,则返回到首页,默认1
            delta: 1,
            success() {},
            fail() {},
            complete() {},
        });
    },
});

getOpenerEventChannel

// page.js
Page({
    // 当前页面B被页面A通过 navigateTo 方法打开
	onLoad() {
        // 获取通信通道对象
        const eventChannel = this.getOpenerEventChannel();
        // 向页面A发送事件
        eventChannel.emit("bEvent", { message: "来自页面B的数据" });
        
        let handle = function (data) {
            console.log(data);
        };
        // 监听页面A传来的事件
        eventChannel.on("aEvent", handle);
        // 只监听一次
        eventChannel.once("aEvent", handle);
        // 取消监听
        eventChannel.off("aEvent", handle);
    },
})

Component

Component(Object object) | 微信开放文档 (qq.com)open in new window

Behavior

module.exports = Behavior({
    behaviors: [],
    properties: {
        myBehaviorProperty: {
            type: String,
        },
    },
    data: {
        myBehaviorData: {},
    },
    attached: function () {},
    methods: {
        myBehaviorMethod: function () {},
    },
});

WXS

WXS 是一套阉割版的 JS,遵循 CommonJS 模块化规范,只支持 ES5。

WXS 与 WXML 同处于视图层,而 JS 处于逻辑层,两者是隔离的,不能相互调用。且 WXS 不能调用小程序API,不能作为 WXML 的方法回调。因此 WXS 的典型应用场景就是做数据过滤,数据处理。

在 WXML 中使用 WXS 相比 JS 减少了跨线程通信的开销。在安卓端性能与 JS(使用 V8 引擎)相当,在 IOS 端性能比 JS(使用 JavaScriptCore 引擎)提升了 2~20 倍。

page.wxml

<view>
	<!-- 外联wxs -->
	<wxs module="home" src="./home.wxs"></wxs>
	<!-- 内联wxs -->
    <wxs module="user">
        module.exports = { id: 1001, name: "Tom" };
    </wxs>
	<!-- 使用wxs -->
	<view>{{ home.self }} : {{ home.other }}</view>
    <view>{{ user.name }}</view>
</view>

home.wxs

// 导入
var other = require("other.wxs");
// 导出
module.exports.other = other;
module.exports.self = "Home";

other.wxs

module.exports = "Other";

JSON

app.json

全局配置 | 微信开放文档 (qq.com)open in new window

{
	"pages": [ // 页面路径列表 (必填)
		"pages/index/index", // 首页
		"pages/logs/logs"
	],
	"window": { // 全局的默认窗口表现
		"navigationBarBackgroundColor": "#fff", // 导航栏背景颜色
		"navigationBarTextStyle": "black", // 导航栏标题颜色,仅支持 black / white
		"navigationBarTitleText": "WeChat", // 导航栏标题文字内容
		"navigationStyle": "default", // 导航栏样式,仅支持以下值:default 默认样式,custom 自定义导航栏,只保留右上角胶囊按钮

		"backgroundColor": "#ffffff", // 窗口的背景色
		"backgroundTextStyle": "light", // 下拉 loading 的样式,仅支持 dark / light
		"backgroundColorTop": "#ffffff", // 顶部窗口的背景色,仅 iOS 支持
		"backgroundColorBottom": "#ffffff", // 底部窗口的背景色,仅 iOS 支持

		"enablePullDownRefresh": false, // 是否开启当前页面下拉刷新
		"onReachBottomDistance": 50, // 页面上拉触底事件触发时距页面底部距离,单位为px
		"pageOrientation": "portrait" // 屏幕旋转设置,支持 auto 自动 / portrait 竖屏 / landscape 横屏
	},
	"tabBar": { //页面tab栏的表现
		"color": "#ffffff", //tab 上的文字默认颜色 (必填)
		"selectedColor": "#ffffff", // tab 上的文字选中时的颜色 (必填)
		"backgroundColor": "#ffffff", // tab 的背景色 (必填)
		"borderStyle": "black", // tabbar 上边框的颜色, 仅支持 black / white
		
		"list": [{	// tab 的列表,详见 list 属性说明,最少 2 个、最多 5 个 tab (必填)
			"pagePath": "page/index/index",	// 页面路径 (必填)
			"text": "组件",	// tab 上按钮文字 (必填)
			"iconPath": "", // 图片路径,icon 大小限制为 40kb,建议尺寸为 81px * 81px,不支持网络图片
			"selectedIconPath": "" // 选中时的图片路径
		}, {
			"pagePath": "page/logs/logs",
			"text": "接口"
		}], 
		"position": "bottom", // tabBar 的位置,仅支持 bottom / top
		"custom": false, // 自定义 tabBar
		"": "", // 
		"": "", // 
		"": "" // 
	},
	"networkTimeout": { // 各类网络请求的超时时间,单位均为毫秒
		"request": 60000, // wx.request 的超时时间
		"connectSocket": 60000, // wx.connectSocket 的超时时间
		"uploadFile": 60000, // wx.uploadFile 的超时时间
		"downloadFile": 60000 // wx.downloadFile 的超时时间
	},
	"requiredBackgroundModes": [  // 申明需要后台运行的能力
		"audio", // 后台音乐播放
		"location" // 后台定位
	],
	"style": "v2", // 使用新版的组件样式
	"sitemapLocation": "sitemap.json", // sitemap.json 的位置
	"useExtendedLib": { // 指定需要引用的扩展库
	    "kbone": true, // 多端开发框架
	    "weui": true // WeUI 组件库
	},
	"darkmode": false, // 当前小程序可适配黑夜模式
	"themeLocation": "", // 自定义 theme.json 的路径,当配置"darkmode":true时,当前配置文件为必填项
	"lazyCodeLoading": "requiredComponents", // 懒加载
	"debug": "", // debug 模式
	"functionalPages": "", // 插件所有者小程序需要设置这一项来启用插件功能页
	"subpackages": "", // 启用分包加载时,声明项目分包结构
	"workers": "", // 使用 Worker 处理多线程任务时,设置 Worker 代码放置的目录
	"plugins": "", // 声明小程序需要使用的插件
	"preloadRule": "", // 声明分包预下载的规则
	"resizable": "", // 在 iPad 上运行的小程序可以设置支持屏幕旋转
	"usingComponents": "", // 在此处声明的自定义组件视为全局自定义组件
	"permission": { // 小程序接口权限相关设置
		"scope.userLocation": {
			"desc": "" // 小程序获取权限时展示的接口用途说明
		}
	}, 
	"entranceDeclare": "" // 聊天位置消息用打车类小程序打开,iOS 暂不支持
}

page.json

页面配置 | 微信开放文档 (qq.com)open in new window

{
	// 只能在页面配置中生效的特殊配置
	"disableScroll": false, // 页面禁止上下滚动
    // 只能设置覆盖全局配置中 window 对应的配置项
    "navigationBarTitleText": "页面标题"
}

sitemap.json

sitemap 配置 | 微信开放文档 (qq.com)open in new window

{
	"rules": [{
		"action": "allow", // 命中该规则的页面是否能被索引,仅支持 allow / disallow
		"page": "*",// 页面路径
		"params": ["a", "b"], 
		"matching": "exact" // 匹配方式,exact 等于,inclusive 包含,exclusive 交集为空,partial 交集不为空
	}]
}
Last Updated 2024/3/14 09:51:53