React转微信小程序:构思

钟钦成

钟钦成,网名为司徒正美,国内著名的前端专家,对浏览器兼容性问题/选择器引擎/react内部机制等具有深厚的积累,开发有avalon/anu等前端框架,著有《JavaScript框架设计》一书。

公司使用微信小程序做了不少东西,发现的痛点越来越多。没有组件化,配置繁锁,生命周期名字不一。基于它才有了 vue 系列的解决方案,我在想,能不能搞一套 React 的解决方案呢。毕竟以 React 为技术栈的公司不在少数,销路肯定很好。

我首先从定义组件着手。微信小程序是存在自定义组件的机制,但不能使用继承。并且一个组件也拆得好碎,分成四块。JS定义,CSS,模板与配置。

JS定义

微信小程序是没有组件机制,只是提供了一个工厂方法 Component 给你定义组件。如果模糊来看,Page 也相当于组件,因为它也有 data 与 setData 方法。这相当于 React 的 state 与 setState。App 相当于 React 中的无状态组件,它可以定义一个所有页面都能访问的 globalData 对象,还有一些事件。我们发现 App,Page,Component 的一些生命周期是与路由器挂钩的,不像 React,React 只针对自身。

我们用 React 的概念来类似小程序吧,这样对没有接触过小程序的同学比较好理解

小程序没有 shouldComponentUpdate, 我们可以对 setData 的第一个参数做一些手脚,如果为 false, 返回一个空对象。

CSS

CSS,在小程序中叫 WXSS,是一个弱化版的 CSS。文档中也介绍不要使用 id,说明它无法做到 scoped。但如果纯是写 CSS 没什么意义,我们公司已经大量使用 less, sass 等预处理语言,因此未来也会向这个方向发展。

模板

小程序将组件的模板独立出来,使用经典的 JSP 风格嵌入变量,还添加了 wx:if, wx:for 这些指令实现常规的 if, for 操作。因此许多人就将它与 vue 类似起来。但它与 vue 来比,还是很弱,首先,它没有双向绑定(美曰其名为单向流动),其次事件绑定时只能使用方法名,不能动态生成函数,也不能指定一个函数,再次也混杂了一些奇怪的标签,template, block, slot。template 是应该是 web component 的东西,block 是后端模块的东西, slot 是 vue 的。

相当于 React 这样的代码

相对于React, vue,它没有ref这种指令,它是不想让我们得到元素节点,但我们可以定义一些data-*属性,然后在组件的attached钩子中通过this.dataset拿到它们。但相当于React, 我们是拿不到真正的props。在小程序中, properties与data是同一个东西。

配置

App,Page, Component 都有相应的 json 对象,主要是定义弹窗的颜色,页面的颜色及一些子组件的引用。这些可以抽取成组件的静态属性,这样代码就更加内聚。

在我动手之前,业界其实已经有相关的方案出来,比如 weact, taro 了。我所组织的技术群,也有一帮同好在做这东西,看来潮流不可逆转,小程序这种反人类的粗糙滥造之物必须再封装才方便我们迅速推进业务。就像 sass, less 于之 css, typescript 于之 es5。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180717G09AKB00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券