在开发中,flex布局用的很是频繁,每次使用的时候都编写本身私有的flex样式会比较麻烦。固然了,由于react-native开发中样式也是一个对象,能够预设一些经常使用的flex样式, 使用的时候直接用便可。react
在开发过程当中,当我编写父容器的时候,其实我已经知道本身但愿的,里面子容器布局是怎样的,好比git
<View style={styles.flex1}>
<View>A</View>
<View>B</View>
</View>
复制代码
我但愿flex1布局下,里面的子容器沿着横轴上下左右居中,因而我会写下github
...
flex1: {
flexDirection: 'row',
justifyContent: 'center',
alignItems: 'center'
}
...
复制代码
那么问题来了,我已经很好的理解了flex中父容器各个属性的用法,我想跟着个人思路写样式名,就能出来我要的布局,不须要从新预约义相似flex1这样的样式,那不是挺好的,问题是怎么优化一下?react-native
我本身定好一个规则,若是我写下面这样bash
<View style={styles.flex_row_center_center}>
</View>
复制代码
意味着我要的是横向为主轴,主轴、侧轴居中微信
<View style={styles.flex_row_between_center}>
</View>
复制代码
意味着我要的是横向为主轴,主轴左右对其,侧轴居中布局
......flex
即 flex_方向_主轴_侧轴优化
按着这个思路,把flexDirection、justifyContent、alignItems在react-native有效的属性值列出来ui
flex-direction: ['row', 'column']
justifyContent: ['center', 'space-between', 'space-around', 'flex-start', 'flex-end', 'space-evenly']
alignItems: ['start', 'end', 'center', 'baseline', 'stretch', 'between', 'around']
复制代码
经过一个脚本生成一个相似下面这样的对象
{
flex_row_center_center: {
flexDirection: 'row',
justifyContent: 'center',
alignItems: 'center'
},
...
}
复制代码
const getFlexLayoutStyles = () => {
/*
flex_方向_主轴_侧轴
*/
// space-evenly flex容器起始边缘和第一个 flex 项之间的间距和每一个相邻 flex 项之间的间距是相等
const DIRECTIONS = ['row', 'column'],
JUSTIFY_CONTENT_PROPVALUES = ['center', 'space-between', 'space-around', 'flex-start', 'flex-end', 'space-evenly'],
JUSTIFY_CONTENT_NAMEVALUES = ['center', 'between', 'around', 'start', 'end', 'evenly'],
ALIGN_ITEMMS_PROPVALUES = ['flex-start', 'flex-end', 'center', 'baseline', 'stretch'],
ALIGN_ITEMMS_NAMEVALUES = ['start', 'end', 'center', 'baseline', 'stretch', 'between', 'around']
DIVISION = '_'
layoutStyles = {};
let styleName = 'flex'
DIRECTIONS.forEach((direction) => {
// flex_row
const nameDir = styleName + DIVISION + direction
JUSTIFY_CONTENT_PROPVALUES.forEach((jItem, jIdx) => {
// flex_row_center
const nameJust = nameDir + DIVISION + JUSTIFY_CONTENT_NAMEVALUES[jIdx]
ALIGN_ITEMMS_PROPVALUES.forEach((aItem, aIdx) => {
// flex_row_center_center
const nameAlig = nameJust + DIVISION + ALIGN_ITEMMS_NAMEVALUES[aIdx]
layoutStyles[nameAlig] = {
flexDirection: direction,
justifyContent: jItem,
alignItems: aItem
}
})
})
})
console.log('layoutStyles', layoutStyles)
return layoutStyles
}
复制代码
最后打印出来看看layoutStyles是不是咱们须要的
总共60条数据
...
{
Object.keys(getFlexLayoutStyles()).map((o, i) => (
<View style={[styles.demoBox, styles[o], {position: 'relative'} ]} key={i}>
<Text style={{ position: 'absolute', color: '#fff', left: 0, top: 0, zIndex: 20}}>{ i + 1 }. {o}</Text>
<View style={[styles.demoItemA,(o.indexOf('stretch') != -1 && o.indexOf('row') != -1) && {height: 'auto'},(o.indexOf('stretch') != -1 && o.indexOf('column') != -1) && {width: 'auto'}, (o.indexOf('baseline') != -1 && o.indexOf('row') != -1) && {height: 80}, (o.indexOf('baseline') != -1 && o.indexOf('column') != -1) && {width: 80}]}>
{o.indexOf('baseline') != -1 && (<Text style={{color: '#fff'}, o.indexOf('row') != -1 && {marginTop: 20}}>text</Text>)}
</View>
<View style={[styles.demoItemB,(o.indexOf('stretch') != -1 && o.indexOf('row') != -1) && {height: 'auto'},(o.indexOf('stretch') != -1 && o.indexOf('column') != -1) && {width: 'auto'}]}>
{o.indexOf('baseline') != -1 && (<Text style={{color: '#fff'}}>text</Text>)}
</View>
</View>
))
}
...
复制代码
其中,对于子容器的属性,能够本身根据须要添加便可,譬如,上面的代码中,stretch的状况下,判断出来,须要把子容器原来固定宽高的值,改成'auto',最后看到拉伸填充整个父容器的效果。
一眼看过去跟,space-around方式很像,仔细看,其实这个的特色是,灰色的区域三等份,开发中不少时候须要这种效果。
很像什么flex-start的效果,其实这个的特色是以'text'第一个文本为基准对其。 若是没有文本,那效果看起来跟flex-start是同样的。
上面三个栗子,父容器的布局都是flex_row_center_center, 然而对于黑色框的子容器分别设置了alignSelf
# 1
{alignSelf: 'flex-start'}
# 2
{alignSelf: 'flex-end'}
# 3
{alignSelf: 'stretch'}
复制代码
能够这样理解,alignSelf会覆盖,父容器设置的alignItems走向
理解了这一点,那纵向为主轴也是一个意思, 看下图
有5个容器,分别设为
flex: 1
flex: 2
flex: 1
flex: 2
flex: 1
复制代码
父容器会把本身分为7等份,1,3,5占1份,2,4占2份
欢迎start, 3Q~~!