4、UI组件基础:View、Text、Image、ScrollView、TextInput等核心组件的使用与属性详解

好,咱们今天来聊聊移动端开发里最基础、也最常用到的几个UI组件。说实话,不管你是做React Native、Flutter还是SwiftUI,这几个组件的概念都是相通的。我当年刚入行时,就是靠啃透这几个组件,才慢慢摸到门道的。

你想想看,一个App的界面,说白了就是由这些基础组件拼装起来的。就像搭积木一样,你得先认识每块积木长什么样、能怎么用,才能搭出漂亮的房子。今天我就带你一个一个过一遍。

4.1 View:一切布局的基石

View,你可以把它理解成一个“容器”。它本身不显示任何内容,但它的作用可大了——用来包裹其他组件,控制它们的位置、大小、边距和背景色。

我个人习惯把View当成一个“盒子”。你在盒子里放Text、放Image,然后通过调整盒子的样式,来控制里面东西的排列方式。

核心属性速览:

属性 作用 常用值举例
width / height 设置宽高 100, '50%', 'auto'
margin / padding 外边距 / 内边距 10, { top: 5, left: 10 }
backgroundColor 背景颜色 '#f0f0f0', 'rgba(0,0,0,0.1)'
borderRadius 圆角 8, 20
flexDirection 子元素排列方向 'row', 'column'
justifyContent 主轴对齐方式 'center', 'space-between'
alignItems 交叉轴对齐方式 'center', 'flex-start'

举个例子,你想让两个按钮水平居中排列,代码大概长这样:

<View style={{ 
  flexDirection: 'row', 
  justifyContent: 'center', 
  alignItems: 'center',
  marginTop: 20 
}}>
  <Button title="确认" />
  <Button title="取消" />
</View>

我的小技巧:调试布局时,我习惯先给View加个明显的背景色(比如红色或蓝色),这样能一眼看出它的实际占位。调完再删掉就行。

4.2 Text:展示文字的门面

Text组件,就是用来显示文字的。别小看它,里面的门道可不少。

我记得有一次,产品经理说“这个标题字号再大一点,颜色再深一点”,我当时就靠Text的几个属性搞定了。

常用属性:

  • fontSize:字号,单位是逻辑像素(pt/dp)。我一般用14、16、18这几个值。
  • fontWeight:字重,'normal'、'bold'、'100'~'900'。
  • color:文字颜色。
  • textAlign:对齐方式,'left'、'center'、'right'。
  • numberOfLines:最多显示几行,超出部分用省略号。
  • lineHeight:行高,这个对阅读体验影响很大。

来看个实际例子:

<Text style={{ 
  fontSize: 18, 
  fontWeight: 'bold', 
  color: '#333',
  textAlign: 'center',
  numberOfLines: 2
}}>
  这是一段标题文字,如果太长会被截断...
</Text>

注意:Text组件可以嵌套!比如你想在一段文字里让某个词变红,可以这样写:<Text>这是<Text style={{color: 'red'}}>红色</Text>文字</Text>。这个技巧在富文本展示时特别有用。

4.3 Image:图片展示与优化

Image组件,用来显示本地或网络图片。嗯,这里要注意,网络图片必须指定宽高,否则显示不出来。

我曾经踩过一个坑:加载网络图片时没做错误处理,结果图片链接失效了,整个页面就空了一块。后来我养成了习惯,一定会加 defaultSourceonError 回调。

核心属性:

  • source:图片来源。本地用 require('./logo.png'),网络用 { uri: 'https://...' }
  • resizeMode:图片缩放模式。'cover'(裁剪填充)、'contain'(完整显示)、'stretch'(拉伸)。
  • style:可以设置宽高、圆角等。

代码示例:

<Image
  source={{ uri: 'https://example.com/avatar.jpg' }}
  style={{ width: 100, height: 100, borderRadius: 50 }}
  resizeMode="cover"
  defaultSource={require('./placeholder.png')}
  onError={() => console.log('图片加载失败')}
/>

避坑指南:我曾经遇到过图片加载慢导致页面卡顿的问题。后来我用了图片缓存库(比如FastImage),并且把图片尺寸压缩到实际显示尺寸的2倍以内,效果好了很多。

4.4 ScrollView:让内容滚动起来

