react-native-pg-style使用方法(以最简单的方式编写样式代码)

react-native-pg-style

以最简单的方式编写样式代码,抛弃react-native标准的样式创建方式.

看大家写的源码中都是按照react-native标准的样式创建方式来写样式代码的,样式代码就占了大概四分之一,甚至三分之一的代码,然而我却喜欢把样式写在一行当中.而不用const styles=StyleSheet.create({样式属性...})来写,我觉得这样在改动样式时便不用在跑到StyleSheet.create中修改,而且代码量会少很多,于是就有了这个插件.

下面说明中的插件就是当前这个react-native-pg-style插件

github地址: https://github.com/geek-prince/react-native-gp-style

npm地址: https://www.npmjs.com/package/react-native-gp-style

先简单感受一下

以侵入式等级1为例,什么是侵入式等下下面再介绍

标准方法创建该样式为:

const styles=StyleSheet.create({
    container:{
        padding:15,
        width:Dimensions.get(‘window‘).width,
        backgroundColor:‘#999‘,
        marginTop:100,
    },
    button:{
        width:‘100%‘,
        height:50,
        backgroundColor:‘#f90‘,
        justifyContent:‘center‘,
        alignItems:‘center‘,
        borderColor:‘#0f9‘,
        borderRadius:25,
        borderWidth:2,
    },
    btnText:{
        backgroundColor:‘#0000‘,
        color:‘#fff‘,
        fontSize:20,
    },
});

<View style={styles.container}>
  <TouchableOpacity style={styles.button}>
      <Text style={styles.btnText}>有本事点我呀</Text>
  </TouchableOpacity>
</View>

很长的一段代码对吧,那再来看看用了这个插件之后的代码为:

