我正在使用带钩子的 react-redux,我需要一个选择器,它接受一个不是 prop 的参数。 文档 说明
选择器函数不接收 ownProps 参数。但是,可以通过闭包(参见下面的示例)或使用柯里化选择器来使用 props。
但是,他们没有提供示例。如文档中所述,咖喱的正确方法是什么?
这就是我所做的并且似乎有效,但这是对的吗?从 useSelector
函数返回一个函数是否有影响(它似乎永远不会重新渲染?)
// selectors
export const getTodoById = state => id => {
let t = state.todo.byId[id];
// add display name to todo object
return { ...t, display: getFancyDisplayName(t) };
};
const getFancyDisplayName = t => `${t.id}: ${t.title}`;
// example component
const TodoComponent = () => {
// get id from react-router in URL
const id = match.params.id && decodeURIComponent(match.params.id);
const todo = useSelector(getTodoById)(id);
return <span>todo.display</span>;
}
原文由 user210757 发布,翻译遵循 CC BY-SA 4.0 许可协议
When the return value of a selector is a new function, the component will always re-render on each store change.
您可以使用一个超级简单的选择器来验证这一点:
即使
value
始终是0
,该组件将在每次存储操作时重新呈现,因为useSelector
调用我们不知道的函数 真正的价值。但是,如果我们确保
useSelector
收到最终的value
而不是函数,那么组件只会在真实的value
上呈现结论是它可以工作,但是每次调用它时从与
useSelector
一起使用的选择器 返回一个新函数(或任何新的非 原语)是非常低效的。该文档意味着:
useSelector(state => state.todos[props.id])
useSelector(state => curriedSelector(state)(props.id))
connect
始终可用,如果您稍微更改选择器,它可以同时用于两者。请注意,由于您要从选择器返回一个对象,因此您可能希望将
useSelector
的默认相等性检查更改为 浅层相等性检查。”`
如果您在选择器中执行昂贵的计算或者数据嵌套很深并且性能成为问题,请查看 Olivier 使用 memoization 的答案。