微信小程序全局变量改变监听

问题来源

最近工作需要写小程序页面,其中有个页面情况为:父页面中包含了一个组件页面,组件页面中又包含了另外一个组件页面。需求为:点击最后一个组件页面中的一个view,需要显示最外层父页面中的一个弹出层,并且动态的展示值,这个值的来源就是最后一个组件页面中的内容。

处理办法

当时想到的就是使用全局变量,在 app.js 中定义好全局变量,点击组件页面时就修改全局变量的值,父页面同样使用全局变量的值,这样一来就可以动态打开/关闭弹出层且传递值了。

下面先看看 app.js 中怎么定义的:

globalData: {
    openid: ‘‘,
    userInfo: null,
    _showPictureDetail: false,
    _pictureTime: ‘‘,
    _pictureAddress: ‘‘,
    //改变量用户存放全局变量修改过程中的值传递, 传递对象
    data: {}
  }

在其他页面就使用 getApp().globalData.参数名 = 值 的形式来改变参数值, 使用 getApp().globalData.参数名 的形式来获取值。

这样能正常赋值,但是由于都是在同一个界面展示,我需要更新值后,马上得到最新的值。上面简单的设置获取就不起作用了。

那么,就需要监听 globalData 中的属性了。

首先是 app.js:

//app 全局属性监听
  watch: function (method) {
    var obj = this.globalData;
    Object.defineProperty(obj, "data", {  //这里的 data 对应 上面 globalData 中的 data
      configurable: true,
      enumerable: true,
      set: function (value) {  //动态赋值,传递对象,为 globalData 中对应变量赋值
        this._showPictureDetail = value.showPictureDetail;
        this._pictureTime = value.pictureTime;
        this._pictureAddress = value.pictureAddress;
        method(value);
      },
      get: function () {  //获取全局变量值,直接返回全部
        return this.globalData;
      }
    })
  },

接下来就是在组件页面事件中动态赋值:

//图片拍摄详情查看
    viewPictureDetailInfo: function (e) {
      // 修改 app 全局属性值, 由于 globalData.data 是个对象,因为涉及到修改多个参数,所以需要传递对象
      app.globalData.data = {
        ‘_showPictureDetail‘: true,
        ‘_pictureTime‘: e.currentTarget.dataset.phototime,
        ‘_pictureAddress‘: e.currentTarget.dataset.address
      }
    },

最后就是在最外层父页面添加 app.js 监听回调,动态修改变量值,以达到动态打开/关闭弹出层和展示内容了:

// 首先需要在父页面 onLoad() 方法中添加监听以及指定监听回调方法
// 设置 App 监听回调
// 如果其他页面修改了 app.js 中的 showPictureDetail 值, 就会触发回调
getApp().watch(self.watchBack)

//定义监听回调方法
//app 监听回调方法
  watchBack: function (value) {  //这里的value 就是 app.js 中 watch 方法中的 set, 返回整个 globalData
    this.setData({
      showPictureDetail: value._showPictureDetail,
      pictureTime: value._pictureTime,
      pictureAddress: value._pictureAddress
    });
  },

这样,在父页面中使用 showPictureDetail..这几个变量就可以动态展示了。

PS:我这边的业务需求涉及到多个变量的监听,如果你只有一个变量的监听,那么只需要修改 app.js 中 watch 方法的 Object.defineProperty 内容由对象传递变为单个值传递即可。在更新值和获取值时传递就是一个值,而不是对象。

可以参考:https://blog.csdn.net/qq_40126542/article/details/88838834

原文地址:https://www.cnblogs.com/dream-saddle/p/11180053.html

时间: 2024-08-29 20:27:05

微信小程序全局变量改变监听的相关文章

微信小程序实现数据监听

