功能组件调用其他函数导致无效的挂钩调用
Functional Component Calling Other Function resulting Invalid Hook Call
我是新手。
我想知道为什么我不能调用另一个包含 hook 的函数(在一个文件 js 中)?
下面是我的代码:
函数 A
const callService = async () => {
const Loginreducer = useSelector((state) => state.Loginreducer)
const email = Loginreducer.form.email;
const token = Loginreducer.credential.token;
console.log(email, token);}
函数 B
const MyHomeStack = ({ navigation }) => {
return (
<Stack.Navigator
screenOptions={{
animationEnabled: false,
title: "Some App",
headerLeft: () => (
<View style={{ marginHorizontal: 10, flexDirection: "row" }}>
<TouchableOpacity onPress={() => navigation.replace('MyTab')}>
<MaterialCommunityIcons style={styles.navItem} name="fish" size={25} />
</TouchableOpacity>
</View>
),
headerRight: () => (
<View style={{ marginHorizontal: 10, flexDirection: "row" }}>
<TouchableOpacity onPress={() =>
Alert.alert("Confirmation", "Are you sure want to logout?",
[
{
text: 'OK',
onPress: () => callService()
},
{
text: 'Cancel',
},
],
)}>
<MaterialCommunityIcons style={styles.navItem} name="fish-off" size={25} />
</TouchableOpacity>
</View>
)
}}
>
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Food" component={FoodScreen} />
<Stack.Screen name="MyTab" component={MyTab} />
<Stack.Screen name="MyDrawer" component={MyDrawer} />
</Stack.Navigator>
)
}
函数 C
const MyTab = () => {
}
...等等
如果我将整个 const callService = async () => {} 放在 return 标签上方的 const MyHomeStack 中,它就会起作用。
但我希望它在 MyHomeStack 函数之外,
因为 callService 函数(函数 A)需要被其他函数(函数 C、D 等)访问,而不仅仅是 MyHomeStack 函数(函数 B)。
有人可以帮忙吗?
谢谢
React 中的钩子只能在函数组件内部或其他钩子内部使用。另见:Rules of Hooks.
这意味着您不能在 callService
内部调用 useSelector
,因为它是一个普通函数。
有很多解决方案。一种是将 state
作为参数传递给 callService(state)
,这样它就是不使用挂钩的纯函数。
另一种解决方案是将其制作成自定义挂钩。您不能通过单击执行挂钩,因为这也违反了挂钩规则。但是您可以调用一个钩子来检索一个函数,然后将该函数用作您的 onClick
处理程序。
const useCallService = () => {
// all hooks must go OUTSIDE of the callback
const Loginreducer = useSelector((state) => state.Loginreducer);
// return a callback
return (event) => {
const email = Loginreducer.form.email;
const token = Loginreducer.credential.token;
console.log(email, token);
}
}
const MyComponent = () => {
const handleClick = useCallService();
return (
<Button onPress={handleClick} text="Click"/>
)
}
我是新手。
我想知道为什么我不能调用另一个包含 hook 的函数(在一个文件 js 中)?
下面是我的代码:
函数 A
const callService = async () => {
const Loginreducer = useSelector((state) => state.Loginreducer)
const email = Loginreducer.form.email;
const token = Loginreducer.credential.token;
console.log(email, token);}
函数 B
const MyHomeStack = ({ navigation }) => {
return (
<Stack.Navigator
screenOptions={{
animationEnabled: false,
title: "Some App",
headerLeft: () => (
<View style={{ marginHorizontal: 10, flexDirection: "row" }}>
<TouchableOpacity onPress={() => navigation.replace('MyTab')}>
<MaterialCommunityIcons style={styles.navItem} name="fish" size={25} />
</TouchableOpacity>
</View>
),
headerRight: () => (
<View style={{ marginHorizontal: 10, flexDirection: "row" }}>
<TouchableOpacity onPress={() =>
Alert.alert("Confirmation", "Are you sure want to logout?",
[
{
text: 'OK',
onPress: () => callService()
},
{
text: 'Cancel',
},
],
)}>
<MaterialCommunityIcons style={styles.navItem} name="fish-off" size={25} />
</TouchableOpacity>
</View>
)
}}
>
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Food" component={FoodScreen} />
<Stack.Screen name="MyTab" component={MyTab} />
<Stack.Screen name="MyDrawer" component={MyDrawer} />
</Stack.Navigator>
)
}
函数 C
const MyTab = () => {
}
...等等
如果我将整个 const callService = async () => {} 放在 return 标签上方的 const MyHomeStack 中,它就会起作用。
但我希望它在 MyHomeStack 函数之外, 因为 callService 函数(函数 A)需要被其他函数(函数 C、D 等)访问,而不仅仅是 MyHomeStack 函数(函数 B)。
有人可以帮忙吗?
谢谢
React 中的钩子只能在函数组件内部或其他钩子内部使用。另见:Rules of Hooks.
这意味着您不能在 callService
内部调用 useSelector
,因为它是一个普通函数。
有很多解决方案。一种是将 state
作为参数传递给 callService(state)
,这样它就是不使用挂钩的纯函数。
另一种解决方案是将其制作成自定义挂钩。您不能通过单击执行挂钩,因为这也违反了挂钩规则。但是您可以调用一个钩子来检索一个函数,然后将该函数用作您的 onClick
处理程序。
const useCallService = () => {
// all hooks must go OUTSIDE of the callback
const Loginreducer = useSelector((state) => state.Loginreducer);
// return a callback
return (event) => {
const email = Loginreducer.form.email;
const token = Loginreducer.credential.token;
console.log(email, token);
}
}
const MyComponent = () => {
const handleClick = useCallService();
return (
<Button onPress={handleClick} text="Click"/>
)
}