使用 useSelector 调用辅助函数时 Hook Call 无效
Invalid Hook Call when calling a helper function with useSelector
我在 TypeScript 文件中创建了一个辅助函数 (fetchBatchInfo) 以用于多个组件,但它返回错误“使用 useSelector 调用函数时挂钩调用无效”,因为它内部有一个 useSelector。我正在使用函数 renderBatches,它在 FlatList renderItem 中调用这个辅助函数。我尝试搜索替代方案并找到了自定义挂钩,但我找不到在 FlatList 的渲染函数中执行自定义挂钩的方法,因为它仍然是一个挂钩。
我还是 redux 的初学者,有没有办法实现我想要的?
flatlist渲染函数:
const renderBatches = useCallback((animalBatch: AnimalBatch) => {
let animalBatch: AnimalBatch= animalBatch.item;
let { chickenBatch } = fetchBatchInfo(animalBatch);
return (
<Text>{animalBatch.quantity} - {chickenBatch.sex}</Text>
);
}, [animalBatchUser]);
returns 当前 animalBatch 的所有数据的辅助函数:
export const fetchBatchInfo = (animalBatch: AnimalBatch) => {
const chickenBatchesUser = useSelector(
(state: RootStateOrAny) => state.batch.chickenBatchesUser);
let chickenBatch: ChickenBatch | undefined = chickenBatchesUser.find(
(chickenBatch: ChickenBatch) => chickenBatch.idChickenBatch == animalBatch.idChickenBatch)
return {
chickenBatch
};
}
在使用这个辅助函数之前,它是有效的,因为 chickenBatchesUser useSelector 在渲染函数之外,但是因为我将在其他地方使用这个代码,所以我想让这个辅助函数起作用。
有人知道这样做的方法吗?
// your fetch must be defined as a hook, to be inlcuded into the react lifecylce, and hooks starts with useXXX();
export const useChickenBatch = (animalBatch: AnimalBatch) => {
const chickenBatchesUser = useSelector(
(state: RootStateOrAny) => state.batch.chickenBatchesUser);
let chickenBatch: ChickenBatch | undefined = chickenBatchesUser.find(
(chickenBatch: ChickenBatch) => chickenBatch.idChickenBatch == animalBatch.idChickenBatch)
return { chickenBatch };
}
//inside your component
const YourComponent = ({ animalBatch }) => {
let { chickenBatch } = useChickenBatch(animalBatch);
return (
<Text>{animalBatch.quantity} - {chickenBatch.sex}</Text>
);
};
在此处阅读有关 hooks-rules 的信息:
https://reactjs.org/docs/hooks-rules.html
我在 TypeScript 文件中创建了一个辅助函数 (fetchBatchInfo) 以用于多个组件,但它返回错误“使用 useSelector 调用函数时挂钩调用无效”,因为它内部有一个 useSelector。我正在使用函数 renderBatches,它在 FlatList renderItem 中调用这个辅助函数。我尝试搜索替代方案并找到了自定义挂钩,但我找不到在 FlatList 的渲染函数中执行自定义挂钩的方法,因为它仍然是一个挂钩。
我还是 redux 的初学者,有没有办法实现我想要的?
flatlist渲染函数:
const renderBatches = useCallback((animalBatch: AnimalBatch) => {
let animalBatch: AnimalBatch= animalBatch.item;
let { chickenBatch } = fetchBatchInfo(animalBatch);
return (
<Text>{animalBatch.quantity} - {chickenBatch.sex}</Text>
);
}, [animalBatchUser]);
returns 当前 animalBatch 的所有数据的辅助函数:
export const fetchBatchInfo = (animalBatch: AnimalBatch) => {
const chickenBatchesUser = useSelector(
(state: RootStateOrAny) => state.batch.chickenBatchesUser);
let chickenBatch: ChickenBatch | undefined = chickenBatchesUser.find(
(chickenBatch: ChickenBatch) => chickenBatch.idChickenBatch == animalBatch.idChickenBatch)
return {
chickenBatch
};
}
在使用这个辅助函数之前,它是有效的,因为 chickenBatchesUser useSelector 在渲染函数之外,但是因为我将在其他地方使用这个代码,所以我想让这个辅助函数起作用。
有人知道这样做的方法吗?
// your fetch must be defined as a hook, to be inlcuded into the react lifecylce, and hooks starts with useXXX();
export const useChickenBatch = (animalBatch: AnimalBatch) => {
const chickenBatchesUser = useSelector(
(state: RootStateOrAny) => state.batch.chickenBatchesUser);
let chickenBatch: ChickenBatch | undefined = chickenBatchesUser.find(
(chickenBatch: ChickenBatch) => chickenBatch.idChickenBatch == animalBatch.idChickenBatch)
return { chickenBatch };
}
//inside your component
const YourComponent = ({ animalBatch }) => {
let { chickenBatch } = useChickenBatch(animalBatch);
return (
<Text>{animalBatch.quantity} - {chickenBatch.sex}</Text>
);
};
在此处阅读有关 hooks-rules 的信息: https://reactjs.org/docs/hooks-rules.html