You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native+Expo SDK55:实现Evan Bacon式弹出二级导航菜单

实现思路与代码示例

核心逻辑

  1. 拦截「More」标签的默认路由跳转,用自定义点击事件控制弹出层的显示/隐藏
  2. 通过状态管理弹出层的显隐状态
  3. 实现悬浮覆盖层(用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 10:23:14