在React-native中无法更改自定义组件的宽度和高度?

时间:2017-11-18 02:12:24

标签: react-native flexbox components react-native-flexbox

我有一个像这样的最小自定义无状态组件:

const ViewBox = (props) => (
    <View style={ mainStyle : {backgroundColor: 'beige'} }>
        {props.children}
    </View>
)
export default ViewBox;

所以我想在另一个组件中导入并使用它。

export default class Test extends React.Component {

render() {
    return (
        <View style={styles.containerView} >
            <ViewBox style={styles.mainBox}>
              <Text style={[styles.boxTitle, {color: '#8F468C'}]}>Lorem ipsum...</Text>
            </ViewBox>
        </View>
    );
    }
}

const styles = {    
  containerView: {
    flex: 1,
    marginTop: 50,
    alignItems: 'center',
    backgroundColor: 'brown',
  },
  mainBox: {
    flex: 1,
    width: 250,  //No effect ! ! !
    height: 250  //No effect ! ! !
  },
  boxTitle: {
    backgroundColor: 'pink',
    fontSize: 17,
    marginTop: 20
  }
};

这里我们至少有两个莫名其妙的事实:
1)更重要的是ViewBox(或你想在这里使用的每个自定义组件)的宽度和高度完全失控!分配数字大小或Flex值无效,ViewBox保持渲染内部文本所需的最小宽度/高度。

enter image description here

2)删除根视图(因此ViewBox成为根)ViewBox继续忽略任何大小,但现在它填充了所有可用空间....为什么???

enter image description here

所有提到的行为都是使用自定义视图(在本例中为ViewBox),而是用普通视图替换它所有按预期工作。
我想知道React-native有足够的flex和UI最佳实践,但这两个案例并没有得到文档的充分报道。希望有人能给我一个惊喜!

1 个答案:

答案 0 :(得分:1)

这实际上是flexbox的工作原理:

  1. 默认情况下,Flex容器附带flexShrink: 1,这意味着它们将收缩到其内容。添加flexShrink: 0更改了。您可能需要使用minWidthminHeight代替。

  2. 它伸展的原因是因为没有什么可以告诉它的。您的容器默认alignItems: 'stretch'alignItems: 'center'覆盖,缩小了其内容。

  3. 查看Snack上的示例代码:https://snack.expo.io/B1VdUma1M

    这是一个非常好的flexbox cheatsheet / playground,可以显示以下行为:https://yoksel.github.io/flex-cheatsheet/

    请记住React Native's implementation is slightly different