javascript - 如何使用具有相似变量的 React 钩子?
问题描述
所以我对 React 钩子还很陌生,我正在尝试再次使用类似的变量。
我想要几个按钮,每个按钮启动不同的登录机制,如下所示:
export default function App() {
let [request, response, onGoogleLoginButtonPress] = Google.useAuthRequest({
responseType: ResponseType.Token,
clientId: 'NUMBER',
});
let [request, response, onFBLoginButtonPress] = Facebook.useAuthRequest({
responseType: ResponseType.Token,
clientId: 'NUMBER',
});
return(
<View>
<TouchableOpacity style={[styles.googleRed, styles.loginButton]}
self={this} onPress={() => onGoogleLoginButtonPress()}>
<View></View>
<Text style={styles.loginText}>Log In with Google</Text>
<Image style={styles.loginImg} source={GoogleImg} />
</TouchableOpacity>
<TouchableOpacity style={[styles.facebookBlue, styles.loginButton]}
self={this} onPress={() => onFBLoginButtonPress()}>
<View></View>
<Text style={styles.loginText}>Log In with Facebook</Text>
<Image style={styles.loginImg} source={FBImg} />
</TouchableOpacity>
</View>
);
}
这不起作用,因为请求和响应正在被重用。
现在我想我可以将它们重新命名为 fbRequest 和 googleRequest 等,但这看起来很混乱,就像添加了不必要的变量 - 如果有请求,它只会是一个请求。
如何在使用相关函数填充它们的同时重复使用这些变量?
解决方案
我看到两个选项。我更喜欢第一个。。
首先,将您的按钮重构为通用按钮功能组件,这样您就可以使它们看起来相似且可维护
const AuthButton = (props) => {
return(
<TouchableOpacity style={props.styles}
self={this} onPress={props.onPress}>
<View></View>
<Text style={styles.loginText}>{props.buttonText}</Text>
<Image style={styles.loginImg} source={props.imgSrc} />
</TouchableOpacity>
)
}
在此之后你有两个选择。
选项 1:每个 Auth 类型的功能组件用其自定义钩子包装按钮
const FacebookAuthBtn = (props) => {
let [request, response, onButtonPress] = Facebook.useAuthRequest({
responseType: ResponseType.Token,
clientId: '195616021512894',
});
return(
<AuthButton
styles={[styles.facebookBlue, styles.loginButton]}
imgSrc={FBImg}
onPress={onButtonPress}
buttonText={"Log In with Facebook"}
/>
)
}
然后为谷歌做一个类似的选择。
const GoogleAuthBtn = (props) => {
let [request, response, onButtonPress] = Google.useAuthRequest({
responseType: ResponseType.Token,
clientId: '195616021512894',
});
return(
<AuthButton
styles={[styles.googleRed, styles.loginButton]}
imgSrc={GoogleImg}
onPress={onButtonPress}
buttonText={"Log In with Google"}
/>
)
}
你最终会得到
export default function App() {
const handleAuthenticate = (data) => {
// do what you need to when user authenticates
}
return(
<View>
<FacebookAuthBtn onAuthenticate={handleAuthenticate} />
<GoogleAuthBtn onAuthenticate={handleAuthenticate}/>
</View>
);
}
这样做的好处是,您可以将“onAuthenticate”回调从您的应用程序级别传递给这两个组件并适当地处理它。
您可以在每个 FacebookAuthBtn 和 GoogleAuthBtn 中执行此操作,方法是在响应上设置一个 useEffect
const FacebookAuthBtn = (props) => {
let [request, response, onButtonPress] = Facebook.useAuthRequest({
responseType: ResponseType.Token,
clientId: '195616021512894',
});
useEffect(() => {
if (response && typeof props.onAuthenticate === 'function') {
props.onAuthenticate(response);
}
},[response])
return(
<AuthButton
styles={[styles.facebookBlue, styles.loginButton]}
imgSrc={FBImg}
onPress={onButtonPress}
buttonText={"Log In with Facebook"}
/>
)
}
选项 2:使用 AuthButton 两次(您需要像选项 1 一样传入道具)
export default function App() {
let [gRequest, gResponse, onGoogleLoginButtonPress] = Google.useAuthRequest({
responseType: ResponseType.Token,
clientId: '195616021512894',
});
let [fRequest, fResponse, onFBLoginButtonPress] = Facebook.useAuthRequest({
responseType: ResponseType.Token,
clientId: '195616021512894',
});
return(
<View>
<AuthButton {googleAuthPropsHere}/>
<AuthButton {facebookAuthPropsHere}/>
</View>
);
}
推荐阅读
- flutter - 当我将 Cocoapobs 从 1.11.1 升级到 1.11.2 版本时,请告诉我。然后我不能在模拟器 ios 上运行应用程序了
- firebase - 如何在 Rust 中发出 gRPC firestore 监听请求?
- python - 在主异步应用程序的不同进程中运行多个异步循环
- c# - 如何读取文本文件并将其值写入数组
- flutter - 如何监听 TextController 内部的变化?
- algorithm - 编辑距离和对齐距离的等效性
- r - 如何自动进行多次更换?
- r - 如何删除模式对话框上的关闭按钮?
- android - 从 webview 绘制时为空位图
- ruby - 我可以为 Ruby gem 运行预安装脚本吗?