React-Native 样式、布局、绘制

1,写在前面

在web开发中,以往结构、样式、行为的开发通常是分离的,也就是所谓的“关注点分离(separation of concerns)”,它的意思是,各种技术只负责自己的领域(html、css、js),不要混合在一起,形成耦合。

HTML 语言:负责网页的结构,又称语义层

CSS 语言:负责网页的样式,又称视觉层

JavaScript 语言:负责网页的逻辑和交互,又称逻辑层或交互层

这在往日都是好的实践推荐。但是这几年组件化和模块化开发思维渐行其道(特别是React出来后,打破了这一原则,React的基础组织单元是组件,强制要求把html、css、js写在一起),特性或者功能粒度成为一种软件设计和开发上的选择。

那么,在实际开发中,有没有一种超集可以贯穿三者呢? 有,jsx和typescript就是,jsx与typescript是两个不同的概念,但都是一种语法糖,都是JavaScript的超集合,typescript1.6版本是支持jsx的,在react中会用jsx(write css in js、write “html” in js)来开发组件,React-native是react的扩展,在组件开发上也是用的jsx。

                                                      component in react-native

2,样式

2.1,样式定义

在RN中,并不需要学习什么特殊的语法来定义样式,使用JavaScript来写样式。样式名(属性)基本上遵循的是CSS的命名 和规则(比如后定义覆盖原则、样式表现等),只是按照JS的语法要求,某些样式名需要用驼峰命名法(比如css中的background-color 需写成“backgroundColor”)。

样式的定义有两种方式:

内联方法: style={{color: red}}

样式生成器: : styleSheet.creat({textColor: {color: red}})

2.2,样式用法

在RN中,核心组件都有一个名为style的属性,样式在RN中的应用就是给该属性赋值。属性的值可为JavaScript中的对象({color:red}),或者数组([{color: red}, {color: blue}])。

2.3,样式应用范畴(组件可用样式和识别)

RN中的组件(基础组件、RN中提供的组件)所能应用的样式有一定的范畴,比如color样式不能应用在View组件中。识别哪些组件有哪些可用的样式有两种方法:1,去网上或者官网查。2,调试时打开warn提醒,应用一个样式,如果该组件没有该样式,则会有告警。告警里面会列出该组件所能应用到的样式集合。

3,布局

在React Native中使用flexbox规则来指定某个组件的子元素的布局。Flexbox可以在不同屏幕尺寸上提供一致的布局结构。RN中的Flexbox规则和Web中Css FlexBox基本一致,主要的不同就是flex-direction默认不同,css中默认是水平方向,rn中默认是垂直方向。具体的flexbox布局相关的知识可以参考我之前写的一篇文章《盒模型与布局》

4,绘制

Web中页面的绘制是浏览器器UI后端做的,而在RN中则是交由原生去绘制(例如ios中的UIkits,具体RN和原生的交互和通讯可以参考我之前写的另外一篇文章《React-Native原理解析与通讯机制阐述(Eg:ios)》),这里只做简单的浅析和对比。

4.1,web 页面绘制

                                                4.1.1,webkite解析网页的过程

                                          4.1.2,浏览器的内部过程

                                                    UI Backend就是绘制页面图层的模块。

4.2,RN视图绘制

4.2.1,启动渲染(从组件的角色剖析--android)

简单说就是Native初始化 -> 加载JS,JS端注册组件 ->端上调用JS端run方法,传入入口组件名称 -> JS端启动渲染流程。

4.2.2,组件渲染--View

创建: ReactNative的UI组件通过requireNativeComponent->createReactNativeComponentClass->ReactNativeBaseComponent下mountComponent的调用关系,最终在mountComponent中调用UIManager(Native Module)组件创建View:UIManager.createView(tag, this.viewConfig.uiViewClassName, nativeTopRootTag, updatePayload);,在Native端,UIManager调用对应组件类型的ViewManager(单例,管理类)创建实例。

更新:属性--样式同步,也就是re-render的过程,在这过程中会调用ReactNativeBaseComponent下receiveComponent->UIManager.updateView完成。

参考: https://github.com/facebook/react-native/            http://facebook.github.io/react-native/            http://www.jianshu.com/p/17d6f6c57a5c

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

推荐阅读更多精彩内容