微信小程序实现数据监听

/**
 * 设置监听器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.length - 1; i++) { // 遍历key数组的元素,除了最后一个!
      nowData = nowData[key[i]]; // 将nowData指向它的key属性对象
    }
    let lastKey = key[key.length - 1];
    // 假设key===‘my.name‘,此时nowData===data[‘my‘]===data.my,lastKey===‘name‘
    let watchFun = watch[v].handler || watch[v]; // 兼容带handler和不带handler的两种写法
    let deep = watch[v].deep; // 若未设置deep,则为undefine
    observe(nowData, lastKey, watchFun, deep, page); // 监听nowData对象的lastKey
  })
}
/**
 * 监听属性 并执行监听函数
 */
function observe(obj, key, watchFun, deep, page) {
  var val = obj[key];
  // 判断deep是true 且 val不能为空 且 typeof val===‘object‘(数组内数值变化也需要深度监听)
  if (deep && val != null && typeof val === ‘object‘) {
    Object.keys(val).forEach(childKey => { // 遍历val对象下的每一个key
      observe(val, childKey, watchFun, deep, page); // 递归调用监听函数
    })
  }
  let that = this;
  Object.defineProperty(obj, key, {
    configurable: true,
    enumerable: true,
    set: function (value) {
      watchFun.call(page, value, val); // value是新值,val是旧值
      val = value;
      if (deep) { // 若是深度监听,重新监听该对象,以便监听其属性。
        observe(obj, key, watchFun, deep, page);
      }
    },
    get: function () {
      return val;
    }
  })
}
module.exports = {
  setWatcher: setWatcher
}
const watch = require("../../../utils/watch.js");

/**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    watch.setWatcher(this); // 设置监听器,建议在onLoad下调用
    // 取出登录信息
    this.getLOginInfo();
  },
  watch: {
    ‘prescriptionInfo.prescr_type‘: function (value, oldValue) {
      if (value == 0) {
        // console.log(‘中药处方‘);
        let bottled = ‘prescriptionInfo.is_bottled‘;
        let taste_type = ‘prescriptionInfo.taste_type‘;
        let is_pregnant = ‘prescriptionInfo.is_pregnant‘;
        let is_suffering = ‘prescriptionInfo.is_suffering‘;
        let suffering_num = ‘prescriptionInfo.suffering_num‘;
        this.setData({
          [bottled]: 0,
          [taste_type]: 1,
          [is_pregnant]: 0,
          [is_suffering]: 0,
          [suffering_num]: 1,
        });
      }
      if (value == 2) {
        // console.log(‘膏方‘);
        let is_pregnant = ‘prescriptionInfo.is_pregnant‘;
        let is_suffering = ‘prescriptionInfo.is_suffering‘;
        let suffering_num = ‘prescriptionInfo.suffering_num‘;
        this.setData({
          [is_pregnant]: 0,
          [is_suffering]: 0,
          [suffering_num]: 3,
        });
      }
    },
  },

原文地址:https://www.cnblogs.com/yangzhenhong/p/10955636.html

时间: 2024-07-29 10:25:44

微信小程序实现数据监听的相关文章

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

问题来源 最近工作需要写小程序页面,其中有个页面情况为:父页面中包含了一个组件页面,组件页面中又包含了另外一个组件页面.需求为:点击最后一个组件页面中的一个view,需要显示最外层父页面中的一个弹出层,并且动态的展示值,这个值的来源就是最后一个组件页面中的内容. 处理办法 当时想到的就是使用全局变量,在 app.js 中定义好全局变量,点击组件页面时就修改全局变量的值,父页面同样使用全局变量的值,这样一来就可以动态打开/关闭弹出层且传递值了. 下面先看看 app.js 中怎么定义的: globa

微信小程序开放数据解密 AES-128-CBC 解密(C#版本)

最近在开发小程序,需要跟微信服务端交互,微信敏感数据都有加密返回,需要在服务端接收进行解密后再返回给客户端小程序,今天就通过C# 进行数据的解密,官方下载下来是Node.C++.php等,就是没有C# 代码,于是就上度娘,找到 https://blog.csdn.net/jasonsong2008/article/details/83586119 https://www.cnblogs.com/jetz/p/6384809.html 经过一番研究,搞定啦,其实就是用了aes加密方法. 下面把第一

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

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

微信小程序 --- 缓存数据

保存数据  /  读取数据  /  删除数据  /  数据异步操作 每一个微信小程序都可以有自己的本地缓存,可以通过wx.setStorage( wx.setStorageSync) ,wx.getStorage(wx.getStorageSync),wx.clearStorage(wx.clearStorageSync) 可以对本地缓存进行设置 / 获取和清理.本地缓存最大为 10MB ; ...Sync 是同步的接口:不带这个的是一个异步的接口: 注意:localStorage 是永久存储的

[转]微信小程序登录数据解密以及状态维持

本文转自:http://www.cnblogs.com/cheesebar/p/6689326.html 学习过小程序的朋友应该知道,在小程序中是不支持cookie的,借助小程序中的缓存我们也可以存储一些信息,但是对于一些比较重要的信息,我们需要通过登录状态维持来保存,同时,为了安全起见,用户的敏感信息,也是需要加密在网络上传输的. 前台,service.封装了http请求,同时封装了getSession(通过code获取服务器生成的session).getUserInfo(获取用户信息).ge

微信小程序 修改数据,并动态渲染页面;修改数组;

一.修改数据,并在页面动态渲染 this.setData({ txt: '12112' }) 二.修改数组 var rotateClassItem = 'rotateClass['+ index + ']'; that.setData({ [rotateClassItem]: !that.data.rotateClass[index] }) 原文地址:https://www.cnblogs.com/siyecao2010/p/10083896.html

微信小程序绑定数据

视图文件里使用{{}}可以绑定数据,: <image src="{{like?'images/like_on.png':'images/like.png'}}"></image> 再到组件js里定义data数据即可实现数据的绑定 data: { like:true }, 使用组件的时候要遵循封装性,开放性等原则 使用变量保存这两张图片的路径: data: { like:true, yesSrc: 'images/like_on.png', noSrc: 'ima

微信小程序给input、picker、textarea编写统一的更新数据逻辑

wepy开发小程序 以input为例,微信小程序没有数据双向绑定,input要显示绑定的数据即value等于一个绑定的量 <input type="text" value="{{inputdata}}"/> data = { inputdata: '数据' } 当在input中改变内容后,inputdata并不会变化,需要绑定事件,通过编写程序来改变inputdata. 但开发过程中如果input等表单控件很多的话,这些事件一个一个写就会感到很麻烦,所以

微信小程序后台返回大量多余数据的处理

台接口返回一个数组,数组里面N多对象,每个对象里面几十上百条数据,最好玩的是,我只需要每个对象里面的某两个数据.... 类似这种: datas:[   {   id:1000,   name: "帅哥",   title: '...',   b: '...',   d: 0,   f:0,   ....   },   {   id:1001,   name: "美女",   title: '...',   b: '...',   d: 0,   f:0,   ...