Closed
Description
I'm working on trying out proxy-memoize
for the first time, and I'm using the Redux Fundamentals todo app example as the testbed.
I tried updating a couple of the selectors to use memoize()
, including calling selectFilteredTodos
from selectFilteredTodoIds
:
reduxjs/redux-fundamentals-example-app@f270ea1
export const selectFilteredTodos = memoize((state) => {
console.log('Original state: ', getUntrackedObject(state))
const { status, colors } = state.filters
const todos = selectTodos(state)
const showAllCompletions = status === StatusFilters.All
if (showAllCompletions && colors.length === 0) {
return todos
}
const completedStatus = status === StatusFilters.Completed
// Return either active or completed todos based on filter
return todos.filter((todo) => {
const statusMatches =
showAllCompletions || todo.completed === completedStatus
const colorMatches = colors.length === 0 || colors.includes(todo.color)
return statusMatches && colorMatches
})
})
/*
export const selectFilteredTodoIds = createSelector(
// Pass our other memoized selector as an input
selectFilteredTodos,
// And derive data in the output selector
(filteredTodos) => filteredTodos.map((todo) => todo.id)
)
*/
export const selectFilteredTodoIds = memoize((state) => {
return selectFilteredTodos(state).map((todo) => todo.id)
})
However, this is throwing an exception when it tries to destructure from state.filters
:
TypeError: Cannot destructure property 'status' of 'state.filters' as it is undefined.
at http://localhost:3000/static/js/main.chunk.js:1194:5
at http://localhost:3000/static/js/1.chunk.js:66229:17
at http://localhost:3000/static/js/main.chunk.js:1222:10
at Object.current (http://localhost:3000/static/js/1.chunk.js:66229:17)
at Subscription.checkForUpdates [as onStateChange] (http://localhost:3000/static/js/1.chunk.js:95055:47)
I think it's due to the use of nested selectors here. If I copy-paste the filtering logic over into selectFilteredTodoIds
and use that instead of selectFilteredTodos(state)
, it runs fine.
So, my guess is that it has something to do with passing an already-wrapped state
value from one memoized selector into another selector.
Metadata
Metadata
Assignees
Labels
No labels