【ReactNative】react-native 布局

react-native 布局


1 flex布局基本概念

flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。采用flex布局的元素,称为flex容器(flexContainer),简称"容器"。它的所有子元素自动成为容器成员,称为flex项目(flex item),简称"项目"。如下图所示:

容器默认存在两根轴:主轴(main axis)和交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。
项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。

Flex布局与Android的线性布局(LinearLayout)有点类似,都可以设置布局方向,对齐方式,以及项目的布局占位权重,区别是flex容器中项目分布的总长度超出屏幕宽度,超出的那部分项目不可见,项目不会变形,或者可以设置flexWrap属性,让容器可以分行布局,所有项目都能显示出来。

2 flex基本属性

flex属性声明在:/node_modules/React-native/Libraries/StyleSheet/LayoutPropTypes.js

// https://developer.mozilla.org/en-US/docs/Web/CSS/flex-direction
  flexDirection: ReactPropTypes.oneOf([
    'row','column'
  ]),// https://developer.mozilla.org/en-US/docs/Web/CSS/flex-wrap
  flexWrap: ReactPropTypes.oneOf([
    'wrap',68)">'nowrap'
  ]),38)">// How to align children in the main direction
  //developer.mozilla.org/en-US/docs/Web/CSS/justify-content
  justifyContent: ReactPropTypes.oneOf([
    'flex-start',68)">'flex-end',68)">'center',68)">'space-between',68)">'space-around'
  ]),136); font-weight:bold">in the cross direction
  //developer.mozilla.org/en-US/docs/Web/CSS/align-items
  alignItems: ReactPropTypes.oneOf([
    'stretch'
  ]),38)">// How to align the element alignSelf: ReactPropTypes.oneOf([
    'auto',38)">/developer.mozilla.org/en-US/docs/Web/CSS/flex
  flex: ReactPropTypes.number,

由上述代码,我们可以看到flex的属性并不多,而且很好记忆,以下将会一一介绍

flex属性可以分为容器属性和项目属性
其中容器属性包括:flexDirectionjustifyContentalignItemsflexWrap

项目属性包括:flexalignSelf

以下介绍会使用到一些代码和图片,先定义两个简单组件,方便理解

//定义一个默认半径为20,颜色为#527fe4的圆组件 var Circle = React.createClass({ render : function(){ var size = this.props.size || 20; var color = this.props.color || '#527fe4'; return <View style={{backgroundColor:color,borderRadius:size/2,height:size,width:size,margin:1}}/> },}); //定义一个放置标题和项目的容器,传入的value属性将会是需要介绍的flex属性 var Value = React.createClass({ render : function(){ var value = <View> <Text style={styles.valueText}>{this.props.title}</Text> <{[styles.valueContainer,this.props.value]}> {this.props.children} </View> </View>; return value; },}); //定义一个数组放置5个圆 var children = [<Circle/>,<Circle/>];

