美文网首页ReactNative系列ReactNative
ReactNative中使用cls属性

ReactNative中使用cls属性

作者: 水山一村 | 来源:发表于2017-02-20 17:39 被阅读26次

    对ReactNative样式的封装,跟style属性可以同时使用

    Paste_Image.png

    直接上代码。

    目录结构
    Paste_Image.png
    首先是Gstyle文件夹。该文件夹下面封装了部分常用样式。
    _borders.js
    const borderColor = '#D9D9D9'
    const borderStyle = 'solid'
    const borderRadius = 5
    
    export default {
      b0: { borderWidth: 0 },
      bh: { borderWidth: 0.5, borderColor, borderStyle },
      b1: { borderWidth: 1, borderColor, borderStyle },
    
      bt0: { borderTopWidth: 0 },
      bth: { borderTopWidth: 0.5, borderColor, borderStyle },
      bt1: { borderTopWidth: 1, borderColor, borderStyle },
    
      br0: { borderRightWidth: 0 },
      brh: { borderRightWidth: 0.5, borderColor, borderStyle },
      br1: { borderRightWidth: 1, borderColor, borderStyle },
    
      bb0: { borderBottomWidth: 0 },
      bbh: { borderBottomWidth: 0.5, borderColor, borderStyle },
      bb1: { borderBottomWidth: 1, borderColor, borderStyle },
    
      bl0: { borderLeftWidth: 0 },
      blh: { borderLeftWidth: 0.5, borderColor, borderStyle },
      bl1: { borderLeftWidth: 1, borderColor, borderStyle },
    
      rounded: { borderRadius },
      notRounded: { borderRadius: 0 },
      circle: { borderRadius: 50 }
    }
    
    _colors.js
    const $primary = '#337ab7'  //蓝
    const $success = '#5cb85c' // 绿 
    const $info = '#5bc0de' //淡蓝
    const $warning = '#f0ad4e' //橘色
    const $danger = '#d9534f' //红色
    
    const $white = '#fff' //白色
    const $silver = '#F4F4F4' //灰  1
    const $lightgrey = '#ececec'  //灰2
    const $grey = '#ccc' //灰3
    const $midgrey = '#777' //灰4
    const $darkgrey = '#444' //灰5
    const $black = '#222'//黑色
    const $trueblack = '#000' //黑色
    
    export default {
      // ====================================================
      //  Text Colors
      // ====================================================
    
      colorPrimary: { color: $primary },
      colorSuccess: { color: $success },
      colorInfo: { color: $info },
      colorWarning: { color: $warning },
      colorDanger: { color: $danger },
    
      textPrimary: { color: $primary },
      textSuccess: { color: $success },
      textInfo: { color: $info },
      textWarning: { color: $warning },
      textDanger: { color: $danger },
    
      colorWhite: { color: $white },
      colorSilver: { color: $silver },
      colorLightgrey: { color: $lightgrey },
      colorGrey: { color: $grey },
      colorMidgrey: { color: $midgrey },
      colorDarkgrey: { color: $darkgrey },
      colorBlack: { color: $black },
      colorTrueblack: { color: $trueblack },
      colorInherit: { color: 'inherit' },
      colorTransparent: { color: 'transparent' },
    
      textWhite: { color: $white },
      textSilver: { color: $silver },
      textLightgrey: { color: $lightgrey },
      textGrey: { color: $grey },
      textMidgrey: { color: $midgrey },
      textDarkgrey: { color: $darkgrey },
      textBlack: { color: $black },
      textTrueblack: { color: $trueblack },
      textInherit: { color: 'inherit' },
      textTransparent: { color: 'transparent' },
    
      c0: { color: '#000' },
      c1: { color: '#111' },
      c2: { color: '#222' },
      c3: { color: '#333' },
      c4: { color: '#444' },
      c5: { color: '#555' },
      c6: { color: '#666' },
      c7: { color: '#777' },
      c8: { color: '#888' },
      c9: { color: '#999' },
      ca: { color: '#aaa' },
      cb: { color: '#bbb' },
      cc: { color: '#ccc' },
      cd: { color: '#ddd' },
      ce: { color: '#eee' },
      cf: { color: '#fff' },
    
      // ====================================================
      //  Background Colors
      // ====================================================
    
      bgPrimary: { backgroundColor: $primary },
      bgSuccess: { backgroundColor: $success },
      bgInfo: { backgroundColor: $info },
      bgWarning: { backgroundColor: $warning },
      bgDanger: { backgroundColor: $danger },
    
      bgWhite: { backgroundColor: $white },
      bgSilver: { backgroundColor: $silver },
      bgLightgrey: { backgroundColor: $lightgrey },
      bgGrey: { backgroundColor: $grey },
      bgMidgrey: { backgroundColor: $midgrey },
      bgDarkgrey: { backgroundColor: $darkgrey },
      bgBlack: { backgroundColor: $black },
      bgTrueblack: { backgroundColor: $trueblack },
      bgTransparent: { backgroundColor: 'transparent' },
    
      // ====================================================
      //  Border Colors
      // ====================================================
    
      borderPrimary: { borderColor: $primary },
      borderSuccess: { borderColor: $success },
      borderInfo: { borderColor: $info },
      borderWarning: { borderColor: $warning },
      borderDanger: { borderColor: $danger },
    
      borderWhite: { borderColor: $white },
      borderSilver: { borderColor: $silver },
      borderLightgrey: { borderColor: $lightgrey },
      borderGrey: { borderColor: $grey },
      borderMidgrey: { borderColor: $midgrey },
      borderDarkgrey: { borderColor: $darkgrey },
      borderBlack: { borderColor: $black },
      borderTrueblack: { borderColor: $trueblack },
      borderTransparent: { borderColor: 'transparent' },
    }
    
    _flex.js
    export default {
      // ====================================================
      //  方向
      // ====================================================
    
      column: { flexDirection: 'column', flexWrap: 'nowrap' },//列 主轴为垂直方向
      row: { flexDirection: 'row', flexWrap: 'wrap' },//行  主轴为水平方向
    
      // ====================================================
      // Positioning for Flex Items  //父View下所有View排列方式
      // ====================================================
    
      center: { alignItems: 'center', justifyContent: 'center' },//水平居中
      topLeft: { alignItems: 'flex-start', justifyContent: 'flex-start' },//左上
      bottomLeft: { alignItems: 'flex-start', justifyContent: 'flex-end' },//左下
      topRight: { alignItems: 'flex-end', justifyContent: 'flex-start' },//右上
      bottomRight: { alignItems: 'flex-end', justifyContent: 'flex-end' },//右下
      stretch:{alignItems:'stretch'},
      //列 
      columnTopCenter: { alignItems: 'center', justifyContent: 'flex-start' },//列剧中
      columnTopRight: { alignItems: 'flex-end', justifyContent: 'flex-start' },//列居右
      columnCenterLeft: { alignItems: 'flex-start', justifyContent: 'center' },//垂直居中列居左
      columnCenterRight: { alignItems: 'flex-end', justifyContent: 'center' },//垂直居中列居右
      columnBottomLeft: { alignItems: 'flex-start', justifyContent: 'flex-end' },//底部列居左
      columnBottomCenter: { alignItems: 'center', justifyContent: 'flex-end' },//底部列居右
      //行 注:需要把 flexDirection:row
      rowTopCenter: { alignItems: 'flex-start', justifyContent: 'center' },//行居中
      rowTopRight: { alignItems: 'flex-start', justifyContent: 'flex-end' },//行居右
      rowCenterLeft: { alignItems: 'center', justifyContent: 'flex-start' },//垂直居中行居左
      rowCenterRight: { alignItems: 'center', justifyContent: 'flex-end' },//垂直居中行居右
      rowBottomLeft: { alignItems: 'flex-end', justifyContent: 'flex-start' },//底部行居左
      rowBottomCenter: { alignItems: 'flex-end', justifyContent: 'center' },//底部行居右
    
      // ====================================================
      // Flex Item Alignment   
      // ====================================================
    
      spaceAround: { justifyContent: 'space-around' },  //  |--口--口--|//效果
      spaceBetween: { justifyContent: 'space-between' },//  |口------口|//效果
    
    
      alignStart: { alignSelf: 'flex-start'},//起始位置
      alignCenter: { alignSelf: 'center' },//结束
      alignEnd: { alignSelf: 'flex-end' },//结束位置
      alignStretch: { alignSelf: 'stretch' },
    
    
    
      absoluteFill:  {position: 'absolute',top: 0,left: 0,right: 0,bottom: 0},
      absoluteTop:   {position: 'absolute',top: 0,left: 0,right: 0},
      absoluteLeft:  {position: 'absolute',top: 0,left: 0,bottom: 0},
      absoluteRight: {position: 'absolute',top: 0,right: 0, bottom: 0},
      absoluteBottom:{position: 'absolute',left: 0,right: 0, bottom: 0},
    
    }
    
    _typography.js
    export default {
      // ====================================================
      //  方向
      // ====================================================
    
      column: { flexDirection: 'column', flexWrap: 'nowrap' },//列 主轴为垂直方向
      row: { flexDirection: 'row', flexWrap: 'wrap' },//行  主轴为水平方向
    
      // ====================================================
      // Positioning for Flex Items  //父View下所有View排列方式
      // ====================================================
    
      center: { alignItems: 'center', justifyContent: 'center' },//水平居中
      topLeft: { alignItems: 'flex-start', justifyContent: 'flex-start' },//左上
      bottomLeft: { alignItems: 'flex-start', justifyContent: 'flex-end' },//左下
      topRight: { alignItems: 'flex-end', justifyContent: 'flex-start' },//右上
      bottomRight: { alignItems: 'flex-end', justifyContent: 'flex-end' },//右下
      stretch:{alignItems:'stretch'},
      //列 
      columnTopCenter: { alignItems: 'center', justifyContent: 'flex-start' },//列剧中
      columnTopRight: { alignItems: 'flex-end', justifyContent: 'flex-start' },//列居右
      columnCenterLeft: { alignItems: 'flex-start', justifyContent: 'center' },//垂直居中列居左
      columnCenterRight: { alignItems: 'flex-end', justifyContent: 'center' },//垂直居中列居右
      columnBottomLeft: { alignItems: 'flex-start', justifyContent: 'flex-end' },//底部列居左
      columnBottomCenter: { alignItems: 'center', justifyContent: 'flex-end' },//底部列居右
      //行 注:需要把 flexDirection:row
      rowTopCenter: { alignItems: 'flex-start', justifyContent: 'center' },//行居中
      rowTopRight: { alignItems: 'flex-start', justifyContent: 'flex-end' },//行居右
      rowCenterLeft: { alignItems: 'center', justifyContent: 'flex-start' },//垂直居中行居左
      rowCenterRight: { alignItems: 'center', justifyContent: 'flex-end' },//垂直居中行居右
      rowBottomLeft: { alignItems: 'flex-end', justifyContent: 'flex-start' },//底部行居左
      rowBottomCenter: { alignItems: 'flex-end', justifyContent: 'center' },//底部行居右
    
      // ====================================================
      // Flex Item Alignment   
      // ====================================================
    
      spaceAround: { justifyContent: 'space-around' },  //  |--口--口--|//效果
      spaceBetween: { justifyContent: 'space-between' },//  |口------口|//效果
    
    
      alignStart: { alignSelf: 'flex-start'},//起始位置
      alignCenter: { alignSelf: 'center' },//结束
      alignEnd: { alignSelf: 'flex-end' },//结束位置
      alignStretch: { alignSelf: 'stretch' },
    
    
    
      absoluteFill:  {position: 'absolute',top: 0,left: 0,right: 0,bottom: 0},
      absoluteTop:   {position: 'absolute',top: 0,left: 0,right: 0},
      absoluteLeft:  {position: 'absolute',top: 0,left: 0,bottom: 0},
      absoluteRight: {position: 'absolute',top: 0,right: 0, bottom: 0},
      absoluteBottom:{position: 'absolute',left: 0,right: 0, bottom: 0},
      // ====================================================
      //  Flex Sizing
      // ====================================================
    
      flex1: { flex: 1 },
      flex2: { flex: 2 },
      flex3: { flex: 3 },
      flex4: { flex: 4 },
      flex5: { flex: 5 },
      flex6: { flex: 6 },
      flex7: { flex: 7 },
      flex8: { flex: 8 },
      flex9: { flex: 9 },
    }
    
    _utilites.js
    export default {
      // overflow
      overflowHidden: { overflow: 'hidden' },
      overflowVisible: { overflow: 'visible' },
    
      // position
      relative: { position: 'relative' },
      absolute: { position: 'absolute' },
    
      top: { top: 0 },
      right: { right: 0 },
      bottom: { bottom: 0 },
      left: { left: 0 },
    
      // image
      imgCover: { resizeMode: 'cover' },
      imgContain: { resizeMode: 'contain' },
      imgStretch: { resizeMode: 'stretch' },
    }
    
    
    _whitespace.js
    const $padding = 10
    const $margin = 10
    
    export default {
      // ====================================================
      //  Padding
      // ====================================================
    
      // All
      p5: { padding: $padding * 0.5 },
      p10: { padding: $padding },
      p15: { padding: $padding * 1.5 },
      p20: { padding: $padding * 2 },
      p30: { padding: $padding * 3 },
      p40: { padding: $padding * 4 },
      p50: { padding: $padding * 5 },
    
      // Top
      pt5: { paddingTop: $padding * 0.5 },
      pt10: { paddingTop: $padding },
      pt15: { paddingTop: $padding * 1.5 },
      pt20: { paddingTop: $padding * 2 },
      pt30: { paddingTop: $padding * 3 },
      pt40: { paddingTop: $padding * 4 },
      pt50: { paddingTop: $padding * 5 },
    
      // Right
      pr5: { paddingRight: $padding * 0.5 },
      pr10: { paddingRight: $padding },
      pr15: { paddingRight: $padding * 1.5 },
      pr20: { paddingRight: $padding * 2 },
      pr30: { paddingRight: $padding * 3 },
      pr40: { paddingRight: $padding * 4 },
      pr50: { paddingRight: $padding * 5 },
    
      // Bottom
      pb5: { paddingBottom: $padding * 0.5 },
      pb10: { paddingBottom: $padding },
      pb15: { paddingBottom: $padding * 1.5 },
      pb20: { paddingBottom: $padding * 2 },
      pb30: { paddingBottom: $padding * 3 },
      pb40: { paddingBottom: $padding * 4 },
      pb50: { paddingBottom: $padding * 5 },
    
      // Left
      pl5: { paddingLeft: $padding * 0.5 },
      pl10: { paddingLeft: $padding },
      pl15: { paddingLeft: $padding * 1.5 },
      pl20: { paddingLeft: $padding * 2 },
      pl30: { paddingLeft: $padding * 3 },
      pl40: { paddingLeft: $padding * 4 },
      pl50: { paddingLeft: $padding * 5 },
    
      // Top-Bottom
      ptb5: { paddingTop: $padding * 0.5, paddingBottom: $padding * 0.5 },
      ptb10: { paddingTop: $padding, paddingBottom: $padding },
      ptb15: { paddingTop: $padding * 1.5, paddingBottom: $padding * 1.5 },
      ptb20: { paddingTop: $padding * 2, paddingBottom: $padding * 2 },
      ptb30: { paddingTop: $padding * 3, paddingBottom: $padding * 3 },
      ptb40: { paddingTop: $padding * 4, paddingBottom: $padding * 4 },
      ptb50: { paddingTop: $padding * 5, paddingBottom: $padding * 5 },
    
      // Left-Right
      plr5: { paddingLeft: $padding * 0.5, paddingRight: $padding * 0.5 },
      plr10: { paddingLeft: $padding, paddingRight: $padding },
      plr15: { paddingLeft: $padding * 1.5, paddingRight: $padding * 1.5 },
      plr20: { paddingLeft: $padding * 2, paddingRight: $padding * 2 },
      plr30: { paddingLeft: $padding * 3, paddingRight: $padding * 3 },
      plr40: { paddingLeft: $padding * 4, paddingRight: $padding * 4 },
      plr50: { paddingLeft: $padding * 5, paddingRight: $padding * 5 },
    
      // ====================================================
      //  Margins
      // ====================================================
      // All
      m5: { margin: $margin * 0.5 },
      m10: { margin: $margin },
      m15: { margin: $margin * 1.5 },
      m20: { margin: $margin * 2 },
      m30: { margin: $margin * 3 },
      m40: { margin: $margin * 4 },
      m50: { margin: $margin * 5 },
    
      // Top
      mt5: { marginTop: $margin * 0.5 },
      mt10: { marginTop: $margin },
      mt15: { marginTop: $margin * 1.5 },
      mt20: { marginTop: $margin * 2 },
      mt30: { marginTop: $margin * 3 },
      mt40: { marginTop: $margin * 4 },
      mt50: { marginTop: $margin * 5 },
    
      // Right
      mr5: { marginRight: $margin * 0.5 },
      mr10: { marginRight: $margin },
      mr15: { marginRight: $margin * 1.5 },
      mr20: { marginRight: $margin * 2 },
      mr30: { marginRight: $margin * 3 },
      mr40: { marginRight: $margin * 4 },
      mr50: { marginRight: $margin * 5 },
    
      // Bottom
      mb5: { marginBottom: $margin * 0.5 },
      mb10: { marginBottom: $margin },
      mb15: { marginBottom: $margin * 1.5 },
      mb20: { marginBottom: $margin * 2 },
      mb30: { marginBottom: $margin * 3 },
      mb40: { marginBottom: $margin * 4 },
      mb50: { marginBottom: $margin * 5 },
    
      // Left
      ml5: { marginLeft: $margin * 0.5 },
      ml10: { marginLeft: $margin },
      ml15: { marginLeft: $margin * 1.5 },
      ml20: { marginLeft: $margin * 2 },
      ml30: { marginLeft: $margin * 3 },
      ml40: { marginLeft: $margin * 4 },
      ml50: { marginLeft: $margin * 5 },
    
      // Top/Bottom
      mtb5: { marginTop: $margin * 0.5, marginBottom: $margin * 0.5 },
      mtb10: { marginTop: $margin, marginBottom: $margin },
      mtb15: { marginTop: $margin * 1.5, marginBottom: $margin * 1.5 },
      mtb20: { marginTop: $margin * 2, marginBottom: $margin * 2 },
      mtb30: { marginTop: $margin * 3, marginBottom: $margin * 3 },
      mtb40: { marginTop: $margin * 4, marginBottom: $margin * 4 },
      mtb50: { marginTop: $margin * 5, marginBottom: $margin * 5 },
    
      // Left/Right
      mlr5: { marginLeft: $margin * 0.5, marginRight: $margin * 0.5 },
      mlr10: { marginLeft: $margin, marginRight: $margin },
      mlr15: { marginLeft: $margin * 1.5, marginRight: $margin * 1.5 },
      mlr20: { marginLeft: $margin * 2, marginRight: $margin * 2 },
      mlr30: { marginLeft: $margin * 3, marginRight: $margin * 3 },
      mlr40: { marginLeft: $margin * 4, marginRight: $margin * 4 },
      mlr50: { marginLeft: $margin * 5, marginRight: $margin * 5 },
    }
    
    index.js
    import _borders from './_borders'
    import _colors from './_colors'
    import _flex from './_flex'
    import _typography from './_typography'
    import _whitespace from './_whitespace'
    import _utilities from './_utilities'
    
    export default Object.assign({}, _borders, _colors, _flex, _typography, _whitespace, _utilities)
    

    以上就是Gstlye里面封装的常用样式,可根据自身需要增加。

    使用cls属性的主要代码(代码参考https://github.com/tachyons-css/react-native-style-tachyons)

    import React from "react";
    import _ from "lodash";
    import Gstyle  from "./Gstyle/index.js";
    // import cssColors from "css-color-names"
    
    export function wrap(WrappedComponent) {
        const newClass = class extends WrappedComponent {
            render() {
                return this._recursiveStyle(super.render());
            }
    
            _recursiveStyle(elementsTree) {
                const props = elementsTree.props;
                let newProps;
                let translated = false;
    
                /* Parse cls string */
                if (_.isString(props.cls)) {
                    newProps = {}
                    translated = true
                    if (_.isArray(props.style)) {
                        newProps.style = props.style.slice()
    
                    } else if (_.isObject(props.style)) {
                        newProps.style = [props.style]
    
                    } else {
                        newProps.style = []
                    }
    
                    const splitted = props.cls.replace(/-/g, "_").split(" ")
                    for (let i = 0; i < splitted.length; i++) {
                        const cls = splitted[i];
                        if (cls.length > 0) {
                            const style = Gstyle[cls];
                            if (style) {
                                /* Style found */
                                newProps.style.push(style);
    
                            }
                          else {
                                throw new Error(`style '${cls}' not found`);
                            }
    
                        }
                    }
                }
    
                let newChildren = props.children;
                if (_.isArray(newChildren)) {
    
                    /* Convert child array */
                    newChildren = React.Children.toArray(newChildren);
                    for (let i = 0; i < newChildren.length; i++) {
                        const c = newChildren[i]; 
                        if (React.isValidElement(c)) {
                            const converted = this._recursiveStyle(c);
                            if (converted !== c) {
                                translated = true;
                                newChildren[i] = converted;
                            }
                        }
                    }
    
                } else if (React.isValidElement(newChildren)) {
    
                    /* Convert single child */
                    const converted = this._recursiveStyle(newChildren);
                    if (converted !== newChildren) {
                        translated = true;
                        newChildren = converted;
                    }
                }
    
                if (translated) {
                    return React.cloneElement(elementsTree, newProps, newChildren)
                }
    
                return elementsTree;
            }
        }
    
        /* Fix name */
        newClass.displayName = WrappedComponent.displayName || WrappedComponent.name
    
        return newClass;
    }
    
    

    index.js

    
    import * as reactWrapper from "./reactWrapper";
    const NativeTachyons = {
        wrap: reactWrapper.wrap,
    }
    export default NativeTachyons;
    export const wrap = reactWrapper.wrap;
    

    使用说明

    1 Gstyle文件夹
    //该文件下下面包含了六种封装的样式(暂定,以后根据需求再进行补充),分别是
    // a.  _borders.js 主要封装了边框的颜色和样式以及弧度
    // b.  _colors.js  封装了常用的颜色以及背景颜色
    // c.  _flex.js    封装了常用的布局样式(flex)
    // d.  _typography 封装了字体的样式(大小,行高,斜体粗体等)
    // e.  _utillities 其他样式封装
    // f.  _whitespace 内边距,外边距的封装
    
    2 使用方法
    // A. Gstyle的使用
    import S from './GStyle/Gstyle/index';
    <View style={[styles.first,S.alignStretch]}></View>
    //注: 使用方法跟原来一样。
    
    //B. cls属性的使用
      import NativeTachyons from "./GStyle/index.js"
        class MyComponent extends Component{
            <View cls="bgGrey bottomRight" style={{height:600}} >
            ......  
            </View>
        }
        const myComponent =NativeTachyons.wrap(MyComponent);
       AppRegistry.registerComponent('MyComponent', () => myComponent);
      //注:多个属性用空格分开。
    

    相关文章

      网友评论

        本文标题:ReactNative中使用cls属性

        本文链接:https://www.haomeiwen.com/subject/hluewttx.html