This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.
创建一个模态框
编辑页面
在本教程中,学习如何创建一个用于选择图片的 React Native 模态框。
React Native 提供了一个 <Modal> 组件,用于在应用的其余内容之上显示内容。通常,模态框用于吸引用户注意关键信息,或引导他们采取行动。例如,在第三章中,按下按钮后,我们使用 alert() 显示了一些占位文本。这就是模态组件显示覆盖层的方式。
在本章中,我们将创建一个显示表情选择器列表的模态框。

使用 React Native 的 Modal API 构建一个模态组件,用于显示表情选择器并处理用户交互。
1
声明一个用于显示按钮的状态变量
在实现模态框之前,我们先添加三个新按钮。这些按钮会在用户从媒体库中选择图片或使用占位图片后显示。其中一个按钮将触发表情选择器模态框。
在 src/app/(tabs)/index.tsx 中:
- 声明一个布尔类型的状态变量
showAppOptions,用于显示或隐藏打开模态框以及其他几个选项的按钮。当应用屏幕加载时,我们将其设置为false,这样在选择图片之前不会显示这些选项。当用户选择图片或使用占位图片时,我们会将其设置为true。 - 更新
pickImageAsync()函数,在用户选择图片后将showAppOptions的值设为true。 - 为没有主题的按钮添加
onPress属性,并使用以下值。
在上面的代码片段中,我们根据 showAppOptions 的值来渲染 Button 组件,并将按钮移动到三元运算块中。当 showAppOptions 的值为 true 时,渲染一个空的 <View> 组件。我们将在下一步处理这个状态。
现在,我们可以移除 Button 组件中的 alert,并更新在 src/components/button.tsx 中渲染第二个按钮时的 onPress 属性:
2
添加按钮
让我们拆解本章要实现的选项按钮布局。设计如下:
它包含一个父级 <View>,其中有三个按钮横向排列。中间带有加号图标(+)的按钮会打开模态框,并且样式与另外两个按钮不同。
在 src/components 目录中,创建一个名为 circle-button.tsx 的新文件,并添加以下代码:
为了渲染加号图标,这个按钮使用了 @expo/vector-icons 库中的 <MaterialIcons> 图标集。
另外两个按钮也使用 <MaterialIcons> 来显示垂直排列的文本标签和图标。在 src/components 目录中创建一个名为 icon-button.tsx 的文件。此组件接受三个属性:
icon:对应MaterialIcons图标库图标名称。label:按钮上显示的文本标签。onPress:用户按下按钮时调用的函数。
在 src/app/(tabs)/index.tsx 中:
- 导入
CircleButton和IconButton组件以便显示它们。 - 为这些按钮添加三个占位函数。
onReset()函数会在用户按下重置按钮时调用,使图片选择按钮再次显示。其他两个函数的功能我们稍后再添加。
让我们看看应用在 Android、iOS 和 Web 上的效果:
3
创建一个表情选择器模态框
模态框允许用户从可用表情列表中选择一个表情。在 src/components 目录中创建一个 emoji-picker.tsx 文件。此组件接受三个属性:
isVisible:用于确定模态框可见状态的布尔值。onClose:用于关闭模态框的函数。children:稍后用于显示表情列表。
让我们了解以上代码的作用:
<Modal>组件会显示一个标题和一个关闭按钮。- 它的
visible属性取值为isVisible,用于控制模态框是打开还是关闭。 - 它的
transparent属性是一个布尔值,用于决定模态框是否填满整个视图。 - 它的
animationType属性决定模态框进入和离开屏幕的方式。在这里,它从屏幕底部滑入。 - 最后,当用户按下关闭的
<Pressable>时,<EmojiPicker>会调用onClose属性。
现在,让我们修改 src/app/(tabs)/index.tsx:
- 导入
<EmojiPicker>组件。 - 使用
useState钩子创建一个isModalVisible状态变量。它的默认值为false,这会在用户按下打开按钮之前隐藏模态框。 - 替换
onAddSticker()函数中的注释,当用户按下按钮时将isModalVisible变量更新为true。这将打开表情选择器。 - 创建
onModalClose()函数来更新isModalVisible状态变量。 - 将
<EmojiPicker>组件放在Index组件底部。
以下是这一步之后的结果:
4
显示表情列表
现在,让我们在模态框内容中添加一个横向的表情列表。为此我们将使用 React Native 的 <FlatList> 组件。
在 src/components 目录中创建一个 emoji-list.tsx 文件,并添加以下代码:
让我们了解以上代码的作用:
- 上面的
<FlatList>组件使用Image组件渲染所有表情图片,并由<Pressable>包裹。稍后我们会改进它,使用户可以在屏幕上点击某个表情,将其作为贴纸显示在图片上。 - 它还接受由
emoji数组变量提供的项目数组,作为data属性的值。renderItem属性取出data中的项目并返回列表中的该项。最后,我们添加了Image和<Pressable>组件来显示该项目。 horizontal属性使列表水平而不是垂直渲染。showsHorizontalScrollIndicator使用 React Native 的Platform模块来检查该值,并在 Web 上显示横向滚动条。
现在,更新 src/app/(tabs)/index.tsx,导入 <EmojiList> 组件,并用以下代码片段替换 <EmojiPicker> 组件中的注释:
在 EmojiList 组件中,onSelect 属性用于选择表情,选择后,onCloseModal 会关闭模态框。
让我们看看应用在 Android、iOS 和 Web 上的效果:
5
显示选中的表情
现在,我们将在图片上放置表情贴纸。在 src/components 目录中创建一个新文件,并将其命名为 emoji-sticker.tsx。然后,添加以下代码:
这个组件接收两个 props:
imageSize:在Index组件内部定义的值。我们将在下一章中使用这个值来在点击时缩放图片大小。stickerSource:所选表情图片的来源。
在 src/app/(tabs)/index.tsx 文件中导入此组件,并更新 Index 组件,以便在图片上显示表情贴纸。我们将检查 pickedEmoji 状态是否不为 undefined:
让我们看看应用在 Android、iOS 和 Web 上的效果:
概要
Chapter 5: Create a modal
We've successfully created the emoji picker modal and implemented the logic to select an emoji and display it over the image.
In the next chapter, let's add user interactions with gestures to drag the emoji and scale the size by tapping it.