React Native点击

本文详细介绍了ReactNative中实现点击事件的方式,包括TouchableHighlight、TouchableOpacity和TouchableWithoutFeedback三种组件的区别及使用方法,并解释了onPress、onPressIn、onPressOut和onLongPress等事件的触发时机。

React Native 中的点击事件

React Native中Text组件有点击事件其他还没有碰见自带点击事件的,
一般用Touchable..来做点击

  • TouchableHighlight 点击会有点击背景颜色
  • TouchableOpacity 点击会有一个渐变透明的效果
  • TouchableWithoutFeedback 毫无效果和Text的onPress一样

上面三个组件中的点击方法有四个

  1. onPress 普通的点击
  2. onPressIn 开始点击 有点像Android里面的onKeyDown刚开始按下的时候调用的方法
  3. onPressOut 像Android里面的onKkeyUp手指在屏幕抬起的瞬间
  4. onLongPress 长按事件
<TouchableHighlight onPress={this.touchable.bind(this,'TouchableHighlight onPress')}
                                   onPressIn={this.touchableIn.bind(this,'TouchableHighlight onPressInt')}
                                   onPressOut={this.touchableOut.bind(this,'TouchableHighlight onPressOut')}
                                   onLongPress={this.longtouchable.bind(this,'TouchableHighlight onLongPress')}>
                   <Text style={styles.item}>TouchableHighlight</Text>
               </TouchableHighlight>

               <TouchableOpacity onPress={this.touchable.bind(this,'TouchableOpacity onPress')}>
                   <Text style={styles.item}>TouchableOpacity</Text>
               </TouchableOpacity>

               <TouchableWithoutFeedback onPress={this.touchable.bind(this,'TouchableWithoutFeedback onPress')}>
                   <Text style={styles.item}>TouchableWithoutFeedback</Text>
               </TouchableWithoutFeedback>
               <Text style={styles.item} onPress={this.touchable.bind(this,'Text onPress')}>Text自带的点击事件</Text>

需要更加详细的请参考网址https://www.race604.com/react-native-touch-event/

<think> 我们正在讨论React Native中使用react-navigation实现页面切换。根据引用[2]的描述,我们可以通过按钮的onPress事件触发导航操作。具体步骤包括: 1. 在按钮的onPress事件中调用`this.props.navigation.navigate('目标页面路由名')` 2. 确保当前组件能够访问到navigation属性(通常由react-navigation注入) 引用[1]展示了在入口文件(App.js)中设置导航器,并通过screenProps传递全局变量(如主题色)的方法。引用[3]则展示了通过按钮点击事件发送action并更新导航参数的例子。 因此,实现页面切换的关键步骤: 1. 配置路由(例如使用createStackNavigator等创建导航器) 2. 在屏幕组件中,通过props获取navigation对象 3. 在按钮的onPress事件中调用navigation.navigate方法 注意:如果当前组件不是由导航器直接渲染的(即不是屏幕组件),则需要使用withNavigation高阶组件或者通过props传递navigation属性。 下面具体说明: </think> ### React Native 中通过按钮实现页面切换的方法 在 React Native 中使用 `react-navigation` 实现页面切换,主要通过按钮的 `onPress` 事件触发导航操作来实现。以下是详细步骤: #### 1. **基本导航实现** ```jsx import { Button } from 'react-native'; function HomeScreen({ navigation }) { return ( <View> <Button title="跳转到详情页" onPress={() => navigation.navigate('DetailScreen')} /> </View> ); } ``` **关键点**: - 使用 `navigation.navigate('路由名')` 方法触发跳转[^2] - 路由名需在导航器配置中预先定义 - 导航属性 `navigation` 由 `react-navigation` 自动注入到屏幕组件中 #### 2. **导航器配置** 需先配置路由堆栈: ```jsx import { createStackNavigator } from 'react-navigation-stack'; // 创建页面组件 const HomeScreen = () => {...}; const DetailScreen = () => {...}; // 配置路由 const AppNavigator = createStackNavigator( { Home: HomeScreen, // 路由名: Home Detail: DetailScreen // 路由名: Detail }, { initialRouteName: 'Home' } ); export default createAppContainer(AppNavigator); ``` #### 3. **传递参数** 在跳转时传递数据到目标页面: ```jsx // 发送参数 <Button title="查看用户资料" onPress={() => navigation.navigate('Profile', { userId: '123', userName: '张三' })} /> // 接收参数 (ProfileScreen组件) function ProfileScreen({ navigation }) { const userId = navigation.getParam('userId', 'defaultId'); const userName = navigation.getParam('userName', '访客'); return <Text>欢迎 {userName} (ID: {userId})</Text>; } ``` #### 4. **返回上一页** ```jsx function DetailScreen({ navigation }) { return ( <View> <Button title="返回" onPress={() => navigation.goBack()} /> <Button title="返回首页" onPress={() => navigation.popToTop()} /> </View> ); } ``` - `goBack()`: 返回上一页 - `popToTop()`: 返回堆栈中第一个页面[^2] #### 5. **嵌套导航器中的跳转** 当存在嵌套导航器时(如标签页内跳转),需确保导航属性正确传递: ```jsx // 在嵌套的子导航器组件中 function TabNavigator({ navigation }) { return ( <Button title="跳转" onPress={() => navigation.navigate('NestedScreen')} /> ); } // 主导航器配置 const MainStack = createStackNavigator({ Home: HomeScreen, Tabs: TabNavigator, // 嵌套的子导航器 NestedScreen: NestedComponent }); ``` #### 6. **全局事件导航** 通过事件系统实现跨组件跳转(参考引用[1][^1]): ```jsx import { DeviceEventEmitter } from 'react-native'; // 发送跳转事件 DeviceEventEmitter.emit('navigate', 'TargetScreen'); // 在根组件监听 componentDidMount() { DeviceEventEmitter.addListener('navigate', (screenName) => { this.navigator.dispatch(NavigationActions.navigate({ routeName: screenName })); }); } ``` ### 常见问题解决 1. **`navigation`属性未定义**: - 确保组件是导航器直接渲染的屏幕组件 - 非屏幕组件使用 `withNavigation` 高阶组件: ```jsx import { withNavigation } from 'react-navigation'; const MyButton = ({ navigation }) => ( <Button onPress={() => navigation.navigate('Home')} /> ); export default withNavigation(MyButton); ``` 2. **路由名不存在错误**: - 检查拼写是否与导航器配置完全一致 - 确认目标路由已注册到当前导航器堆栈中 > **实现原理**:`react-navigation` 通过导航容器维护路由堆栈状态,当调用 `navigate()` 方法时会更新路由状态并渲染对应组件[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值