react-native-pg-style使用方法(以最简单的方式编写样式代码,抛弃react-native标准的样式创建方式)

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要同时具有上面举例的这些样式属性的时候就只需要这样<View style={[s.center,s.w,sf.swh(100,200),sf.spad(10,20,30,40)]}></View>

如果不喜欢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,
    },
})

<View style={[styles.container]}></View>

在插件中可以这样用

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

<View style={[containerStyle]}></View>

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

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

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

<View style={[s.containerStyle]}></View>

添加新的自定义样式

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

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

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

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

sf.sw=(w)=>{return {width:w}}

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

(↓ˉ▽ˉ↓)

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

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

推荐阅读更多精彩内容