React Native开发跳坑之native-base自定义样式

React Native开发跳坑之native-base自定义样式,第1张

开发平台的搭建就不赘述了,按照网上的资料和官网的Demo都能把HelloWorld搞出来,在这里我只记录一些,花了较长时间才解决的问题。本篇文章解决的问题是在使用第三方UI插件native-base如何自己定义样式

在使用RN时,自己写按钮啥的都太费劲,况且对于我这种从java转过来凑热闹的,根本也不会写啊。还好有一些强大的第三方组件可以用。native-base就是我给项目引入的一个UI组件,它包含几乎所有的常见控件,像Button,Icon,Badge等等。但是在使用过程就遇到需要修改默认样式的问题,网上苦苦寻找好久,最后还是在native-base官网( https://nativebase.io/ )找到了答案。

打开官网-点击docs-点击左侧customize可以看到问题的答案:

这样我们就可以使用对应的主题了,这时的主题是使用的刚才新生成的样式文件,你可以在里面开心地自定义样式了!是不是很简单?

阿里云优惠

在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

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

样式的定义有两种方式:

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

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

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

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

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

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

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

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

创建: 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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11346464.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存