在iOS中运用React Component的思路,效率更高的开发UI,更好的复用UI组件
来源:Kobe_Dai     阅读:407
源码超市
发布于 2019-06-11 01:59
查看主页

最近一直在看React的少量东西,其实很早前就想开始重拾前台,但是一直提不起兴趣再去看JavaScript,对CSS这种布局方式也不是很来感,说白了,就是懒吧??。去年年底开始在公司app里开始尝试接入Weex,所以不得不把JavaScript再重新撸了一遍,顺带着把ES6的少量新特性也理解了一下,更好的函数调用方式,Class的引入,Promise的运用等等,其实最吸引我的还是在用了Weex之后,感受到了Component带来的UI复用,高效开发的快感。Weex是运用Vue.js来调用,渲染native控件,来达到one code, run everywhere。不论是Vue.js,还是React,最终都是朝着W3C WebComponent的标准走了(今年会发布的Vue 3.0在组件上的语法基本上跟React一样了)。这篇就来讲讲我对React Component的了解,还有怎样把这个标准也能在native上面做运用

demo源码

iOS UI开发的痛点

对iOS开发来说,最常用的UI组件就是UICollectionView了,就是所谓的一个列表页,现在的app大部分页面都是由一个列表来呈现内容的。对iOS开发者来说,我们可以封装每个UICollectionViewCell,从而可以在每个页面的UICollectionView中能够复用,但是痛点是,这个复用仅仅是UI上的复用,在每写一个新的页面(UIViewController)的时候,还是需要新建一个UICollectionView,而后再把UICollectionView的DataSource和Delegate方法再实现一遍,把这些Cell再在这些方法里重新生成一遍,才能让列表展示出来。比如说我们首页列表底部有猜你喜欢的cell,个人中心页面底部也有猜你喜欢的cell,这两个页面,都需要在自己拥有的UICollectionView中注册这个猜你喜欢的cell,返回这个猜你喜欢cell的高度,设置这个cell的model并刷新数据,假如有Header或者者Footer的话,还得重新设置这些Header跟Footer。所以新写一个列表页面,对iOS开发者来说,还是很麻烦。

使用Weex或者者RN开发原生列表页

使用Weex开发列表页的时候,我们组内的小伙伴都觉得很爽,很高效,基本上几行代码就能绘制出一个列表页,举个RN和weex的例子

// Reactrender() {    const cells = this.state.items.map((item, index) => {        if (item.cellType === 'largeCell') {            return <LargeCell cellData={item.entity}></LargeCell>        } else if (item.cellType === 'mediumCell') {            return <MediumCell cellData={item.entity}></MediumCell>        } else if (item.cellType === 'smallCell') {            return <SmallCell cellData={item.entity}></SmallCell>        }    });    return(        <Waterfall>            { cells }        </Waterfall>    );}// Vue<template>    <waterfall>        <cell v-for="(item, index) in itemsArray" :key="index">            <div class="cell" v-if="item.cellType === 'largeCell'">                <LargeCell :cellData="item.entity"></LargeCell>            </div>            <div class="cell" v-if="item.cellType === 'mediumCell'">                <MediumCell :cellData="item.entity"></MediumCell>            </div>            <div class="cell" v-if="item.cellType === 'smallCell'">                <SmallCell :cellData="item.entity"></SmallCell>            </div>        </cell>    </waterfall></template>const 

waterfall对应的就是iOS中的UICollectionView,waterfall这个组件中有cell的子组件,这些cell的子组件可以是我们自己定义的不同类型样式的cell组件。LargeCellMediumCellSmallCell对应的就是原生中的我们自己设置的UICollectionViewCell。这些Cell子组在任何waterfall组件下面都可以使用,在一个waterfall组件下面,我们只要要把我们把在这个列表中需要展现的cell放进来,通过props把数据传到cell组件中就可。这种方式对iOS开发者来说,真的是太舒服了。在觉得开发很爽的同时,我也在思考,既然这种Component的方式用起来很爽,那么能不能也运用到原生开发中呢?毕竟我们大部分的业务需求还是基于原生来开发的。

React的核心思想

怎样在iOS中运用React Component概念

Demo

Demo中,我会创立一个WaterfallComponent组件,还有多个CellComponent来绘制列表页,每个不一样列表页面(UIViewController)都可以创立一个WaterfallComponent组件,而后将不一样的CellComponent按照顺序插入到WaterfallComponent组件中,就可完成绘制列表,不需要每个页面再去解决UICollectionView的DataSource,Delegate方法。


Untitled.png

WaterfallComponent内部会有一个UICollectionView,WaterfallComponent的insertChildComponent方法中,会创立一个dataController来管理数据源,并用来跟UICollectionView的DataSource方法进行交互从而绘制出列表页,最终UIViewController中绘制列表的方法如下:

self.waterfallComponent = [[WaterfallComponent alloc] initWithProps:nil];    for (NSDictionary *props in datas) {    if ([props[@"type"] isEqualToString:@"1"]) {        FirstCellComponent *cellComponent = [[FirstCellComponent alloc] initWithProps:props];        [self.waterfallComponent insertChildComponent:cellComponent];    } else if ([props[@"type"] isEqualToString:@"2"]) {        SecondCellComponent *cellComponent = [[SecondCellComponent alloc] initWithProps:props];        [self.waterfallComponent insertChildComponent:cellComponent];    }}[self.waterfallComponent drawComponentInView:self.view withProps:nil];

这样,每个我们自己设置的Cell即可以以CellComponent的形式,被按照随便顺序插入到WaterfallComponent,从而做到了真正意义上的复用,Demo已上传到GitHub上,有兴趣的可以看看

总结

思考

目前我们只用到了Component这个概念,其实React中,React Element的概念也是非常核心的,React Element隔离了UI形容跟UI绘制的逻辑,通过JSX来形容UI,并不去生成,绘制UI,这样我们能够以最小的代价来生成或者者销毁React Elements,而后在交付给系统绘制elements里形容的UI,那么假如原生里也有这一套模板语言,那么我们就能真正做到在Component里,传入props,返回一个element形容UI,而后再交给系统去绘制,这样还能省去cell的创立,只创立CellComponent就可。其实我们可以通过定义一套语义去形容UI布局,而后通过解析这套语义,通过Core Text去做绘制,这一套还是值得我再去思考的。

免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 系统环境 服务器应用
相关推荐
CSS颜色--基本样式
svg高级应用及动画
一次带宽拉满引发的百分百超时血案!
原生JS+css3实现时钟效果,源码奉上
完美的响应式布局vw+vh+rem屏幕适配方案!
首页
搜索
订单
购物车
我的