大家好,又见面了,我是你们的朋友全栈君。
经过观察发现,在onPress事件执行后会触发
navigation.navigate(...)
方法,加载新的页面。
但是当页面加载缓慢时,多余的点击会多次触发该事件,导致页面重复加载
位置:../node_modules/react-navigation/src/addNavigationHelper.js
...... navigate: ( routeName: string, params?: NavigationParams, action?: NavigationNavigateAction ): boolean => navigation.dispatch( NavigationActions.navigate({ routeName, params, action }) ), .....
显然,页面跳转时,并未对事件进行控制,只要触发,就会加载新的页面
既然源码未加控制,我们就手动加上,目前思路有2种
–
普通版
在
onPress
事件处控制,第一次点击后,加上延时,禁止之后的点击操作,但是需要每个点击事件都添加
–
进阶版
直接修改源码,给
navigation.dispatch
加延时,一劳永逸
constructor
中初始化一个记录是否等待的
state
constructor(props) { super(props) this.state = { waiting: false,//防止多次重复点击 } }
this.state.waiting
控制
TouchableOpacity
的
disabled
属性
<TouchableOpacity
disabled={
this.state.waiting}
onPress={
() => this.repeatClick(this.props.navigation)}
<Text style={
padding: 10, color: 'red'}}>goto detail page</Text>
</TouchableOpacity>
repeatClick(navigation){
this.setState({
waiting: true});
/*-------这中间写你需要实现的逻辑------------*/
navigation.navigate('Detail')
/*-------这中间写你需要实现的逻辑------------*/
setTimeout(()=> { this.setState({waiting: false}) }, 3000);//设置的时间间隔根据实际需要 }
"react-navigation": "^1.0.0-beta.27"
,
修改后的代码如下:
......
......
export default function<S: {}>(
navigation: NavigationProp<S>
): NavigationScreenProp<S> {
/* ------------此处为添加的代码--------- */
let debounce = true;// 定义判断变量
/* ------------此处为添加的代码--------- */
return {
...navigation,
goBack: (key?: ?string): boolean => {
let actualizedKey: ?string = key;
if (key === undefined && navigation.state.key) {
invariant(
typeof navigation.state.key === 'string',
'key should be a string'
actualizedKey = navigation.state.key;
return navigation.dispatch(
NavigationActions.back({ key: actualizedKey })
navigate: (
routeName: string,
params?: NavigationParams,
action?: NavigationNavigateAction
/* ------------此处为修改后的的代码--------- */
): boolean =>{
if (debounce) {
debounce = false;
navigation.dispatch(
NavigationActions.navigate({
routeName,
params,
action,
setTimeout(
() => {
debounce = true;
5000,
return true;
return false;
/* ------------此处为修改后的的代码--------- */
......
......
此时onPress事件无需再加控制
<TouchableOpacity // disabled={this.state.waiting} onPress={() => this.props.navigation.navigate('Detail')} > <Text style={
padding: 10, color: 'red'}}>goto detail page</Text> </T
地址: https://www.reactnavigation.org.cn/ ,欢迎访问
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/139144.html原文链接:https://javaforall.cn