<View style={[sf.spad(15),sf.sw(s.w),s.bg999,sf.smarT(100)]}>
  <TouchableOpacity style={[s.w100,sf.sh(50),sf.sbgc(‘#f90‘),s.center,sf.sb(‘#0f9‘,25,2)]}>
      <Text style={[sf.stext(20,‘#fff‘,)]}>有本事点我呀</Text>
  </TouchableOpacity>
</View>

直接发样式写在一行内,完全抛弃const styles=StyleSheet.create这样的方法,要修改时直接在组件这里就改了,不用跑到const styles=StyleSheet.create中去改,即使代码写在一行内也简短不显得臃肿.

安装

npm install react-native-gp-style --save

如何使用

首先导入插件

导入插件的三种方式(侵入方式的三个等级,根据情况选择其中一种方式导入)

先导入插件

import Styles from ‘react-native-gp-style‘;

然后根据情况(看下面的三种方式的优缺点)选择下面的一种方式使用插件.

  • 非侵入式(侵入等级0):

let {s,sf}=new Styles(0);

或自定义名称

let {s:styles,sf:styleFunctions}=new Styles(0);

  • 部分侵入式(侵入等级1,推荐):

new Styles(1);

或自定义名称

new Styles(1,‘styles‘,‘styleFunctions‘);

  • 完全侵入式(侵入等级2):

new Styles(2);

或自定义名称

new Styles(2,‘styles‘);

怎样使用

像上面一样导入之后有两个变量s,sf(侵入式导入的话存放在global全局变量中).

  • s是一个对象,这个对象中以简单的键名key对应到一个固定的样式.
    -- 比如s.center对应的是子组件水平,垂直居中的样式{justifyContent:‘center‘,alignItems:‘center‘}.
    -- 比如s.w对应的是当前设备的宽度(侵入式等级2时,直接w){width:Dimensions.get(‘window‘).width}.
  • sf也是一个对象,这个对象中以简单的键名key对应到一个获取样式的方法.可以通过调用这些方法,传入方法参数,获得对应的样式.
    -- 比如sf.swh(100,200)就获取到宽100,高200的样式(可以只设置一个值,此时宽高都等于这个值){width:10,height:20}.(侵入式等级为2时直接swh(10,20)).
    -- 比如sf.spad(10,20,30,40)就获得内间距上10,右20,下30,左40的样式{paddingTop:10,paddingRight:20,paddingBottom:30,paddingLeft:40}.(可以给出1-4个参数,根据局不同参数个数设置不同内间距,就和在css中一样的效果)

如果一个view要同时具有上面举例的这些样式属性的时候就只需要这样&lt;View style={[s.center,s.w,sf.swh(100,200),sf.spad(10,20,30,40)]}&gt;&lt;/View&gt;

如果不喜欢s,sf这两个名称的话,可以像上面一样自定义这两个变量名的名称,上面就把这两个变量名改为了styles,styleFunctions,大家可以根据自己的需要自定义名称,上面只是演示,自定义名称的话应该尽量的短小.

三种导入方式的优缺点:

  • 0->非侵入式导入:

-- 优点:不占用任何一个全局变量,不会造成全局变量污染.IDE中可以通过s.,sf.来获得属性名,方法名,方法参数的提示
-- 缺点:每个需要用到的文件中都要import,new一次.每个样式属性名,样式方法名前面都要写s.,sf.比较麻烦.如果你自己取更长的别名的话可能使代码变长

  • 1->部分侵入式导入:
    -- 优点:只用在主入口文件(可能是index.js,index.ios.js,index.android.js,Main.js等等,具体看自己的情况)中import,new一次,以后就可以在项目中的所有文件使用.IDE中可以通过s.,sf.来获得属性名,方法名,方法参数的提示
    -- 缺点:会占用s,sf(或者你自定义的名称)的两个全局变量.每个样式属性名,样式方法名前面都要写s.,sf.比较麻烦.
  • 2->完全侵入式导入:
    -- 优点:只用在主入口文件中import,new一次,以后就可以在项目中的所有文件使用.调用设置样式的方法时不用再sf.spad(15),直接spad(15).获得屏幕的宽高直接w,h,而不用s.w,s.h,预置背景色,颜色,flex布局等也是直接写.简单方便.
    -- 缺点:会占用s,以及一系列s开头的方法的全局变量,以及一系列颜色,flex布局,宽高样式相关的全局变量,造成全局变量污染.IDE中不能用sf.来获得方法名,方法参数的提示,对方法名不熟悉的话也会造成一定的困扰.

样式属性一览表(即上面的s对象中的键值对):

为了方便大家不同的习惯,有的相同的样式属性会有不同的键名,比如让子组件水平,垂直居中的样式属性,可以s.center(见名知意,但略长),也可以直接s.c(超级短,但不了解的人根本不知道这是啥).

固定部分,下面部分的内容所有侵入式级别都是通过s.center这样的形式调用

key(样式属性键名) value(对应的样式属性) 解释
---------------- 对子组件的布局方式部分 ----------------
spaceB或spaceBetween或sB {justifyContent:"space-between"} 让子组件向两边分开
spaceA或spaceAround或sA {justifyContent:"space-around"} 让子组件向两边分开,并且左右留间距
row {flexDirection:‘row‘} 让View子组件横向排布(默认纵向)
wrap {flexWrap:‘wrap‘} 超出部分子组件换行
---------------- 对子组件的对齐方式部分 ----------------
center或c {justifyContent:‘center‘,alignItems:‘center‘} 让子组件水平,竖直都居中
aliCenter或aliC {alignItems:‘center‘} 让子组件在次轴方向上居中对齐
aliEnd或aliE {alignItems:"flex-end"} 让子组件在次轴方向上向尾部对齐
justCenter或justC {justifyContent:‘center‘} 让子组件在主轴方向上居中对齐
justEnd或justE {justifyContent:"flex-end"} 让子组件在主轴方向上向尾部对齐
---------------- 对自身组件相对父组件的对齐方式部分 ----------------
aliSelfStart或aliSS {alignSelf:‘flex-start‘} 对齐父组件头部
aliSelfCenter或aliSC {alignSelf:‘center‘} 相对父组件居中对齐
aliSelfEnd或aliSE {alignSelf:‘flex-end‘} 对齐到父组件的尾部
---------------- 绝对定位,相对定位部分 ----------------
rel {position:‘relative‘} 设置组件为相对定位
abs {position:‘absolute‘} 设置组件为绝对定位
absTop或absT {position:‘absolute‘,top:0} 设置组件为绝对定位,并定位在父组件最顶部
absBottom或absB {position:‘absolute‘,bottom:0} 设置组件为绝对定位,并定位在父组件最底部
absLeft或absL {position:‘absolute‘,left:0} 设置组件为绝对定位,并定位在父组件左方
absRight或absR {position:‘absolute‘,right:0} 设置组件为绝对定位,并定位在父组件右方
---------------- 图片样式部分 ----------------
cover {resizeMode:‘cover‘} 图片以刚好占满指定宽高的形式显示
contain {resizeMode:‘contain‘} 图片以刚好能在指定宽高内显示完整的形式显示
---------------- 文字样式部分 ----------------
textCenter或tC {textAlign:‘center‘} 文字居中对齐显示
textLeft或tL {textAlign:‘left‘} 文字靠左对齐显示
textRight或tR {textAlign:‘right‘} 文字靠右对齐显示
---------------- 宽高样式部分 ----------------
w或width {width:Dimensions.get(‘window‘).width}, 当前屏幕宽度
h或height {height:Dimensions.get(‘window‘).height} 当前屏幕高度
w100 {width:‘100%‘} 和父组件等宽
h100 {height:‘100%‘} 和父组件等高
wh100 {width:‘100%‘,height:‘100%‘} 和父组件等宽等高
wh0 {width:0,height:0} 没有尺寸的宽高样式
whAll whAll:{width:w,height:isios?h:h-25} 占满整个屏幕的宽高样式
---------------- 其他常用样式属性部分 ----------------
hidden {overflow:‘hidden‘}, 超出组件范围内容隐藏
show或visible {overflow:‘visible‘} 超出组件范围内容显示
opa0 {opacity:0}, 透明度0

多个常用样式部分,下面的样式在侵入式等级0和1下依然是s.f3(表示{flex:3})这样调用,在侵入式等级2下直接f3这样调用.

  • 一系列的flex布局部分:

s.f1到s.f12分别对应{flex:1}到{flex:12}

  • 一系列的由白到黑的灰色背景颜色,文字颜色:

s.bg000,s.bg111一直到s.bgeee,s.bgfff分别对应由黑{backgroundColor:‘#000‘}到白{backgroundColor:‘‘#fff}的灰色背景颜色

s.c000,s.c111一直到s.ceee,s.cfff则分别对应由黑{color:‘#000‘}到白{color:‘‘#fff}的灰色文字颜色

  • 一系列由屏幕宽高按比例计算出来的常用宽高的值:

以屏幕宽高375,667为例.
比如h1,w1就分别为375,667.h2,w2就分别为187.5,333.5.(这里的1,2就是对对屏幕宽高的除数,预设的值有[1,2,3,4,5,6,7,8,9,10,11,12,16,32,64,128]).

注意:这里得到的是屏幕的屏幕宽高比例算出来的数值,而非样式,使用时应该sf.sw(w12),sf.sh(h3)这样使用.

样式方法一览表(即上面的sf对象中的方法)

和上面一样,相同的方法可能会给出多个对应的键名.(为了以侵入式等级2导入使用时尽量的不与全局变量冲突,所以所有方法名(键名)前面都加有一个s)

下面的所有方法,在侵入式0和1中都是通过sf.sw(100)方式来调用,在侵入式等级2中都是直接通过方法名调用sw(100)

key(样式方法键名) 对应的样式方法的解释 对应的样式方法的使用范例(为方便以侵入式2为例)
---------------- 宽高样式方法部分 ----------------
sw或swidth 通过给定的宽度数值设置宽度 sw(100)设置宽度为100
sh或sheight 通过给定的高度数值设置高度 sh(h2)设置高度为屏幕高度的一半
swh 通过给定的宽度/高度数值同时设置宽度/高度(只给出一个时设置宽高为相同的数值) swh(100,200),设置宽100,高200;swh(100),设置宽高都为100
---------------- 边框样式方法部分 ----------------
sbw或sborderWidth 设置边框的宽度为指定的值 sbw(2),设置边框宽为2
sbc或sborderColor 设置边框颜色为指定颜色 sbc(‘#f90‘),设置边框颜色为橙色
sbr或sborderRadius 设置边框圆角为指定大小 sbr(50),设置边框大小为50
sb或sborder 统一设置边框的常用属性 sb(‘#f90‘,50,2),设置边框颜色为橙色,圆角为50,宽度为2.第三个参数宽度,默认值为1
---------------- 内间距样式方法部分 ----------------
spadT或spadTop 设置上内间距为指定数值 spadT(100),设置上内间距为100
spadB或spadBottom 设置下内间距为指定数值 和上面一样
spadV或spadVertical 设置竖直方向(上下)内间距为指定数值 和上面一样
spadL或spadLeft 设置左内间距为指定数值 和上面一样
spadR或spadRight 设置右内间距为指定数值 和上面一样
spadH或spadHorizontal 设置水平方向(左右)内间距为指定数值 和上面一样
spad或spadAll 上下左右方向的内间距一起设置,参数可以是1到4位,和css中一样,给出1位参数时表示上下左右内间距都设置为该值;2位时竖直方向内间距为第1位参数的值,水平方向内间距为第2位参数的值;3位参数时水平方向内间距为第2位参数的值,上下方向内间距分别为第1,3位参数的值;4位参数时第1,2,3,4为参数分别对应上右下左方向的内间距值 spad(10),上下左右内间距都为10;spad(10,20),竖直方向内间距10,水平方向20;spad(10,20,30),水平方向内间距20,上10,下30;spad(10,20,30,40),上右下左方向的内间距值分别为10,20,30,40
---------------- 外间距样式方法部分 ----------------
smarT或smarTop 设置组件距离上面的距离为指定的数值 smarT(100),设置组件距离上面距离为100
smarB或smarBottom 设置组件距离下面的距离为指定的数值 和上面一样
smarV或smarVertical 设置组件距离上下的距离为指定的数值 和上面一样
smarL或smarLeft 设置组件距离左面的距离为指定的数值 和上面一样
smarR或smarRight 设置组件距离右边的距离为指定的数值 和上面一样
smarH或smarHorizontal 设置组件距离左右的距离为指定的数值 和上面一样
smar或smarAll 上下左右的外间距一起设置 和spad方法一样
---------------- 绝对定位样式方法部分 ----------------
sabsT或sabsTop 设置组件为绝对定位,并距离父组件顶部指定高度 sabs(10),组件绝对定位,并距离父组件顶部距离10
sabsB或sabsBottom 设置组件为绝对定位,并距离父组件底部指定高度 同上
sabsL或sabsLeft 设置组件为绝对定位,并距离父组件左边指定宽度 同上
sabsR或sabsRight 设置组件为绝对定位,并距离父组件右边指定宽度 同上
sabsAll 设置组件为绝对定位,并占满整个父组件(没有参数时),可以给出1到4个参数分别表示距离父组件的上右下左的距离 sabs(10,15,20,25),设置该组件为绝对定位,并占满父组件后距离父组件上右下左距离分别为10,15,20,25
---------------- 相对定位样式方法部分 ----------------
srelT或srelTop 设置组件为相对定位,并距离自身原本位置向上挤出指定的距离 srelT(100),组件相对定位,并距离自身原本位置向上挤出距离100
srelB或srelBottom 设置组件为相对定位,并距离自身原本位置向下挤出指定的距离 同上
srelL或srelLeft 设置组件为相对定位,并距离自身原本位置向左挤出指定的距离 同上
srelR或srelRight 设置组件为相对定位,并距离自身原本位置向右挤出指定的距离 同上
---------------- 绝对定位或相对定位时设置上下左右的距离 ----------------
sT或sTop sT(10)
sB或sBottom
sL或sL
sR或sRight
spos或sposition 上下左右一起设置 spos({t:100,b:70,l:50,r:80}),上线左右距离分别为100,70,50,80;可以只设置其中任意多个属性spos({t:50,l:30})
---------------- 文字样式方法部分 ----------------
sc或scolor 设置文字颜色为指定颜色 sc(‘#f90‘),设置背景色为橙色
sfz或sfontSize 设置文字大小为指定大小 sfz(20),设置文字大小为20
slh或slineHeight 设置文字行高为指定高度 slh(40),设置文字行高为40
sff或sfontFamily 设置文字字体为指定字体 sff(‘PingFangSC-Light‘),设置文字字体为‘PingFangSC-Light‘
stext 统一设置文字所有常用属性,stext(大小,颜色,行高,字体,是否背景色透明(老版本文字有时会有默认背景色)) stext(20,‘#fff‘,40,‘PingFangSC-Light‘,true),设置字体大小20,颜色白色,行高40,字体PingFangSC-Light,背景色透明(老版本文字有时会有默认背景色),可以给出任一多个参数,没有给出的默认系统样式
---------------- 其他常用样式方法部分 ----------------
sop或sopacity 设置透明度为指定数值 sop(0.5),设置透明度为0.5
sbgc 设置背景色为指定的颜色 sbgc(‘#f90‘),设置背景色为橙色

拓展与进阶

样式的重用

可能大家会想到样式的重用性问题,可能一个样式会用到多个View上,这也是没有问题的.

在标准方法中的样式重用

const styles=StyleSheet.create({
    container:{
        padding:15,
        width:Dimensions.get(‘window‘).width,
        backgroundColor:‘#999‘,
        marginTop:100,
    },
})

&lt;View style={[styles.container]}&gt;&lt;/View&gt;

在插件中可以这样用

let containerStyle=[sf.spad(15),sf.sw(s.w),s.bg999,sf.smarT(100)];

&lt;View style={[containerStyle]}&gt;&lt;/View&gt;

如果多个界面都想用到这个样式的话,在侵入式等级1,2中可以直接

s.containerStyle=[sf.spad(15),sf.sw(s.w),s.bg999,sf.smarT(100)];

这样在其他所有界面就可以这样使用样式了

&lt;View style={[s.containerStyle]}&gt;&lt;/View&gt;

添加新的自定义样式

这里我只写入了一些我常用到的样式属性和样式方法,如果有一些你用到的常用的属性或方法里面没有的话也没有关系,直接向其中加入就可以了.

在导入插件后,如果需要新增样式属性可以直接

s.center={justifyContent:‘center‘,alignItems:‘center‘}

如果需要新增样式方法可以直接

sf.sw=(w)=&gt;{return {width:w}}

或者直接在插件源码中增添,修改都是可行的方法.

(↓ˉ▽ˉ↓)

如果大家觉得我的组件好用的话,帮到你的话,欢迎大家Star,Fork,如果有什么问题的话也可以在github中想我提出,谢谢大家的支持.

原文地址:http://blog.51cto.com/13997566/2294132

时间: 2024-10-27 01:55:32

react-native-pg-style使用方法(以最简单的方式编写样式代码)的相关文章

React Native的极简手册

安装入门可以参考:React Native官方文档(http://reactnative.cn/docs/0.31/tutorial.html#content). NodeJS知识储备:参考<NodeJS入门>(https://leanpub.com/nodebeginner-chinese).(尊重知识,请购买原版). 书籍:<React Native入门与实战> 代码示例:30天学习React Native教程(https://github.com/fangwei716/30-

React Native:使用 JavaScript 构建原生应用 详细剖析

数月前,Facebook 对外宣布了正在开发的 React Native 框架,这个框架允许你使用 JavaScript 开发原生的 iOS 应用——就在今天,Beta 版的仓库释出了! 基于 PhoneGap 使用 JavaScript 和 HTML5 开发 iOS 应用已经有好几年了,那 React Native 有什么牛的? React Native 真的很牛,让大家兴奋异常的主要原因有两点: 可以基于 React Native使用 JavaScript 编写应用逻辑,UI 则可以保持全是

react native 开发IOS

转载自kaich blog(http://www.kaich.xyz) 接触 react native 对于技术,我比较喜欢追新.看到报道大名鼎鼎的facebook(开源界的模范,发布了很多高质量的开源框架)开源了移动端跨平台的新框架react native,于是就迫不及待的开始接触它了.react native的目的是为了让前端开发任务能开发移动端(ios程序员相对于web端来说要少得多),于是就有了这样的框架.对于我们IOS程序员有没有必要去学它,看到它另外一个特性:跨平台,而且又一定程度的

React Native:使用 JavaScript 构建原生应用

[转载] 本篇为联合翻译,译者:寸志,范洪春,kmokidd,姜天意 数月前,Facebook 对外宣布了正在开发的 React Native 框架,这个框架允许你使用 JavaScript 开发原生的 iOS 应用--就在今天,Beta 版的仓库释出了! 基于 PhoneGap 使用 JavaScript 和 HTML5 开发 iOS 应用已经有好几年了,那 React Native 有什么牛的? React Native 真的很牛,让大家兴奋异常的主要原因有两点: 可以基于 React Na

React Native Android 应用层实战沦陷记

[工匠若水 http://blog.csdn.net/yanbober 未经允许严禁转载,请尊重作者劳动成果.私信联系我] 1 背景 一眨眼又一年快要过去了,原计划今年的最后一个小目标(React Native)看样子要留尾巴到明年了,React Native 想说爱你不容易.怎么评价你呢?应用层 JSX 编写还是很友好的,尼玛框架接入的各种锅却让人痛哭不已,万事开头难,对于 React Native 的接入可以说大量工作可能都需要投入到框架接入中(各种灰度实验的兼容性.各种锅),一旦接入稳定以

深入浅出 React Native:使用 JavaScript 构建原生应用

本篇为联合翻译,译者:寸志,范洪春,kmokidd,姜天意 数月前,Facebook 对外宣布了正在开发的 React Native 框架,这个框架允许你使用 JavaScript 开发原生的 iOS 应用--就在今天,Beta 版的仓库释出了! 基于 PhoneGap 使用 JavaScript 和 HTML5 开发 iOS 应用已经有好几年了,那 React Native 有什么牛的? React Native 真的很牛,让大家兴奋异常的主要原因有两点: 可以基于 React Native使

React Native基础&amp;入门教程:初步使用Flexbox布局

在上篇中,笔者分享了部分安装并调试React Native应用过程里的一点经验,如果还没有看过的同学请点击<React Native基础&入门教程:调试React Native应用的一小步>. 在本篇里,让我们一起来了解一下,什么是Flexbox布局,以及如何使用. 一.长度的单位 在开始任何布局之前,让我们来首先需要知道,在写React Native组件样式时,长度的不带单位的,它表示“与设备像素密度无关的逻辑像素点”. 这个怎么理解呢? 我们知道,屏幕上一个发光的最小点,对应着一个

React Native—集成到原生Android项目

目前的react-native版本是0.57.8,參考了一些文章之後,終於集成好了.React Native環境的搭建我就不説了,詳細的可以參考React Native中文網的搭建文檔. 創建新的Android工程 環境配置好之後(sdk下載可能比較慢),用Android Studio創建一個Empty Activity的項目. 集成React Native 安裝相關依賴 在項目根目錄下執行 npm init 命令,生成 package.json 文件.此時要注意一下package name和入

腾讯优测优分享 | 探索react native首屏渲染最佳实践

腾讯优测是专业的移动云测试平台,旗下的优分享不定时提供大量移动研发及测试相关的干货~此文主要与以下内容相关,希望对大家有帮助. react native给了我们使用javascript开发原生app的能力,在使用react native完成兴趣部落安卓端发现tab改造后,我们开始对由react native实现的界面进行持续优化.目标只有一个,在享受react native带来的新特性的同时,在体验上无限逼近原生实现.作为一名前端开发,本文会从前端角度,探索react native首屏渲染最佳实