1. 创建一个名为 BottomSheetComponent.js 的文件
| |
| import React, { useState, useEffect } from 'react'; |
| import { Modal, View, Text, TouchableOpacity, Animated, StyleSheet, Dimensions } from 'react-native'; |
| |
| const { height } = Dimensions.get('window'); |
| |
| const BottomSheetComponent = ({ visible, onClose }) => { |
| const [showModal, setShowModal] = useState(visible); |
| const translateY = useState(new Animated.Value(height))[0]; |
| |
| useEffect(() => { |
| if (visible) { |
| setShowModal(true); |
| Animated.spring(translateY, { |
| toValue: 0, |
| useNativeDriver: true, |
| }).start(); |
| } else { |
| Animated.timing(translateY, { |
| toValue: height, |
| duration: 300, |
| useNativeDriver: true, |
| }).start(() => { |
| setShowModal(false); |
| }); |
| } |
| }, [visible, translateY]); |
| |
| return ( |
| <Modal |
| transparent |
| visible={showModal} |
| onRequestClose={onClose} |
| > |
| <TouchableOpacity style={styles.overlay} onPress={onClose} /> |
| <Animated.View style={[styles.container, { transform: [{ translateY }] }]}> |
| <View style={styles.content}> |
| <Text style={styles.title}>Hello, World!</Text> |
| <Text style={styles.subtitle}>This is a bottom sheet panel</Text> |
| </View> |
| </Animated.View> |
| </Modal> |
| ); |
| }; |
| |
| const styles = StyleSheet.create({ |
| overlay: { |
| flex: 1, |
| backgroundColor: 'rgba(0, 0, 0, 0.5)', |
| }, |
| container: { |
| position: 'absolute', |
| bottom: 0, |
| width: '100%', |
| height: '50%', |
| backgroundColor: 'white', |
| borderTopLeftRadius: 20, |
| borderTopRightRadius: 20, |
| }, |
| content: { |
| flex: 1, |
| alignItems: 'center', |
| justifyContent: 'center', |
| padding: 16, |
| }, |
| title: { |
| fontSize: 24, |
| fontWeight: 'bold', |
| }, |
| subtitle: { |
| fontSize: 16, |
| color: 'gray', |
| }, |
| }); |
| |
| export default BottomSheetComponent; |
2. 在其他页面中使用 BottomSheetComponent
| |
| import React, { useState } from 'react'; |
| import { View, Text, TouchableOpacity, StyleSheet } from 'react-native'; |
| import BottomSheetComponent from './BottomSheetComponent'; |
| |
| const MainScreen = () => { |
| const [isBottomSheetVisible, setBottomSheetVisible] = useState(false); |
| |
| const toggleBottomSheet = () => { |
| setBottomSheetVisible(!isBottomSheetVisible); |
| }; |
| |
| return ( |
| <View style={styles.container}> |
| <TouchableOpacity |
| style={styles.button} |
| onPress={toggleBottomSheet} |
| > |
| <Text style={styles.buttonText}>Open Bottom Sheet</Text> |
| </TouchableOpacity> |
| <BottomSheetComponent visible={isBottomSheetVisible} onClose={toggleBottomSheet} /> |
| </View> |
| ); |
| }; |
| |
| const styles = StyleSheet.create({ |
| container: { |
| flex: 1, |
| justifyContent: 'center', |
| alignItems: 'center', |
| }, |
| button: { |
| backgroundColor: '#6200ee', |
| padding: 15, |
| borderRadius: 25, |
| }, |
| buttonText: { |
| color: '#fff', |
| fontSize: 16, |
| }, |
| }); |
| |
| export default MainScreen; |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程