我一直在阅读关于createSelector
的文档,我的印象是它应该记住结果以避免昂贵的计算。然而,由于某种原因,我的console.logs
在不应该触发的函数中触发。好奇为什么会这样,我做错了什么吗?当我到达这个特定组件时,数据已经以相同的形状存在于存储中,因此应该记住它。
- 注:
useAppDispatch
和useAppSelector
与默认值相同,它们只是在中心位置的ts类型。
in my component:
const dispatch = useAppDispatch();
const rawTranscript = useAppSelector(selectRawTranscript);
const parsedTranscript = useAppSelector(selectParsedTranscript);
const parsedResult = useMemo(() => {
// rawTranscript should be memoized ...
return transcriptParser(rawTranscript, undefined, 0.9);
}, [rawTranscript]);
useEffect(() => {
// this also fires, I initially had the parsed result here but the same behavior happened.
// const parsedResult = transcriptParser(rawTranscript, undefined, 0.9);
dispatch(updateParsedTranscript(parsedResult));
}, [dispatch, parsedResult]);
in my redux slice:
// selectRawTranscript should be memoized (createSelector is used)
export const selectRawTranscript = createSelector(
(state: RootState) => state.transcript.rawTranscript,
rawTranscript => rawTranscript
);
export const selectParsedTranscript = createSelector(
(state: RootState) => state.transcript.parsedTranscript,
parsedTranscript => parsedTranscript
);
你的选择器真的没有' memoizing';任何东西。任何时候使用createSelector
而输出选择器只是x => x
时,都不会发生真正的记忆。这完全等同于一个普通的函数,只有state => state.x
-你只是返回字段的原样。
根据到目前为止您所展示的代码,每当减速器更新state.transcript.rawTranscript
或state.transcript.parsedTranscript
字段时,组件将重新呈现,并且每次更新state.transcript.rawTranscript
字段时,效果将重新运行。
我建议阅读一下最近更新的Redux文档关于选择器的页面,以便更好地了解何时,如何以及为什么编写记忆选择器函数。
另外,让的效果依赖于解析的文本,然后还调度一个看起来像是保存解析值的动作,这似乎有点奇怪,并且有可能导致额外的重新呈现。
,