React-native view auto width by text inside

Posted

技术标签:

【中文标题】React-native view auto width by text inside【英文标题】: 【发布时间】:2016-11-09 01:58:52 【问题描述】:

据我所知,react-native 样式表不支持 min-width/max-width 属性。

我在里面有一个视图和文本。自动宽度的视图不会通过继承文本元素来调整大小。

如何解决该问题并使用文本宽度自动设置视图宽度?

我的代码是:

 <View style=backgroundColor: '#000000'>
      <Text style=color: '#ffffff'>Sample text here</Text>
 </View>

在常见的 html/CSS 中,我会意识到:

 <div style="background-color: #000; display: inline;">Sample text here</div>

注意:父视图上的 flex: 1 对我没有帮助。 文本显示为

"Sam"
"ple"
"Tex"
"t"

【问题讨论】:

【参考方案1】:

"alignSelf" 与 'display: inline-block' 在常见的 HTML/CSS 中的作用相同,它对我来说效果很好。

<View style=backgroundColor: '#000000', alignSelf: 'flex-start' >
 <Text style=color: '#ffffff'>
  Sample text here
 </Text>
</View>

【讨论】:

天才,谢谢。 Text 上的第二个alignSelf: 'flex-start' 本身是否必要? @JoshuaPinter 我确认 -- alignSelf: 'flex-start' 不需要 Text @SanketSahu 感谢您更新答案。我重新阅读了我的评论,就像“第二个alignSelf?” 绝对是的!我建议也使用“minHeight”属性! 想知道为什么视图占据了整个宽度。这解决了它!【参考方案2】:

两种解决方案

文本组件适合文本内容

https://facebook.github.io/react-native/docs/text.html#containers

您可以将&lt;Text&gt; 组件包装到另一个&lt;Text&gt; 组件中。

通过这样做里面的一切都不再使用 flexbox 布局,而是使用文本布局

<Text>
   <Text>'Your text here'</Text>
</Text>

视图容器适应嵌套的Text组件的内容

在这种情况下,您需要使用道具 alignSelf 才能看到容器缩小到其内容的大小。

<View>
  <View style= alignSelf: 'center', padding: 12 >
     <Text>'Your text here'</Text>
  </View>
</View>

【讨论】:

在与 flexbox 苦苦挣扎数小时后,这个简单的技巧为我解决了一切问题。 第二个选项效果很好,但只有将 style= flex:0 应用于有文本的视图,才能工作! (它确实适用于视图中的任何其他子项,例如,如果您有一个按钮、一个图标或另一个视图,当您制作 flex:0 时,您会删除组件使用 flexbox 增长的属性)【参考方案3】:

如果您想基于 &lt;Text&gt; 将宽度应用于 View,您可以执行以下操作:

<View style=styles.container>
   <Text>
     text
   </Text>
</View>

const styles = StyleSheet.create(
  container: 
    flexDirection:"row",
    alignSelf:"flex-start",
    paddingTop: Constants.statusBarHeight,
    backgroundColor: '#ecf0f1',
    padding: 8,
  
);

WORKING DEMO

【讨论】:

【参考方案4】:

tldr:将 alignItems 设置为除 'stretch' 之外的任何值,以用于包含 Text 的 View 的父 View 的样式

您面临的问题可能与 React Native 在 &lt;View /&gt; 元素上的 alignItems: 'stretch' 默认值有关。基本上,默认情况下,所有&lt;View /&gt; 元素都会使其子元素沿交叉轴(与flexDirection 相对的轴)伸展。在父视图上将alignItems 设置为"stretch" 以外的任何值(“baseline”、“flex-start”、“flex-end”或“center”)可防止此行为并解决您的问题。

下面是一个示例,其中有两个 View 元素包含在带有蓝色边框的父 View 内。这两个 View 元素各自包含一个包裹在 Text 元素周围的 View。在第一个具有默认样式的 View 的情况下,黄色子 View 水平扩展以填充整个宽度。在 alignItems: 'baseline' 的第二个 View 中,粉红色 View 不会扩展并保持其子 Text 元素的大小。

<View style= borderWidth: 5, borderColor: 'blue' >
    <View>
        <View style= backgroundColor: 'yellow' >
            <Text style= fontSize: 30 >Hello</Text>
        </View>
    </View>
    <View style= alignItems: 'baseline' >
        <View style= backgroundColor: 'pink' >
            <Text style= fontSize: 30 >Hello</Text>
        </View>
    </View>
</View>

align-items 属性解释得很好here。

【讨论】:

【参考方案5】:

或者简单地说:

  <Text style=color: '#ffffff', alignSelf: 'center'>Sample text here</Text>

【讨论】:

【参考方案6】:

这对我有用。

<View style=alignSelf: 'flex-start', backgroundColor: 'red'>
    <Text>abc</Text>
</View>

【讨论】:

【参考方案7】:

根据您的要求尝试这种方式:

这里我的高度是恒定的,我将宽度扩大为文本的长度。

  <View style=flexDirection: 'row'>
    <View style=
        height: 30, width: 'auto', justifyContent:'center', 
        alignItems: 'center'>

        <Text style=color:'white'>Now View will enlarge byitself</Text>

    </View>
  </View>

对于高度和宽度尝试将视图样式内的高度更改为“自动”完整代码如下:

  <View style=flexDirection: 'row'>
    <View style=
        height: 'auto', width: 'auto', justifyContent:'center', 
        alignItems: 'center'>

        <Text style=color:'white'>Now View will enlarge byitself</Text>

    </View>
  </View>

还可以尝试为视图提供填充以正确排列文本。

【讨论】:

【参考方案8】:

它适用于 Nicholas 的回答,除非您想将视图居中某处。在这种情况下,您可以在视图周围添加一个包装器视图以获取其内容的宽度并设置alignItems: 'center'。像这样:

    <View style= flex: 1, alignItems: 'center' >
        <View style= justifyContent: 'center', alignItems: 'center', backgroundColor: 'red' >
            <Text>'Your text is here'</Text>
        </View>
    </View>

添加背景颜色以显示内部视图的大小

【讨论】:

这是最好的解决方案,感谢您的解释。【参考方案9】:
    <View style=styles.imageCancel>
         <TouchableOpacity onPress=() =>  this.setModalVisible(!this.state.visible) >
                 <Text style=styles.textCancel >Close</Text>
          </TouchableOpacity>
    </View>
const styles = StyleSheet.create(
 imageCancel: 
         height: 'auto',
         width: 'auto',
         justifyContent:'center',
         backgroundColor: '#000000',
         alignItems: 'flex-end',
    ,
     textCancel: 
        paddingTop:25,
        paddingRight:25,
        fontSize : 18,
        color : "#ffffff",
        height: 50,
        ,
 ;

【讨论】:

以上是关于React-native view auto width by text inside的主要内容,如果未能解决你的问题,请参考以下文章

禁用缩放 web-view react-native?

React-Native -课后练习

react-native点击事件

React-Native踩坑记录二

React-native:如何在布局(视图)的背景中设置图像

探究react native的View