当内容超出屏幕时,你就需要ScrollView了。它就像一个可以滚动的容器,把子元素全部包裹进去。

说实话,ScrollView用起来很简单,但有几个点容易忽略:

  • horizontal:设为true时,变成横向滚动。
  • showsVerticalScrollIndicator:是否显示滚动条,我一般设为false,更清爽。
  • pagingEnabled:分页滚动,适合做轮播图。
  • onScroll:监听滚动事件,可以用来做吸顶效果或加载更多。

一个常见的用法:

<ScrollView 
  style={{ flex: 1 }}
  showsVerticalScrollIndicator={false}
  onScroll={handleScroll}
>
  <View style={{ height: 200, backgroundColor: '#ff6b6b' }} />
  <View style={{ height: 200, backgroundColor: '#feca57' }} />
  <View style={{ height: 200, backgroundColor: '#48dbfb' }} />
</ScrollView>

注意:ScrollView会一次性渲染所有子元素。如果列表很长(比如几百条),建议用FlatList或VirtualizedList,否则性能会崩。我当年在CRM系统的客户列表页就吃过这个亏,后来全改成了FlatList。

4.5 TextInput:用户输入的入口

TextInput,就是输入框。用户注册、搜索、填写备注,都靠它。

它的属性比较多,我挑几个重点说:

  • placeholder:占位提示文字。
  • value / onChangeText:受控组件的标准用法。
  • secureTextEntry:密码输入时设为true。
  • keyboardType:键盘类型,'default'、'numeric'、'email-address'等。
  • multiline:多行输入,适合备注框。
  • maxLength:最大输入长度。

来看一个带清除按钮的搜索框例子:

<TextInput
  style={{ 
    height: 40, 
    borderColor: '#ddd', 
    borderWidth: 1, 
    borderRadius: 8, 
    paddingHorizontal: 12 
  }}
  placeholder="搜索客户名称"
  value={searchText}
  onChangeText={setSearchText}
  clearButtonMode="while-editing"
  returnKeyType="search"
  onSubmitEditing={handleSearch}
/>

我的经验:TextInput在iOS和Android上的表现有差异。比如iOS默认有内边距,Android没有。我一般会统一设置 paddingVertical: 0 来消除差异。另外,记得用 onSubmitEditing 监听键盘的“搜索”或“回车”按钮,用户体验会好很多。

4.6 组合实战:一个简单的客户名片卡片

光说不练假把式。咱们把上面几个组件组合起来,做一个客户名片卡片:

<View style={{ 
  flexDirection: 'row', 
  padding: 16, 
  backgroundColor: '#fff', 
  borderRadius: 12, 
  marginHorizontal: 16, 
  marginVertical: 8,
  shadowColor: '#000',
  shadowOpacity: 0.1,
  shadowRadius: 8,
  elevation: 4
}}>
  <Image
    source={{ uri: 'https://example.com/avatar.jpg' }}
    style={{ width: 60, height: 60, borderRadius: 30 }}
    resizeMode="cover"
  />
  <View style={{ marginLeft: 12, flex: 1 }}>
    <Text style={{ fontSize: 18, fontWeight: 'bold', color: '#333' }}>
      张三
    </Text>
    <Text style={{ fontSize: 14, color: '#666', marginTop: 4 }}>
      销售经理 | 北京分公司
    </Text>
    <Text style={{ fontSize: 12, color: '#999', marginTop: 4 }}>
      最近联系:2024-03-15
    </Text>
  </View>
</View>

你看,一个View做外层容器,里面放Image和Text,再配合几个样式属性,一个漂亮的名片就出来了。这就是基础组件的魅力——组合起来,能做出无限可能。

4.7 本章小结

今天咱们把View、Text、Image、ScrollView、TextInput这几个核心组件都过了一遍。说实话,这些组件你刚开始可能觉得简单,但真正用好、用对,还是需要一些实践积累的。

我建议你动手写几个小例子:比如做一个个人资料页、一个搜索框、一个可滚动的新闻列表。遇到问题别怕,多查文档、多调试,慢慢就熟练了。

下一章咱们会深入讲布局系统,包括Flexbox的完整用法。到时候你会发现,今天学的View组件,就是布局的核心。

好,今天就到这里。有问题随时交流。


公众号:蓝海资料掘金营,微信deep3321