小程序和mobx的踩坑之旅

前言

在之前文章里可以知道,本人一直致力于推广react和mobx结合开发webapp。很遗憾的是个人目前为止还没在正式的react项目中使用过mobx,但最近一个偶然的机会,终于让我有机会尝试一下mobx了,不过是在小程序的项目里。

简述

本文主要讲述mobx在小程序里如何使用的原理,如果不懂mobx的话可以试着参考一下简书上的文章和官方文档。

简书-mobx

中文文档

正文

  1. 了解小程序的一些工作原理。

    工作原理。通过官方文档我们了解到,在小程序里,渲染页面(webview)和js的逻辑(JSCore)是各自两个不同的环境,类似于前端和后端。js里的数据(data) 传送到页面是依赖于一个特定的通信机制的,并且它是以字符串的形式传递的。

    也就是说,使用mobx创建的数据对象(observable state),必须通过 setData 方法来传给页面。而且传输的时候会转成字符串。这意味着你的对象会被拷贝一次。但是如果你直接把 observable state 传给页面是有一定的坑的。例如,对象里的属性是在 __proto__ 上,或者是不可遍历属性的话,wxml 里会拿不到这些数据。原因就是上面所说的,对象转字符串是一个遍历拷贝的操作。会不会出现这种情况取决于你创建对象是通过对象直接量还是通过 new Class 的形式。

    解决这问题最好的办法是先手动 深度拷贝 一遍 observable state,再去 setData,关于这一点等一下再详细说。

  2. 怎么让 wxml 响应 observable state 的变化

    mobx.autorun
    这个方法接受一个回调函数作为参数,它会自动去调用一次回调函数。
    当回调函数里使用的 observable state 发生变化时,这个回调函数又会再次被 autorun 再执行一遍。因此,只要把 observable state 的使用和 setData 放在autorun 里,就可以自动的更新视图了。

    但有一个问题,在 autorun 里要使用哪些 observable state?还有怎么去使用 observable state。毕竟 observable state 的作用是用于 view 层的。但小程序不像 react 那样可以在 render 函数里渲染 view, 小程序是采用模板语法的。解决这个问题,比较简单的方法是,所有 observable state 都去使用一遍,这样就能让 autorun 监测到所有 observable state。使用的方法也很简单,深度拷贝 一遍。

  3. 深度拷贝
    综上所说, 深度拷贝是使用 mobx 的关键
    以一个简单的例子说明一下,深度拷贝会遇到的问题。

    class UserStore {
      @observable user_name = 'Darko Kukovec'
    
      @computed
      get last_name() {
          return this.user_name.split(' ').pop()
      }
    }
    
    • 被 observable 包装的实例属性会在 __proto__ 上,而不是实例的直接属性。但如果在初始化方法 constructor 里使用 extendObservable 的话,上面所说的属性会被复制到实例的直接属性上。

    • 被 computed 包装的 getter 拦截器。在 class 上声明的 getter 拦截器本来就会放在 prototype 上,并且是不可遍历。这一点对于 computed 也不例外。

    • Object.getOwnPropertyNames。这个方法能拿出对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)。但要注意,Object.getOwnPropertyNames(obj) 不能拿到 obj.__proto__(原型链)上的属性。需要通过 Object.getOwnPropertyNames(obj.__proto__)获取。

    • for in 循环能遍历对象的所有可遍历属性,包括 __proto__ 上的属性。

    • mobx.toJS。 mobx提供的深度拷贝方法,但是计算值和其他不可枚举的属性不会成为结果的一部分。

    以上几点是在做 observable 对象的深度拷贝要注意的。

  4. miniapp-mobx-starter-kit
    至于深度拷贝具体怎么做,怎么把 mobx 跟 小程序结合起来?可以参考一下我自己构建的小程序开发的脚手架 miniapp-mobx-starter-kit。主要逻辑在 src/store/helper/observer.js 里。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • Mobx是一个功能强大,上手非常容易的状态管理工具。就连redux的作者也曾经向大家推荐过它,在不少情况下你的确可...
    绯色流火阅读 121,508评论 51 170
  • 本文首发于:CSDN「前端开发者说」公众号。CSDN「前端开发者说」公众号(ID:bigfrontend),专注前...
    RachelQG阅读 4,801评论 2 20
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 昨晚身体不舒服,便先上床睡觉了,迷迷糊糊听见老公不断催女儿快点洗完澡出来睡觉,威胁她要删掉手机里的软件,好在女儿没...
    石靖峰阅读 333评论 0 0
  • 小舅舅排行老六,所以从小到大,我习惯叫他小六舅。 听说我回家,小六舅骑着车带着舅妈和表弟来...
    柴道一阅读 497评论 0 1