/** * 设置监听器watch.js */ export function setWatcher(page) { let data = page.data; let watch = page.watch; Object.keys(watch).forEach(v => { let key = v.split('.'); // 将watch中的属性以'.'切分成数组 let nowData = data; // 将data赋值给nowData for (let i = 0; i < key.l

微信小程序未来怎么样?听微盟卫晓祥来说说

微信小程序宣布公测已经一个多月了,开发者一片火热,未来会怎么样?听微盟卫晓祥来说说.微盟移动营销事业部总经理卫晓祥表示,微信小程序最吸引商户的地方在于:一方面小程序作为一种全新的连接用户与服务的方式,可以在微信内被便捷地获取和传播,另一方面,通过微信提供的框架.组件及API,使其具有出色的使用体验. 小程序打造微信生态系统 尽管微信尚未公布小程序的具体入口,但卫晓祥认为,小程序的流量分发.推广都将成为不可忽视的市场,未来或将形成“朋友圈广告+小程序”的新生态模式,小程序将成为商户流量的重要来源.

微信小程序 全局变量

微信小程序里面有个app.js,我们可以在这个里面设置全局变量, App({ globalData:{ url:"http://xxx.xxx.xx:3000" } }) 在外面就这样引用就可以了,这个真的是简单 getApp().globalData.url 原文地址:https://www.cnblogs.com/hedianzhan/p/8418552.html

微信小程序全局变量的设置、使用、修改

1. 全局变量的设置 在miniprogram > app.js 文件中设置,globalData对象就是存储全局变量的. App({ globalData: { hasLogin: false, openid: null }, onLaunch: function () { } }) 2.全局变量的使用 在app.js文件中,直接使用,如: this.globalData.hasLogin 在其他非app.js文件中使用,需要先申明app变量,如: var app = getApp() app

微信小程序探究

前段时间比较流行的微信小程序,因为一直没有所谓内测码也没具体关注.拖到现在正好借组内分享的时机来仔细了解一下微信小程序.了解一个新的事物无外乎从是什么(本质),怎么用(具体用法),为什么用(优缺点)来学习,首先分析一下微信小程序是什么,听起来比较高大上,说实话原来我确实挺疑惑,到底这一套是什么开发机制,native?hybrid?纯h5?看网上各种教程上来就说api说语法,感觉不先理清楚是什么的问题就去搬api过来纯粹是耍流氓. 一.微信小程序是什么: 言归正传,微信小程序的本质是什么?个人理解

微信小程序监听WebSocket消息事件wx.onSocketMessage(CALLBACK)

微信小程序WebSocket消息wx.onSocketMessage(CALLBACK) wx.onSocketMessage(CALLBACK) ? 监听WebSocket接受到服务器的消息事件 CALLBACK返回参数: 参数 类型 说明 data String 服务器返回的消息 示例代码: wx.connectSocket({ url:"qkxue.net" }); wx.onSocketMessage(function(res){ console.log("收到服务器

微信小程序? 监听WebSocket关闭wx.onSocketClose(CALLBACK)

微信小程序? 监听WebSocket关闭wx.onSocketClose(CALLBACK) wx.onSocketClose(CALLBACK) ? 监听WebSocket关闭 wx.connectSocket({ url:"qkxue.net" }); //注意这里有时序问题, //如果wx.connectSocket还没回调wx.onSocketOpen,而先调用wx.closeSocket,那么就做不到关闭WebSocket的目的 //必须在WebSocket打开期间调用wx.

让微信小程序每次请求的时候不改变session_id的方法

每次微信小程序请求的时候都会改变session id, 还好他的请求方法内可以设置header头 所以只需要在启动程序后第一次请求服务器获得一个sessionid(或是唯一编号 ) 然后本地存储起来,每次请求服务器的时候就在header里面带上 但是有个问题就是 你本地存储了这个session id后那么以后每次都会是这个session id 所以建议在程序每次启动的时候先清空本地存储的session id 然后发送首次请求获取新的sessionid 我把它请求的方法 重新包装了下 顺便贴出来大

微信小程序:原生热布局终将改变世界

最近朋友圈已经被微信小程序刷屏了,这也难怪,腾讯的产品拥有广泛的影响力,谁便推出个东西,都会有很多人认为会改变世界,这不,张小龙刚一发布微信小程序的消息,很多人(技术的和非技术的)就跟打了鸡血似的,估计现在已经鸡血告急了! 我也看了网上的一些关于微信小程序的文章,估计那帮家伙连微信小程序是什么都没搞清楚,就在那里一本正经地胡说八道.好吧,我就通过本文让大家了解一些什么是微信小程序,以及微信小程序到底能为我们带来什么. 关于微信小程序的误解和讨论已经太多了.这里就说一些主要的. 1.  微信小程序