React Native+Expo SDK55:实现Evan Bacon式弹出二级导航菜单
实现思路与代码示例
核心逻辑
- 拦截「More」标签的默认路由跳转,用自定义点击事件控制弹出层的显示/隐藏
- 通过状态管理弹出层的显隐状态
- 实现悬浮覆盖层(用Modal或Expo Portal)承载二级导航选项
具体实现步骤
1. 引入依赖并添加状态
在组件顶部导入所需模块,同时声明控制弹出层的状态:
import { useState } from 'react'; import { Modal, View, Text, TouchableOpacity, StyleSheet } from 'react-native';
// 控制弹出层显示状态 const [showMoreMenu, setShowMoreMenu] = useState(false);
2. 修改「More」标签的点击行为
给NativeTabs.Trigger添加onPress事件,阻止默认路由跳转并切换弹出层状态:
<NativeTabs.Trigger name="more" role="search" onPress={(e) => { // 阻止默认页面跳转 e.preventDefault(); // 切换弹出层显示状态 setShowMoreMenu(!showMoreMenu); }} > <NativeTabs.Trigger.Label>More</NativeTabs.Trigger.Label> <NativeTabs.Trigger.Icon sf={{ default: "ellipsis", selected: "ellipsis", }} md="more_vert" /> </NativeTabs.Trigger>
3. 实现弹出层组件
在NativeTabs同级位置添加Modal组件,模拟快捷操作菜单:
<Modal visible={showMoreMenu} transparent={true} animationType="fade" onRequestClose={() => setShowMoreMenu(false)} > {/* 点击空白区域关闭菜单 */} <TouchableOpacity style={styles.modalOverlay} onPress={() => setShowMoreMenu(false)} > <View style={styles.menuContainer}> {/* 二级导航选项示例 */} <TouchableOpacity style={styles.menuItem}> <Text style={styles.menuItemText}>设置</Text> </TouchableOpacity> <TouchableOpacity style={styles.menuItem}> <Text style={styles.menuItemText}>帮助与反馈</Text> </TouchableOpacity> <TouchableOpacity style={styles.menuItem}> <Text style={styles.menuItemText}>退出登录</Text> </TouchableOpacity> </View> </TouchableOpacity> </Modal>
4. 添加适配视觉的样式
根据你提供的截图风格,添加对应的样式:
const styles = StyleSheet.create({ modalOverlay: { flex: 1, backgroundColor: 'rgba(0,0,0,0.5)', justifyContent: 'flex-end', paddingBottom: 80, // 避开底部导航栏 }, menuContainer: { backgroundColor: 'white', borderRadius: 12, marginHorizontal: 20, shadowColor: '#000', shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.25, shadowRadius: 4, elevation: 5, }, menuItem: { paddingVertical: 16, paddingHorizontal: 20, borderBottomWidth: 1, borderBottomColor: '#f0f0f0', }, menuItemText: { fontSize: 16, color: '#333', }, });
额外优化建议
- 若需要更流畅的动画效果,可以用
expo-reanimated自定义弹出/收起动画 - 要让弹出层精准定位在「More」按钮上方,可结合
expo-portal和组件位置测量实现 - 二级选项的页面跳转可直接用
useRouter()(基于Expo Router)完成
内容的提问来源于stack exchange,提问作者Gunnar Van Remoortere
相关产品推荐
相关产品推荐

