npm install miniapp-page-assign
由于微信小程序的import模块从node_modules目录引入文件会有问题,可以直接下载miniapp-page-assign.js(build目录下)放到/utils文件夹下。
In app.js
import {setLaunchInfo, pageAssign} from './utils/miniapp-page-assign';
App({
onShow: function (options) {
// 保存进入页面的信息
setLaunchInfo(options);
// ...other code
},
onLaunch: function () {
// 注册simpleAssign到wx全局
wx.pageAssign = pageAssign;
// ...other code
}
// ...other code
});
In index/index.js (或者任意小程序页面)
Page(new wx.pageAssign({
data: {
},
// 微信注册页面生命周期函数、事件处理函数
// 包括onLoad, onShow, onReady, onHide, onUnload, onPullDownRefresh, onReachBottom, onShareAppMessage, onPageScroll, onTabItemTap
onLoad: funtion (options) {
},
// others
methods: {
// 自定义事件
}
}));
// 原生小程序语法:
this.setData({key: 'value'});
// 中间件用法:
this.$data.key = 'value';
访问当前route可以得到当前的页面路由,传参和上一个页面的路由
在app.js中调用的
setLaunchInfo(options);
是很重要的一步,它用于保存用户进入小程序的场景值、shareTicket等信息
// other code
onLoad () {
console.log(this.$route.path) //当前小程序页面路径
console.log(this.$route.query) //当前小程序页面参数
console.log(this.$route.formPath) //上一个小程序页面路径
console.log(this.$route.fromQuery) //上一个小程序页面参数
// 以下几个如果没有在app.js中调用setLaunchInfo则不存在
console.log(this.$route.scene) // 进入页面场景值
console.log(this.$route.shareTicket) // 进入页面带上的shareTicket
console.log(this.$route.referrerInfo) // 进入小程序带上的卡券信息
// other code
},
Tip
- 页面跳转的两个页面必须都使用wx.pageAssign注册
- 页面场景值,shareTicket,卡券信息等只会在特殊的情况进入小程序才会获得,具体参考小程序文档
在框架中,允许使用mixin引用外部定义的公共数据和方法
// common.js
export default {
data: {
hello: 'hello world'
},
methods: {
sayHello: function () {
console.log(this.$data.hello);
}
}
}
// index.js
import commonMixin from 'common';
Page(new wx.pageAssign({
mixin: [commonMixin],
data: {
demoVal: 'demo',
demoObj: {
val: 'demoObj'
},
FibonacciArr: []
},
onLoad () {
this.sayHello();
// other code
},
}));
In app.js
import {initGlobalShare} from './utils/miniapp-page-assign';
App({
onLaunch: function () {
// 设置全局分享
initGlobalShare({
title: '我是全局的分享标题',
path: '/pages/index/index', // 所有页面的分享都会是这个页面
imageUrl: '', // 所有页面的分享都会是这个图片
forbidden: false // 如果启用forbidden,则所有的页面都禁用分享
});
// ...other code
}
// ...other code
});
In app.js
import {checkVersion} from './utils/miniapp-page-assign';
App({
onShow: function () {
// 检查更新
checkVersion();
// ...other code
}
// ...other code
});
在页面标签上添加data-key和data-value,然后在触发更新的事件上绑定onModel方法,一些原生组件则不需要添加data-value,具体用法如下
<!-- index.wxml -- >
<view>测试数据:{{demoVal}}</view>
<input
value="{{demoVal}}"
data-key="demoVal"
bindinput="onModel"></input>
<textarea
value="{{demoVal}}"
data-key="demoVal"
bindinput="onModel"></textarea>
<button
data-key="demoVal"
data-value="hello world"
bindtap="onModel">设置value为“hello world”</button>
<view>测试数据2:{{demoObj.val}}</view>
<input
class="border"
value="{{demoObj.val}}"
data-key="demoObj.val"
bindinput="onModel"></input>
// index.js
data: {
demoVal: 'demo',
demoObj: {
val: 'demoObj'
}
}
为什么使用它? 如果你是使用的原生小程序做开发,使用miniapp-page-assign,你可以获得以下好处
如果你的小程序使用原生小程序开发到一半,此时你重构使用mpvue可能成本过高,或者使用新的框架会有很多坑。但如果是构建新项目,还是推荐mpvue,毕竟好用的多。
this.$data使用的是Proxy对象代理this.data,它可以和this.setData共存。并且你可以在新的页面引入和使用这套中间件(但是路由信息需要手动控制)。
这将是一个巨大的好处,比如分享,你甚至可以在所有的页面定制同一个分享内容,或者根据参数定制分享内容,而无需在每一个小程序页面定制onShareAppMessage方法,只要你稍稍阅读一下源码就能发现其中的好处。比如你想要在所有的页面分享调用微信的自定义数据统计,你也可以直接在源码中修改。
mixin允许你从外部引入一些公用的data和methods,这将大大的减少代码量,因为你可以抽取很多的公用方法。
正在整理开发中
请轻拍~