小程序页面通信
解决方案有很多,本地缓存、全局变量、手写订阅发布。本文着重介绍另一个解决方案,就是暂存当前页面的执行上下文,然后在另一个页面调用。
github地址
简介
主要是想解决小程序跨页面通信的问题,我想用一种最简单,最优雅,并且让用户可以很方便的使用的小工具。
安装
将 store.js 文件放在 utils 文件夹( 可以是任意文件夹 )下即可,然后引入文件。
引入
import store from "path/store.js"
复制代码
使用
推荐的使用流程是这样的,比如 b 页面需要用到 a 页面里的数据。
- 先在 a 页面引入 store 然后在 onload 方法里使用
store.addData(this,"a") 来将当前页面的执行上下文加载到 store 的数据池里。
- 在 b 页面引入 store ,然后就可以在 b 页面通过
store.a.数据名 来获取相应数据的值,也可以通过 store.a.数据名 = "balabala" 来给相应的数据赋值,这里注意,这样的赋值方式是响应式的,不需要通过 setData 函数来赋值就可以达到效果。(暂未实现 setData 方式赋值,推荐使用直接赋值)
方法简介
-
添加页面数据
store.addData( context,name )
复制代码
参数说明:
-
移除页面数据
store.removeData( name )
复制代码
参数说明
-
获取数据
let value = store.页面name.属性
复制代码
这样既可获取数据,后台是用代理封装了数据池,从而方便用户使用
-
修改数据
store.页面name.属性 = value
复制代码
这样赋值即可,后台使用的依然是封装的 setData
-
检测属性是否存在
property in store.页面name
复制代码
代码
class Store {
constructor() {
this._data = {};
}
addData(context,name) {
let routeName = name ? name : context.route;
let proxyContext = new Proxy(context,{
get: function(context,property) {
if (property in context) {
return context[property];
} else {
if (property in context.data) {
return context.data[property];
} else {
console.error(`${name}页面没有此属性`);
}
}
},
set: function(context,property,value) {
context.setData({
[property]: value
});
return true;
},
has: function(context,property) {
return property in context.data;
}
});
this._data[routeName] = proxyContext;
}
removeData(name) {
if (name in this._data) {
delete this._data[name];
} else {
console.error(`希望删除的属性不存在`);
}
}
}
const store = new Store();
let proxyStore = new Proxy(store,{
get: function(store,property) {
if (property in store) {
return store[property];
} else {
if (property in store._data) {
return store._data[property];
} else {
console.error("访问的页面数据未载入数据池");
}
}
}
});
export default proxyStore;
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|