【发布时间】:2019-12-19 05:11:06
【问题描述】:
我正在使用带有钩子的 react-redux,并且我需要一个选择器,该选择器采用不是道具的参数。 documentation 状态
选择器函数不接收 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>;
}
【问题讨论】:
-
这是个好问题,也找不到任何示例,但您仍然可以使用接收
ownProps的connect。或者你可以反转柯里化(例如id => state => state.todo.byId[id]然后useSelector(getTodoById(id))。 -
或者直接自己调用:
useSelector(state => getTodoById(state)(id));这样,返回值会在钩子中被考虑在内,并且应该相应地重新渲染。 -
@EmileBergeron 我想更好地理解您的第二条评论。不 useSelector 只是进行相等比较以查看是否更改,这对您的功能有何作用?
-
useSelector订阅了商店,因为你的getTodoById总是返回一个新函数,我认为你的组件总是会重新渲染。 -
经过测试,我写了一个答案来突出
useSelector(getTodoById)(id)的问题。
标签: javascript reactjs redux react-redux react-hooks