我正在建立测验应用程序,有一个问题,我必须 Shuffle 问题选项,但他们位于嵌套的问题数组。下面是界面:
export interface IConnectionsQuestionData extends IQuestionData {
type: 'connections';
questionsTitle: string;
answersTitle: string;
pairs: {
questionOption: IConnectionsOption;
answerOption: Maybe<IConnectionsOption>;
}[];
}
export interface IConnectionsOption {
key: IDType;
value: string;
type: 'answer' | 'question'
}
因此,为了 Shuffle 选项,我创建了自定义useShuffle
挂钩:
export const useShuffle = <T>(array: T[]): T[] => {
return useMemo(() => {
return shuffleArray(array);
}, [array])
}
在Question
组件中,我从props中获取question
。我使用这个钩子如下:
const shuffledLeftSideOptions = useShuffle(question?.pairs.map(pair => pair.questionOption) ?? [])
const shuffledRightSideOptions = useShuffle(question?.pairs.map(pair => pair.answerOption) ?? [])
但每次组件需要重新渲染时,我选择选项,选项数组 Shuffle 再次对每一个渲染。我试图测试它,它的工作与pairs
阵列,但与question
或answer
选项 Shuffle 。
1条答案
按热度按时间2izufjch1#
你只记住了shuffling,而没有记住
map
操作,所以你每次都得到一个新的数组,因为map
每次都产生一个新的数组,所以useShuffle
每次都要做它的工作。如果您需要执行
map
,您还需要记住它,例如:但是,请注意,
useMemo
提供的记忆化仅提供性能优化,而不是语义保证。(更多信息请参见the documentation。)但是您的shuffling代码依赖于它,就好像它是语义保证一样。相反,当您需要语义保证时,请使用ref:
或者它可能更干净,只有一个参考: