(点击上方公众号,可快速关注)

作者:司徒正美

zhuanlan.zhihu.com/p/41144332

现在做React转小程序,一个是taro,一个是anujs。

anujs的React小程序一开始是群的方正搞的,后来神烦IT狗接手。当我们想抄袭时,已经有一个可以运行的demo。taro那时名声很大,但实质并不如意。我研究了好久taro的源码,发现可以使用tempate元素避开小程序的自定义组件不能在构造器传参的问题,就正式动工了。

小程序的自定义组件不能在构造器传参的问题, 用过React的同学都知道,React的组件构造器有两个传参props与context,这都是react帮你传入的。props是JSX中同名的标签的属性组成的对象,context是上方组件的getChildContext()产生的对象的并集。而小程序的Component只是一个方法,你传什么它就有什么,不会帮你加东西。

开发了大概有三个星期,已经脱离方正大大的源码。组件的思路使用双模板机制——即用户编写时是React风格编写的(es6与jsx),通过我们一番神操作,它会产生三个文件,第一个是js文件,es5与createElement风格,类机制改由ReactWX的miniCreateClass方法实现,第二个是json配置对象,涉及路由的title与窗口颜色的定义,第三个是wxml文件,我们将render方法的jsx抽取出来,变成这个文件。

现在我们的React小程序有如下优势

  1. 支持npm安装

  2. 支持less与sass

  3. 支持小程序的自带UI库

  4. 支持在JSX直接使用p, div, i, b等HTML标签,它们会在wxml转换成view与text标签。

  5. 支持在JSX中使用函数体与复杂的对象传参,即onClick={function(){ console.log() }}onClick={this.changeAge.bind(this, index, {aaa:111,bbb: 222})}

  6. 支持React完整的生命周期,并保证顺序。

  7. 对wx所有接口进行重新包新,将回调风格转换成Promise风格


anu的React转小程序的性能是有保证的,它不会mpvue或taro那样使用nextTick,而是在一个页面的虚拟DOM更新完才发一次setData。这样就避免了复杂data diff与data 序列化。

小程序的setData性能很差,不能传入过大的对象,它会对data进行序列化。 因此一些转译框架会进行diff操作。但只要减缓它setData的频率,这一步就可以略去。


事件系统上,支持onXXX与catchXXX。catchXXX是模拟阻止事件冒泡实现的API。微信小程序的同学说,用户事件是异步的,所以这里只有定义式接口,没有过程式的



与React的差异

1. 微信小程序的事件机制有瑕疵,不支持stopPropagation与preventDefault。我们将e.detail当成事件对象,在它基础上添加type,target,touches,timeStamp等属性与空的stopPropagation与preventDefault方法
2. 事件的绑定,不要使用this.props.fn或this.state.fn,要用this.fn这种形式,微信在给模板填数据时,会对数据进行JSON.stringify,清掉所有事件。
3. 组件系统是基于小程序的template元素,由于不支持slot,因此无法使用{this.props.children}实现显式的组件套嵌
4. 不完整支持ref机制(refs可以放入组件实例,但不能放DOM,因为没有DOM)
5. 无状态组件还没有实现
6 还没有支持findDOMNode
7. 不支持render props
8. 不支持dangerouslySetInnerHTML属性

关于组件标签套组件标签,需要官方的slot机制支持,目前得到的回复是这样的:


使用

从“RubyLouvre/anu下” git clone下来, 命令行定义到packages/cli目录下,执行npm link
使用mpreact <project-name> 创建工程
定位到 <project-name> 目录下 mpreact start 开始监听文件变化,
用微信开发工具打开当中的dist目录,自己收在src目录中进行开发.

小程序在它的体积还是1mb时,开发体验是很好的,性能也很好。但随着体积的限制放开了,产品经理开始乱搞,小程序原生的API与组件机制就跟不上了。不可能一个APP上有10个弹层,每一个都写一次吧。缺乏继承是它的硬伤。事件机制与我们熟悉的机制差太远。createSelectQuery也设计得非常弱智,wxs过于奇怪。因此有了webview标签后,许多人直接引入页面了。。。因此才有这么转译框架的诞生,包括TX内部的weby。

目前市面上许多转译框架是vue风格的,这对React技术栈的同学不公平,于是有了taro与anu的转译器。anu保留了虚拟DOM的模板,因此会比taro,mpvue更能突破小程序的桎棝。

【关于投稿】

如果大家有原创好文投稿,请直接给公号发送留言。

① 留言格式:
【投稿】+《 文章标题》+ 文章链接

② 示例:
【投稿】《不要自称是程序员,我十多年的 IT 职场总结》:http://blog.jobbole.com/94148/

③ 最后请附上您的个人简介哈~

觉得本文对你有帮助?请分享给更多人

关注「前端大全」,提升前端技能

React 转小程序现状相关推荐

  1. 使用 React 开发小程序

    作者 | 边柳 原文 | https://www.yuque.com/seeconf/2020/qsytho 为什么要用 React 开发小程序 大家知道微信小程序在商业上取得了非常大的成功,正是因为 ...

  2. 前端面试题(HTML、JS、Vue、React、小程序)

    前端面试题 HTML && CSS HTML 1.Div 里面有个一个div ***** Q:有几种方法可以水平,垂直居中 2.doctype的作用 * 3.link标签和import ...

  3. react构建小程序框架及remax的工作原理

    1.为什么要用 React 来构建小程序? react生态体系完善. 自Facebook在2013年5月开源React,经历了7年多的发展,react的社区生态体系非常庞大,若是使用react来构建小 ...

  4. taro react 微信小程序中使用echarts

    1.从echarts-for-weixin下载ec-canvas并放到src目录下 2.修改echarts.js文件,找到t.addEventListener(e,n,i)改为t.addEventLi ...

  5. [转] 如何实现 React 写小程序-1

    铺垫 随着大前端蓬勃发展, 冒出越来越多的端, 最火的当数最近出现的微信小程序. 但是无论是 微信小程序 , 还是 支付宝小程序, 或者 快应用 都有一个明显的缺点, 虽然他们还是按照一定的 js h ...

  6. VS Code 折腾记 - (14) 再来推荐一波大前端适用系列(Node/React/Vue/小程序/主题/代码体验等)的插件

    前言 时隔半年,这期间我又搜罗了一波感觉比较好的插件, 依旧是那句话,好的插件需要作者去创造,时间去迭代- 废话不多说,直入主题; 插件集 React ES7 React/Redux/GraphQL/ ...

  7. VS Code 折腾记 - (14) 再来推荐一波大前端适用系列 (Node/React/Vue/小程序/主题/代码体验等) 的插件...

    前言 时隔半年,这期间我又搜罗了一波感觉比较好的插件, 依旧是那句话,好的插件需要作者去创造,时间去迭代... 废话不多说,直入主题; 2018/7/10: 又追加了几个比较实用的(留言以及最新发现的 ...

  8. React + Taro 小程序跳转公众号

    Taro小程序跳转公众号的文章 步骤:登录公众号后台-小程序-小程序管理-添加-关联小程序 关联后就可以在微信的公众平台查看(设置-关联设置-关联公众号) 如图所示: 然后使用web-view 我这个 ...

  9. Taro+react开发小程序 (一)

    注:0基础小白自学 非专业前端 该篇仅笔记 Taro官方文档 参考:Taro 介绍 | Taro 文档 一.创建目录 二.初始化一个Taro项目 用vscode打开并信任该文件夹 安装Taro (指定 ...

最新文章

  1. PlanAhead工具应用
  2. 吴文俊AI最高成就奖颁给清华张钹院士,之前曾空缺七年
  3. C#中使用DateTimePicker控件显示修改日期时间
  4. MFC动态创建控件并响应事件代码实现过程
  5. 计划得一步一步实施,题库首先是第一步!
  6. 指定LINUX内存大小,linux下内存大小、起始地址的解析与修改
  7. UNIX环境C语言进程控制
  8. CSF 格式文件播放器 下载地址
  9. 电子管功放制作指南_电子管功率放大器的简易设计
  10. 0 win10重装partition_win10换win7,U盘装机错误,Error:partition 0 ended too near怎么回事?怎么修?...
  11. c++数组指针和指针数组详解
  12. jvm原理解析--不疯魔不成活
  13. Oracle数据库,停止正在执行的package
  14. 手机安装python jam有什么影响_Python入门用Bug修改和.jam文件需要注意的问题
  15. 计算机等级怎么查ip地址,ip查地址方法是什么【图文教程】
  16. steam搬砖项目:靠谱吗,细说下搬砖的核心内容
  17. 各大期货交易所保证金收取方式说明
  18. dedecms5.7织梦cms自动给文章加内链 utf-8版
  19. 基于微信小程序商店管理系统源码成品(微信小程序毕业设计)
  20. 算法时间复杂度的符号

热门文章

  1. 强大的看剧网站,持续更新中。。。
  2. 输出参数Ruby的p puts print
  3. 视频质量分析系统VC
  4. (20)打鸡儿教你Vue.js
  5. python入门区块链技术_Python学习入门之区块链详解
  6. 大学毕业我的人生是迷茫的,来到网优谷改变了我的一生
  7. 基于Power BI的终端产品销售ABC分析
  8. 嘀嗒出行IPO 会成为出行界的“拼多多”吗
  9. props接受参数配置
  10. 0308_innovation project_learn for 腐草为萤/mofan sklearn