打造微信小程序伪状态管理器

以 app.js 的全局属性为基础,用消息订阅与发布对全局属性进行管理

 以 vuex 为例,app.js 全局属性就是 state,消息发布就是 actions ,消息订阅就是 mutations

1. 在 app.js 定义全局数据


// app.js
App({
   // 定义全局数据
  data: {
    num: 1,
  }
})

2. 下载消息订阅与发布


在 app.js 以及在需要用到 app.js 数据的地方引入该包

npm i pubsub-js

3. 页面结构


 父组件 index.html

<!--index.wxml-->

<view class="container">
  页面组件
<!-- app.data.num 是 app.js 全局属性 -->
  <view>全局的num:{{app.data.num}}</view>
	<!-- 点击事件 -->
  <button bindtap="add">num++</button>

<view>-------分割线---------</view>

 <!-- A是子组件 -->
  <A/>

</view>

子组件 A.wxml  

<!--commponent/A/A.wxml-->

<!-- app.data.num 是 app.js 全局属性 -->
<view>我是组件A,全局num:{{app.data.num}}</view>

4. 实现状态管理器


在 index.js 和 A.js 以及 app.js 引入 pubsub-js

import PubSub from 'pubsub-js'

在 app.js 里的 onLaunch 生命周期订阅一个 num 增加事件

// 生命周期:初始化完成
onLaunch () {
    // 接收
   	 PubSub.subscribe('add', (_, data) => {
      // 接收数据
      console.log('app.js收到的数据',data);
      // 修改逻辑层数据
      this.data.num++
      // 因为 app.js 不能直接更新视图层,只能让对应的组件自己修改视图层
      PubSub.publish('success','我是app')
    })
},

 在 index.js 发布一个 num 增加事件,并订阅一个更新视图层事件

 在 bindtap 事件发布增加事件,在生命周期 onLoad 订阅一个更新视图层事件

// index.js

import PubSub from 'pubsub-js'

// 获取 app.js 的全局数据
const app = getApp()

Page({
  data: {
      // 视图层的数据只有放在 data 里才能显示
    app,
     // 存放该订阅的 id ,用来取消订阅
    successId:''
  },
    
    // 在这里写订阅事件
  onLoad(){
      // 先更新视图层数据,防止页面跳转后视图层没有同步更新
    this.setData({app})
      // 再订阅一个更新视图层事件
   this.data.successId = PubSub.subscribe('success', (_, data) => {
      console.log(data);
      // 更新视图层
      this.setData({app})
    })
  },
    // bindtap 事件
  add(){
      // 发布一个 num 增加事件
    PubSub.publish('add','我是index')
  },

})

 在 A.js 订阅一个更新视图层事件

  在 attached 生命周期订阅事件

// commponent/A/A.js
import PubSub from 'pubsub-js'

// 获取 app.js 的全局数据
const app = getApp()

Component({

  data: {
      // 视图层的数据只有放在 data 里才能显示
    app,
      // 存放该订阅的 id ,用来取消订阅
    successId:''
  },

  // 组件实例的生命周期
  lifetimes: {
      // 在组件实例进入页面节点树时执行
    attached() {
        // 订阅一个视图更新事件
     this.data.successId = PubSub.subscribe('success', (_, data) => {
        console.log(data);
        // 更新视图层
        this.setData({ app })

      })

    },

  },
})

5. 取消订阅

取消订阅分为:取消指定订阅和取消全部订阅


取消 index.js 的订阅

在 卸载的生命周期 取消订阅

page({
     
    // 页面卸载时触发
   onUnload(){
      // 这是取消全部订阅
      PubSub.clearAllSubscriptions()
      // 取消指定订阅
      // Pubsub.unsubscribe(this.data.successId)
   }
    
});

取消 A.js 的订阅

在生命周期 detached 取消订阅

Component({
    // 组件实例的生命周期
  lifetimes: {
        // 在组件实例被从页面节点树移除时执行
      detached() {
      	// 这是取消全部订阅
      PubSub.clearAllSubscriptions()
      // 取消指定订阅
      // Pubsub.unsubscribe(this.data.successId)
      },
})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值