2.1 容器属性

  1. flexDirection:布局方向,决定主轴的方向,默认值是column,即纵向布局

    |值    |描述                 |
    |------|--------------------|
    |row   |横向布局,主轴为水平方向|
    |column|纵向布局,主轴为竖直方向|

    row:横向布局
    代码:

    <Value title='row' value={{flexDirection:'row'}}>
        {children}
    </Value>

    视图:

    column:纵向布局
    代码:

    'column' value={{flexDirection:'column'}}>
        {children}
    </Value>

    视图:

  • justifyContent:主轴方向对齐方式,默认值是flex-start,即主轴的开端

    |值           | 描述                   |
    |-------------|-----------------------|
    |flex-start   | 主轴开端                |
    |center       | 居中                   |
    |flex-end     | 主轴末端                |
    |space-between| 项目与项目之间插入相等空隙 |
    |space-around | 项目两旁插入相等空隙      |

    flex-start:主轴开端
    代码:

    <Value title='flex-start' value={{flexDirection:'flex-start'}}>
        {children}
    </Value>

    视图:

  • center:主轴的中间位置
    代码:

    'center' 'center'}}>
        {children}
    </Value>

    视图:

    flex-end:主轴的末端位置
    代码:

    'flex-end' 'flex-end'}}>
        {children}
    </Value>

    视图:

    space-between:项目与项目之间插入相同距离的空隙
    代码:

    'space-between' 'space-between'}}>
        {children}
    </Value>

    视图:

    space-around:项目两旁插入相同距离的空隙
    代码:

    'space-around' 'space-around'}}>
        {children}
    </Value>

    视图:

  • alignItems:交叉轴方向对齐方式,默认值flex-start,即交叉轴开端

    |值        | 描述      |
    |----------|----------|
    |flex-start| 交叉轴开端 |
    |center    | 交叉轴居中 |
    |flex-end  | 交叉轴末端 |

    flex-start:交叉轴开端

  • center:交叉轴的中间位置

    flex-end:交叉轴的末端位置

  • flexWrap:包含内容,默认值是nowrap,不包裹所有内容

    |值    |描述                                                     |
    |------|--------------------------------------------------------|
    |nowrap|项目沿主轴方向布局,超出容器长度的部分不可见                    |
    |wrap  |项目沿主轴布局所需长度大于容器总长度时,分行布局,所有项目内容都可见|

    nowrap:不包裹内容
    代码:

    'nowrap' value={{flexWrap:'nowrap',flexDirection:'row'}}>
          {children}{children}{children}{children}
    </Value>

    视图:

    wrap:包裹内容
    代码:

    'wrap' 'row'}}>
          {children}{children}{children}{children}
    </Value>

    视图:

  • 2.2 项目属性

    1. flex:布局权重

      |值 |描述       |
      |---|----------|
      |>=0|项目占位权重|

      1:0:flex=0的项目占用空间仅为内容所需空间,flex=1的项目会占据其余所有空间
      代码:

      '1:0' value={{flexDirection:'row'}}>
          <{{color:'white',flex:1,textAlign:'center',backgroundColor:'red',fontSize:20,paddingHorizontal:10}}>flex=1</Text>
          <backgroundColor:'yellow',paddingHorizontal:10}}>flex=0</Text>
      </Value>

      2:1
      代码:

      '2:1' value=flex:2,backgroundColor:'blue',fontSize:20}}>flex=2</backgroundColor:'green',fontSize:20}}>flex=1</Value>

      1:1:1:1
      代码:

      '1:1:1:1' value=Value>

    2. alignSelf:项目交叉轴方向自身对齐方式

      |值        |描述|
      |----------|---|
      |flex-start|开端|
      |center    |居中|
      |flex-end  |末端|

      代码:

      'alignSelf' value={{flexDirection:'row',height:30,alignItems:'center'}}>
            <{{alignSelf:'flex-start'}}>
              <Circle/>
            </View>
            <{{alignSelf:'flex-end'}}>
              <View>
      </Value>

      视图:

    3 Layout的其他属性

    layout除了flex属性之外,当然还有其他属性,同样声明在:/node_modules/react-native/Libraries/StyleSheet/LayoutPropTypes.js

    width: ReactPropTypes.number,height: ReactPropTypes.number,top: ReactPropTypes.number,left: ReactPropTypes.number,right: ReactPropTypes.number,bottom: ReactPropTypes.number,margin: ReactPropTypes.number,marginVertical: ReactPropTypes.number,marginHorizontal: ReactPropTypes.number,marginTop: ReactPropTypes.number,marginBottom: ReactPropTypes.number,marginLeft: ReactPropTypes.number,marginRight: ReactPropTypes.number,padding: ReactPropTypes.number,paddingVertical: ReactPropTypes.number,paddingHorizontal: ReactPropTypes.number,paddingTop: ReactPropTypes.number,paddingBottom: ReactPropTypes.number,paddingLeft: ReactPropTypes.number,paddingRight: ReactPropTypes.number,borderWidth: ReactPropTypes.number,borderTopWidth: ReactPropTypes.number,borderRightWidth: ReactPropTypes.number,borderBottomWidth: ReactPropTypes.number,borderLeftWidth: ReactPropTypes.number, position: ReactPropTypes.oneOf([ 'absolute',68)">'relative' ]),

    |属性 |类型 |描述 | |---------------------|------|-----------------------------------| |width |number|容器或者项目的宽度 | |height |number|容器或者项目的高度 | |top,bottom,left,right|number|在父容器的上下左右偏移量 | |margin |number|留边,留边的空间不属于容器或者项目自身空间| |marginHorizontal |number|水平方向留边 | |marginVertical |number|垂直方向留边 | |padding |number|填充,填充的空间输入容器或者项目自身空间 | |paddingHorizontal |number|水平方向填充 | |paddingVertical |number|垂直方向填充 | |borderWidth |number|边界宽度 | |position |enum |位置方式:absolute与relative |

    position:默认值为relative

    |值 |描述 | |--------|------| |absolute|绝对布局| |relative|相对布局|

    react的默认位置方式是relative,项目是一个接一个排列下去的,absolute为绝对布局,一般会与left和top属性一起使用。有时候我们需要实现某些项目重叠起来,absolute属性就能发挥作用了,例如下图:

    react的基本组件暂时不支持以图片作为背景,所以这里的的转入是一个文本组件,而红色的圆形是一个图片组件,在iOS里面组件也可以作为容器,图片可以正常显示,但是在Android里面,可能存在些问题,如果使用组件作为容器都会出现图片变得好奇怪,所以就可以absoulte来解决问题了。代码如下:

    <View style={{width:80,height:'center'}}> <Image style={{position:'absolute',left:0,top:0,resizeMode:'contain',width:80,height:80}} source={require('image!finance_usercenter_ic_into')}/> <{{width:80,textAlign:'center',color:'white',fontSize:16}}>转入</Text> </View>

    这里的View跟Android的View有点不一样,View是可以作为容器也可以作为项目,View作为容器还有其他很多属性,例如backgroundColor,borderWidth,borderColor,opacity等等,这里不一一介绍。

    4 布局的尺寸说明

    React Native的宽高是不需要带单位的,那些widthheightpaddingmargin的赋值都直接是数字的,当你设定width:10,在IOS的话就是设置了10pt宽度,而在Android上面是10dp,在做项目时,辛勤的美工会帮我们标出所有UI控件的宽,高,边距等等,他们用的单位也是dp,所以赋值style中宽高时,直接填入数字即可。


    alignItems 和alignSelf区别


    alignItems

    调整伸缩项目在侧轴上的定位方式

    可选值:flex-start,flex-end,249)">center,249)">stretch

    alignSelf

    alignSelf属性会覆盖容器的alignItems属性,取值和用法alignItems一样。

    auto,249)">stretch




    原文链接:http://139.196.14.76/t/react-native-flex/181/1

    参考文章:http://www.jb51.cc/article/p-fgftethr-a.html

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

    相关推荐


    react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
    我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
    我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
    react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
    mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
    我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
    本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
    上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
    上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
    我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
    在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
    楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
    我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
    前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
    我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
    上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
    开源不易,感谢你的支持,❤ star me if you like concent ^_^
    hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
    本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
    ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom