2015-10-30 24 views
19

Wie kann ich minimale Breite oder Höhe für React Native Komponente einstellen?Minimale Breite/Höhe in React Native

In CSS kann ich min-width/min-height verwenden

https://facebook.github.io/react-native/docs/flexbox.html#content

Es gibt keine minWidth/minHeight auf reagieren-native docs

+0

Was ist Ihr Anwendungsfall für min-Breite und min-Höhe?Vielleicht können Sie Breite/Höhe dynamisch festlegen, so dass es nie unter dem Ziel Minimum –

+1

Ich möchte min-width für Schaltfläche festlegen, ich möchte eine Schaltfläche mit einer minimalen Breite sogar sein Text ist sehr kurz –

Antwort

40

minHeight, maxHeight, minWidth und maxWidth Eigenschaften werden als von reagieren-native Version unterstützt 0.29.0 für iOS und Android.

+0

unterstützt, außer dass nur Pixelwerte akzeptiert werden. Jeez, es ist als ob wir uns rückwärts bewegen ... – AlxVallejo

0

Sie können so etwas tun:

_getButtonStyle() { 
    var style = {height:36,padding:8} 

    if(this.props.buttonText.length < 4){ 
    style.width = 64 
    } 
    return style 
} 
0

Ich war in der Lage, die Lösung für Sie zu erarbeiten. Hier ist eine funktionierende Demo ... https://rnplay.org/apps/vaD1iA

Und hier sind die wichtigsten Teile.

Zuerst ziehen Sie in den Geräteabmessungen ...

var Dimensions = require('Dimensions'); 
var { 
    width, 
    height 
} = Dimensions.get('window'); 

Hier ist die Button-Komponente, die für die Schaltfläche mit

const Button = React.createClass({ 
    render(){ 
    return(
     <TouchableHighlight> 
     <Text style={[styles.button,{width: width - 20}]}> 
      {this.props.children} 
     </Text> 
     </TouchableHighlight> 
    ) 
    } 
}); 

Dann wird, wie Sie die Gerätebreite als Basis verwendet Hier sehen Sie, dass die Tastenbreite unabhängig von der Breite des Etiketteninhalts gleich ist.

enter image description here

+0

Es gibt ein Github Problem auf diesem . Hier ist ein Link für den neuesten Status (Spoiler-Alarm: Es wurde für jetzt zurückgezogen) https://github.com/facebook/react-native/pull/4183#issuecomment-158862314 –

0

Ich löste dies durch die onLayout Stütze verwendet wird, ist es sehr einfach:

Beispiel:

Schritt 1: Ich habe eine Stütze in unserem Staat zu schaffen, der die aktuelle Höhe halten wird des BildescurImgHeight genannt.

constructor(){ 
    super(props); 
    this.state={curImgHeight:0} 
} 

Schritt 2: Mit der in jedem prop View oder Element, die die onLayout prop unterstützt.

Hier verwende ich es mit einem Image. Dann müssen wir diese Zustandseigenschaft nur dann ändern, wenn die tatsächliche Bildhöhe kleiner als unsere Mindesthöhe ist.

render(){ 
    <Image 
    source={{uri: "https://placehold.it/350x150"}} 
    resizeMode='cover' 

    style={[styles.image, {height:(this.state.curImgHeight<=0?null:this.state.curImgHeight)}]} 

    onLayout={(e)=>{ 
     let {height} = e.nativeEvent.layout; 
     let minimumImgHeight = 400; //We set the minimum height we want here. 
     if(height<= minimumImgHeight){ //Whenever the real height of the image is less than the minimum height 
     this.setState({curImgHeight:minimumImgHeight}); //just change the curImgHeight state property to the minimum height. 
     } 
    }} 
    /> 
} 

Das ist, wie ich es für mich gelöst habe.

ps.s: Während meiner Suche habe ich festgestellt, dass die Reaktion native inoffiziell unterstützt minHeight und maxHeight aber nur für iOS und nicht für Android. Ich würde es jedoch nicht wagen, sie zu benutzen. Der obige Code funktioniert gut und gibt mir Kontrolle.

+0

Diese Lösung flackern seit SetState ist async – ptomasroos

+0

@ptomasroos Sie kann es mit den async/await Anweisungen wie folgt synchronisieren: https://gist.github.com/SudoPlz/c8b90988d02eaaf82d4da8fc407ba6a9 – SudoPlz

+0

Danke. Guter Aufruf, aber da setState nicht reflektiert wird, flackert dies wie beim Rendering. Da ein Aufruf von setState wirklich asynchron ist, werden die sichtbaren – ptomasroos

0

Sie können minHeight oder flexBasis verwenden - es ist ähnlich.