微信小程序3

1.回退上一页

wx.navigateBack({
    delta: 1
})

2.全局变量定义域

修改后,如果要访问其值不能在其他页面的 onLoad 函数内访问,否则为NULL

onShow()可以,这涉及到 生命周期

3.导航栏的显示和隐藏

wx.showTabBar({
    animation: true
})
wx.hiddenTabBar({
})

4.集成mqtt

先加入mqtt.js或者mqtt.min.js

在app.js中加入以下代码:

import mqtt from "./utils/mqtt.min.js"
var client = null
connect() {
    //test
    var timestamp = Date.parse(new Date())
      timestamp = timestamp/1000
      console.log(timestamp)

    console.log("准备连接")
    const host = 'www.xxxxx.com'
    const mqttOptions = {
      protocolVersion: 4, //MQTT连接协议版本
      clientId: 'client-' + new Date().getTime(),   //只需确保每个客户端都不同就行
      clean: true,
      password: 'xxx',
      username: 'xxx',
      reconnectPeriod: 1000, // 1000毫秒,两次重新连接之间的间隔
      connectTimeout: 30 * 1000, // 1000毫秒,两次重新连接之间的间隔
      resubscribe: true // 如果连接断开并重新连接,则会再次自动订阅已订阅的主题(默认true)
    }
      client = mqtt.connect(`wxs://${host}/mqtt`, mqttOptions)
        client.on('connect',(e)=>
        {
          console.log('服务器连接成功')
         
        })
       
        
      },
      publish(action,pdata) {
        console.log('进来了');
        console.log('先订阅消息');
         //先订阅消息
         client.subscribe(`/device/out/${action}`,
         {
           qos:1, 
         },(err)=>{
           if(!err){
             console.log("Success Subscribe!")
           }else{
             console.log("Error Subscribe!")
           }
         }
         )
          const that = this
          let msg = JSON.stringify(pdata)

          client.publish(`/device/in/${action}`, msg,error=>{
            if (!error) {
              console.log('发布Success!')
              console.log(msg)   
        } else {
            console.log('发布失败')
            wx.showToast({
              title: '指令发送失败',
              icon: 'error',
              duration: 2000
            })
        }
        
        })
        //当客户端发送任何数据包时发出。这包括publish()以及MQTT用于管理订阅和连接的包 
        client.on("packetsend",(packet)=>{
          console.log("客户端已发出报文", packet); 
        });

        client.on("message", (topic,payload) => {        //收到消息,前提得订阅了Topic
          console.log("收到消息啦")
          const decoder = new TextDecoder('utf-8')
          const stringData = decoder.decode(payload)
          console.log(stringData)
          //是开机的响应
          if(stringData.includes("action\":\"12\""))
            return ;
            
            if(stringData.includes("action\":\"2\"")){
              //已经启动
              wx.showToast({
                title: '机器开机成功',
                icon: 'success',
                duration: 2000
              })
              getApp().globalData.openflag = 0
          }else if(stringData.includes("action\":\"99\"")){
              console.log("没有收到")
              getApp().globalData.openflag = 1
              
          }
          that.globalData.receiveflag = 1  //收到响应
          client.unsubscribe(`/device/out/${action}`, function(error)
         {
           if(!error){
            console.log("取消订阅")
           }
         })
        
         
        });
        
      },
      subscribe(){
         
      },

      disconnect() {
        client.end()
        console.log("已断开连接!")
      },

使用:


var timestamp = Date.parse(new Date())
      timestamp = timestamp/1000
      console.log(timestamp)
      const pdata = {
        "sn":"xxxxxxx",           //设备编号
        "action":1,              //指令代码
        "key":"abcdef",
        "random":"12345",
        "time":timestamp,
        "encrypt":"c260ffb3b62a7146ee901dfc40dfcd3d"              //加密内容
        }
      await app.publish("xxxxxxxxx",pdata)


​

5.普通页面 监测 全局变量变化

变化时触发回调函数

app.js中加入以下代码:

watch: function(key, method) {
		var obj = this.globalData;
		//加个前缀生成隐藏变量,防止死循环发生
		let ori = obj[key]; //obj[key]这个不能放在Object.defineProperty里
		if (ori) { //处理已经声明的变量,绑定处理
			method(ori);
		}
		Object.defineProperty(obj, key, {
			configurable: true,
			enumerable: true,
			set: function(value) {
				this['_' + key] = value;
				console.log('是否会被执行2')
				method(value);
			},
			get: function() {
				// 在其他界面调用key值的时候,这里就会执行。
				if (typeof this['_' + key] == 'undefined') {
					if (ori) {
						//这里读取数据的时候隐藏变量和 globalData设置不一样,所以要做同步处理
						this['_' + key] = ori;
						return ori;
					} else {
						return undefined;
					}
				} else {
					return this['_' + key];
				}
			}
		})
	},

在普通页面的 onLoad中加入

 app.watch('openflag',(v)=>{  //被监测的全局属性
        
    console.log("global Date 全局变量改变了+"+v)
        
    this.setData({ showLoading: false }); // 取消显示加载动画
   
  })

注意app.js中必须有对应的全局属性

6.同步执行代码

在wx小程序中,采用的是异步执行代码,不会等待某个请求完成后才执行判断代码

如果想要实现 请求完成后再执行代码 ,就需要使用同步

在需要执行的代码 前加上await,并且在 包含这个的代码前加上 async

decrement: async function() {
    const now = Date.now();
 
    this.setData({ showLoading: true }); // 显示加载动画


    await this.startClick();
    
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值