我在 redux 商店中有一些元素,我正在等待来自 API 的响应或已经收到响应。
我的想法是创建一个钩子,以免在我需要执行此操作的每个组件中重复逻辑。
但是当然我收到了无法在回调中使用钩子的错误
用例是这样的:假设我从 API1 收到字母。对于我从 API1 收到的每封信函,我都必须调用 API2 以获取有关该信函的更多详细信息,因此我想首先检查我是否已经向 API2 提出了这封特定信函的请求,如果没有,做了。
为简化起见,我将省略对 API2 进行调用但响应尚未到达的情况。
这是我的钩子
useDetails = (letter) => {
const dispatch = useDispatch()
const { lettersDetails } = useSelector(state => ({
lettersDetails: state.api2.lettersDetails
}));
const [details, setDetails] = useState('')
useEffect(() => {
if (letter) {
// See of I already have details for this letter
const letterDetails = _.find(lettersDetails, function(o) { return o.letter === letter; });
if (!letterDetails) {
dispatch(getLetterDetailsAction(letter))
} else {
setDetails(`The place of ${letterDetails.letter} in the alphabet is ${letterDetails.position}`)
}
}
}, [lettersDetails]);
return details;
}
现在在我的组件中,我从另一个 api api1 接收信件,并用它们创建一个数组
我想做的是对我收到的每封信使用如下钩子,但我不能。有什么替代方案?
export default () => {
const { letters } = useSelector(state => ({
letters: state.api1.letters // this is an array
}));
const [mappedLetters, setMappedLetters] = useState([])
useEffect(() => {
setMappedLetters(letters.map(letter => {
return {
letter,
description: useDetails(letter) // here i want the return value from the hook
}
}))
}, [letters])
问题是这个逻辑需要在多个组件中重复
非常感谢你