הערך האמיתי של Redux Selectors
בתיעוד של reselect מספרים על היתרונות בשימוש בספריה - למשל שאפשר להרכיב סלקטורים כדי להשתמש מחדש בקוד שכבר כתבנו או שסלקטורים זוכרים את הערך הקודם שחישבו וכך יכולים לתת תוצאה מהר יותר אם לקוח מנסה לחשב את אותו ערך מספר פעמים (ממספר קומפוננטות שונות).
אבל הערך האמיתי של Selectors מתגלה כשאנחנו צריכים לארגן מחדש את ה Store.
בעולם רגיל עם המון קומפוננטות שניגשות למידע, אפילו שינוי בסיסי כמו שינוי שם של שדה יכול לגרור שינויים בעשרות קבצים.
הסיבה היא שבקוד הקומפוננטה יש התיחסות ישירה לשם השדה ולמקום שלו בתוך אוביקט ה Store:
function TodoCount() {
const todos = useSelector(state => state.todos)
return <p>{todos.length} things to do</p>
}
מבנה טוב יותר ייקח את כל הקריאות האלה ל useSelector
לקובץ אחד, קובץ הסלקטורים. שם יהיה לנו למשל:
export const getTodos = state => state.todos;
ובתוך הקומפוננטה נכתוב רק:
function TodoCount() {
const todos = useSelector(getTodos)
return <p>{todos.length} things to do</p>
}
אפילו בלי Reselect ובלי ה Memoization הרווחנו המון - אם נקיד לכתוב את כל הסלקטורים במקום אחד, שינוי במבנה הסטייט או שינויי שמות יהיו הרבה יותר קלים למימוש ולא ידרשו שינוי בקומפוננטות.