gou*_*hal 8 javascript react-native touchablehighlight
如何防止用户在React native中点击两次按钮?
即用户必须无法在可触摸的高光上快速点击两次
Pat*_*iak 24
https://snack.expo.io/@patwoz/withpreventdoubleclick
使用此HOC扩展可触摸组件,如TouchableHighlight,Button ...
import debounce from 'lodash.debounce'; // 4.0.8
const withPreventDoubleClick = (WrappedComponent) => {
class PreventDoubleClick extends React.PureComponent {
debouncedOnPress = () => {
this.props.onPress && this.props.onPress();
}
onPress = debounce(this.debouncedOnPress, 300, { leading: true, trailing: false });
render() {
return <WrappedComponent {...this.props} onPress={this.onPress} />;
}
}
PreventDoubleClick.displayName = `withPreventDoubleClick(${WrappedComponent.displayName ||WrappedComponent.name})`
return PreventDoubleClick;
}
Run Code Online (Sandbox Code Playgroud)
用法
import { Button } from 'react-native';
import withPreventDoubleClick from './withPreventDoubleClick';
const ButtonEx = withPreventDoubleClick(Button);
<ButtonEx onPress={this.onButtonClick} title="Click here" />
Run Code Online (Sandbox Code Playgroud)
Shi*_*-00 15
这是我的简单钩子。
import { useRef } from 'react';
const BOUNCE_RATE = 2000;
export const useDebounce = () => {
const busy = useRef(false);
const debounce = async (callback: Function) => {
setTimeout(() => {
busy.current = false;
}, BOUNCE_RATE);
if (!busy.current) {
busy.current = true;
callback();
}
};
return { debounce };
};
Run Code Online (Sandbox Code Playgroud)
这可以用在任何你喜欢的地方。即使不是按钮。
const { debounce } = useDebounce();
<Button onPress={() => debounce(onPressReload)}>
Tap Me again and again!!!!!!
</Button>
Run Code Online (Sandbox Code Playgroud)
同意接受的答案,但方法很简单,我们可以使用以下方法
import debounce from 'lodash/debounce';
componentDidMount() {
this.onPressMethod= debounce(this.onPressMethod.bind(this), 500);
}
onPressMethod=()=> {
//what you actually want on button press
}
render() {
return (
<Button
onPress={() => this.onPressMethod()}
title="Your Button Name"
/>
);
}
Run Code Online (Sandbox Code Playgroud)
小智 6
使用属性Button.disabled
import React, { Component } from 'react';
import { AppRegistry, StyleSheet, View, Button } from 'react-native';
export default class App extends Component {
state={
disabled:false,
}
pressButton() {
this.setState({
disabled: true,
});
// enable after 5 second
setTimeout(()=>{
this.setState({
disabled: false,
});
}, 5000)
}
render() {
return (
<Button
onPress={() => this.pressButton()}
title="Learn More"
color="#841584"
disabled={this.state.disabled}
accessibilityLabel="Learn more about this purple button"
/>
);
}
}
// skip this line if using Create React Native App
AppRegistry.registerComponent('AwesomeProject', () => App);Run Code Online (Sandbox Code Playgroud)
我通过参考上面的答案来使用它。“禁用”不一定是一个状态。
import React, { Component } from 'react';
import { TouchableHighlight } from 'react-native';
class PreventDoubleTap extends Component {
disabled = false;
onPress = (...args) => {
if(this.disabled) return;
this.disabled = true;
setTimeout(()=>{
this.disabled = false;
}, 500);
this.props.onPress && this.props.onPress(...args);
}
}
export class ButtonHighLight extends PreventDoubleTap {
render() {
return (
<TouchableHighlight
{...this.props}
onPress={this.onPress}
underlayColor="#f7f7f7"
/>
);
}
}
Run Code Online (Sandbox Code Playgroud)
它可以是其他可触摸组件,如 TouchableOpacity。
如果您使用的是 React 导航,则使用此格式导航到另一个页面。
this.props.navigation.navigate({key:"any",routeName:"YourRoute",params:{param1:value,param2:value}})
StackNavigator 将阻止具有相同键的路由再次推送到堆栈中。如果您想将参数传递到另一个屏幕,您可以编写任何独特的东西,因为 thekey和paramsprop 是可选的。
| 归档时间: |
|
| 查看次数: |
12381 次 |
| 最近记录: |