介绍原始写法 & 及其改进写法一

还有比较流行的 styled-components在RN中的使用 & 及其改进写法二

1.原写法

/*** 原写法*/
const styles1 = StyleSheet.create({item1:{width:100,height:200,backgroundColor:'#66CCFF',},item2:{width:100,height:200,backgroundColor:'#66CCFF',},item3:{width:50,height:100,top:50,left:25,backgroundColor:'#66CCFF',}
});
console.log('styles1 :',styles1);

原写法的缺点在于变量不好引入,不好体现样式间的关系,没有计算表达式等……

<!--more-->

2.改进写法一

看StyleSheet.create的代码,就是直接返回一个对象

//在react native 0.44版本中
var StyleSheet = {create: function(styles) {return styles;},

那就可以不限于StyleSheet.create的写法,可以比较自由的返回一个对象了,下面给出一个我的简单例子:


/*** 换一种写法,简单引入了变量表达式* 虽然还是没有像iOS中 view.center / autolayout之类的写法方便* @returns {{}}*/
function styles2Creator() {let s = {};let itemWidth = 100;let itemHeight = 200;//引用常量s.item1 = {width:itemWidth,height:itemHeight,backgroundColor:'#66CCFF',};//引用其他样式的值s.item2 = {width:s.item1.width,height:itemHeight,backgroundColor:`${s.item1.backgroundColor}`,};//计算表达式 s.item3 = {width: s.item2.width / 2,height: s.item2.height / 2,top:s.item2.height / 4,left:s.item2.width / 4,backgroundColor:s.item1.backgroundColor,};//样式的继承s.item4 = {...s.item3,backgroundColor:'#FF00CC',};//带参数s.item5 = (top) => {return {...s.item3,marginTop:top,};        };//带参数 + 缺省值s.item6 = (top) => {return {...s.item3,marginTop:top ? top : 10,};           }return s;
}
const style2 = styles2Creator();
//const style2 = StyleSheet.create(styles2Creator());
console.log('style2 :',style2);

运行一下可以看到 log出来的style2和style1的属性。

3. styled-components

号称React 中的 CSS 最佳实践,使用行内样式,支持CSS。该第三方也也可用于RN。

react-native init了个RN工程 写了个简单的例子:


import React, {Component} from 'react';
import {AppRegistry,StyleSheet,Text,View,Image
} from 'react-native';
//需要 `npm install --save styled-components`
import styled from "styled-components/native";//这里开始styled-components 式的样式:
//styled-components的格式为: const [自定义变量名] = styled.[相应的系统组件]`css表达式`;//普通写法 (不大写开头会报错……
const ListContainerView = styled.View`width:360;height:280;background-color: #F0F2F5;`;//扩展 (backgroundColor 和 background-color都可以
const ItemContainerView = ListContainerView.extend`backgroundColor: #66CCFF;flexDirection:row;
`;//带参数
const LeftImageContainerView = styled.View`height:${props => props.primary ? 280 : 180};;width:180;background-color: #77BB00;
`;//然后发现一个尴尬的事就是不知道怎么扩展自定义组件 比如JDImage
//带计算表达式
const LeftImageHeight = 280 - 10 *2;
const LeftImage = styled.Image`margin-top:10;margin-left:10;width:${180 - 10 *2};height:${LeftImageHeight};background-color: #FFFFFF;
`;//想要获取另一个组件样式LeftImage的高度 不能直接使用 ${LeftImage.height}
//因为 LeftImage返回的是  ƒ StyledNativeComponent()方法……
const RightContainerView = styled.View`width:160;height:${LeftImageHeight};background-color: #FF00CC;
`;export default class MyApp extends Component {render() {return (<ItemContainerView ><LeftImageContainerView primary>{console.log('LeftImageContainerView.style:',LeftImageContainerView)}<LeftImage source={{uri:'http://static.runoob.com/images/demo/demo2.jpg'}}/></LeftImageContainerView><RightContainerView></RightContainerView></ItemContainerView>);}}AppRegistry.registerComponent('MyApp', () => MyApp);

优点:

  • react推荐的行内样式 css in js;
  • 方便前端同学的写法 可以完全使用CSS的书写习惯

缺点和原始写法的差不多,还对本身不是前端开发的人来说带来额外的学习成本…… 所以还是不推荐……

参考链接:

  • styled-components React 中的 CSS 最佳实践 | zhihu
  • styled-components | 官方文档
  • Styled Components:让样式也成为组件 | alloyteam.

4.改进写法二

简单来讲 styled-components 就是生成一个带样式的组件,完全可以吸收这种写法 自己改进RN中 ,而不使用styled-components这个库

结合 写法一 和 styled-components的想法,给出一个简单例子:

import React, {Component} from 'react';
import {AppRegistry,StyleSheet,Text,View,Image
} from 'react-native';//写法二
function stylesCreator() {let s = {};let width = 360.0, height = 280.0;s.ListContainerView = {width:  width,height: height,backgroundColor: '#F0F2F5',};s.ItemContainerView = {width:  width,height: height,backgroundColor: '#66CCFF',flexDirection:'row',};console.log('s.ItemContainerView :',s.ItemContainerView);s.LeftImageContainerView = {height:height,width:width / 2,backgroundColor: '#77BB00',};s.LeftImage = {marginTop:10,marginLeft:10,width: 180 - 10 *2,height: s.LeftImageContainerView.height - 10*2,backgroundColor: `#FFFFFF`,};s.RightContainerView = {width: width / 2,height: s.LeftImage.height,backgroundColor: '#FF00CC',};return s;
}
const styles = stylesCreator();
//const styles = StyleSheet.create(stylesCreator());//然后再结合 styled-components:
// 模拟 styled-components API
const styled = (Component, styler) => (props) => {const style = typeof styler === 'function' ? styler(props) : styler;return <Component {...props} style={[ style, props.style ]} />
}// styled components
//同样可以完成组件(带样式)的继承 const RightContainerView = styled(LeftImageContainerView,styles.RightContainerView);const ListContainerView = styled(View,styles.ListContainerView);
const ItemContainerView = styled(View,styles.ItemContainerView);
const LeftImageContainerView = styled(View,styles.LeftImageContainerView);
const LeftImage = styled(Image,styles.LeftImage);
const RightContainerView = styled(View,styles.RightContainerView);export default class MyApp extends Component {render() {return (<ItemContainerView ><LeftImageContainerView primary>{console.log('LeftImageContainerView.style:',LeftImageContainerView)}<LeftImage source={{uri:'http://static.runoob.com/images/demo/demo2.jpg'}}/></LeftImageContainerView><RightContainerView></RightContainerView></ItemContainerView>);}}AppRegistry.registerComponent('MyApp', () => MyApp);

emmm ,无需引入第三方库 感觉好多了。缺点当然是不支持原CSS写法。

5. react native 0.45

在0.45版本中运行改进写法一时,你可能看到style2在控制台的输出类似为:

//const style2 = StyleSheet.create(styles2Creator());style2 :
{item1: 12, item2: 13, item3: 14, item4: 15, item5: 16, …}item1:12item2:13item3:14item4:15item5:16item6:17
__proto__:Object

这是怎么肥事!我的item对象怎么变成数字了!

别急,在0.45版本后StyleSheet代码有所改变(其实我没看具体哪个小版本改的 _(:зゝ∠)_), StyleSheet.create改成:

//react native : 0.45.1create<S: Styles>(obj: S): StyleSheet<S> {const result: StyleSheet<S> = {};for (var key in obj) {StyleSheetValidation.validateStyle(key, obj);result[key] = ReactNativePropRegistry.register(obj[key]);}return result;},
//react native0.45.1 ReactNativePropRegistry.js
var objects = {};
var uniqueID = 1;
var emptyObject = {};class ReactNativePropRegistry {static register(object: Object): number {var id = ++uniqueID;if (__DEV__) {Object.freeze(object);}objects[id] = object;return id;}
//多的就不看了……内容不多各位有兴趣自己看  

通过看ReactNativePropRegistry代码,StyleSheet将样式对象储存在objects中,并返回uniqueID

比如取回原来的item,就可以这样做:

import ReactNativePropRegistry from '../node_modules/react-native/Libraries/Renderer/src/renderers/native/ReactNativePropRegistry';
console.log("ReactNativePropRegistry.getByID(12): ",ReactNativePropRegistry.getByID(12));
console.log("ReactNativePropRegistry.getByID(style2. item1): ",ReactNativePropRegistry.getByID(style2. item1));

就可以通过 ReactNativePropRegistry.getByID就可以取得样式对象了。这可能对于之前的改进写法造成了一点小麻烦,不过还可以用~


其他参考阅读:

  • react-native-css | github css + sass in rn
  • rn-less | github css + less in rn
  • React-Native 样式管理方案浅谈 | zhihu

RN中布局样式的写法相关推荐

  1. RN中布局方式FlexBox、absolute

    FlexBox 布局基本用法 1.什么是FlexBox Flexbox是Flexible Box的缩写,意为'弹性布局',它为盒状模型提供了很大的灵活性,让任何一个容器都可以指定为Flex布局 任何一 ...

  2. React Native应用中的样式

    React Native应用中的样式 RN中样式与CSS名称类似,但是本质上不同 -- RN应用中没有浏览器内核!!! 例如:RN中的组件不分"行内"."行内块" ...

  3. ReactNative中的样式

    RN中的样式类似于CSS,但与CSS本质上不同--CSS运行于浏览器/RN样式是脱离浏览器: RN样式没有独立的.css文件,没有"继承"特性,部分样式是CSS中没有的(paddi ...

  4. vue组件中的样式属性:scoped,解决在父组件中无法修改子组件样式问题

    Scoped CSS规范是Web组件产生不污染其他组件,也不被其他组件污染的CSS规范. vue组件中的style标签标有scoped属性时表明style里的css样式只适用于当前组件元素,它是通过使 ...

  5. CSS非布局样式和重点内容

    CSS基础非布局样式 Cascading Style Sheet 层叠 .样式.表 可以简单理解为PS中图层的样式和叠加 选择器 selecter{prop:value; } 选择器用于匹配HTML元 ...

  6. 我的前端学习之CSS基础--选择器、字体、非布局样式、背景

    CSS基础 选择器 半透明,可叠加,第一张的padding,第二张的font-size,第三张的background <style>body{padding :10px; font-siz ...

  7. 在ASP.NET 2.0中使用样式、主题和皮肤

    ASP.NET 2.0的主题和皮肤特性使你能够把样式和布局信息存放到一组独立的文件中,总称为主题(Theme).接下来我们可以把这个主题应用到任何站点,用于改变该站点内的页面和控件的外观和感觉.通过改 ...

  8. 【RecyclerView】 九、为 RecyclerView 设置不同的布局样式

    文章目录 一.为 RecyclerView 设置不同的布局样式 二.完整代码 三.RecyclerView 相关资料 一.为 RecyclerView 设置不同的布局样式 为 RecyclerView ...

  9. 【Qt】Qt Creator中布局器详解

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 布局器概述 04. 布局属性设置 05. 弹簧条属性和作用 06. 附录 01. 概述 关于 Qt 布局管理,有专门的帮助 ...

最新文章

  1. ERP项目管理,哪一环才是关键节点?
  2. NIST发布网络安全劳动力框架
  3. Interview:算法岗位面试—10.15上午—上海某公司算法岗位(偏图像算法,制造行业)技术面试考点之AI算法与实际场景结合产生商业价值的头脑风暴
  4. 思科交换机ping得通 traceroute不通_网络中经常接触的Ping 一次性教你弄懂如何检测三层网络...
  5. 线程基础知识_线程生命周期_从JVM内存结构看多线程下的共享资源
  6. 我们为什么都应该坚持写博客,意义何在?
  7. Web作业:specific word count (index of )
  8. 查看 linux系统版本,内核,CPU,MEM,位数的相关命令(实验)
  9. System.Data.OracleClient.OracleConnection的类型初始值设定项引发异常.
  10. 关于bootstrap--排版(标题、强调、背景、插入符等)
  11. 73. 文件上传函数封装
  12. 【斗地主 javascript js 斗地主 AI 人机 网页在线】基于专家系统的斗地主AI算法
  13. php漫画连载系统,小涴熊漫画连载系统带采集API开源
  14. 3dmax渲染计算机内存不足怎么办,解决3dmax渲染内存不够导致渲染失败的三种方法...
  15. 比特率和波特率的公式解析
  16. Android--扫一扫(识别二维码、条码)
  17. 深入PCI与PCIe之一:硬件篇
  18. linux查看端口命令ss,Linux查看端口号ss和losf指令
  19. 等比求和模版,下标从1开始
  20. 2021年上半年全球首席执行官任命达到创纪录水平,女性首席执行官翻了一番|美通社头条...

热门文章

  1. [转]解读ASP.NET 5 MVC6系列(7):依赖注入
  2. HASH算法不是加密算法
  3. C 一个数组删除一项 并且移位
  4. 网线的制作方法和千兆网线的施工注意事项
  5. 安装上传下载插件,jdk及redis
  6. 【Bootstrap+JSP+Mysql学习笔记(二)】开发环境配置(二)
  7. vmware horizon view 添加vcenter server
  8. ubuntu15.04 TLS
  9. 干掉系统害群之马 轻轻松松“杀”进程
  10. Python开发【第三篇】:文件操作与函数