Добијање селектора у Redux-у

Понекад је врло корисно ослободити се непотребног кода у апликацији, као и инкапсулирати податке.

Отворимо нашу апликацију са производима. Обратите пажњу да на неколико места апликације ми, користећи селекторе, извлачимо слајс са производима да бисмо с њим извршили неке акције.

А сада ћемо отворити наш productsSlice.js, спустити се на крај фајла и додати пар линија кода, у којима ћемо написати два селектора и извезати их. Једна функција ће нам бити за добијање свих производа:

products/productsSlice.jsexport const selectAllProducts = (state) => state.products.products

А после ње друга - за добијање једног производа по id:

products/productsSlice.jsexport const selectProductById = (state, productId) =>
  state.products.products.find((product) => product.id === productId)

Наравно може вам наћи на ум праведно питање - одакле нам такав наврат: state.products.products? Одговор је једноставан, ми смо на прошлом часу променили структуру слајса и сада ће наши производи бити на располагању у виду низа у засебном својству products слајса производа state.products (запамтите да овде state представља коренов објекат стања Redux-а, који садржи све слајсове).

На тај начин смо једноставно преместили код за функције-селекторе на једно место у апликацији и сада треба да унесемо одговарајуће измене тамо, где смо их користили. Почнимо са фајлом ProductsList.jsx. И увезимо у њега selectAllProducts, пошто нам овде треба да добијемо све производе:

products/ProductsList.jsximport { selectAllProducts } from './productsSlice'

И на почетку кода функције ProductsList, заменимо:

products/ProductsList.jsxconst products = useSelector((state) => state.products)

Са линијом:

products/ProductsList.jsxconst products = useSelector(selectAllProducts)

А сада идемо на фајл ProductPage.jsx. Овде нам је био потребан производ по id. Направимо замену линије (не заборавите на увоз):

products/ProductPage.jsxconst product = useSelector((state) =>
  state.products.find((product) => product.id === productId)
)

Са:

products/ProductPage.jsxconst product = useSelector((state) => selectProductById(state, productId))

Направите сами такву замену у фајлу EditProductForm.jsx. Овде нам такође треба производ по id.

Запамтите да таква оптимизација служи само за вашу погодност и можете је урадити онда, кад то сматрате потребним и погодним. А на нашем примеру замислите да бисмо писали код функције-селектора сваки пут у различитим местима, а онда бисмо променили структуру стања, и морали бисмо га онда исправљати у свим компонентама.

Задание 1

Отворите вашу апликацију са студентима. Отворите у њој фајл studentsSlice.js. На самом дну фајла напишите и извезите, како је показано на часу, два селектора за добијање свих студената selectAllStudents и за добијање једног студента по id selectStudentById.

Задание 2

Сада увезите selectAllStudents и selectStudentById у фајлове StudentsList.jsx, StudentPage.jsx и EditStudentForm.jsx, унесите у тим фајловима одговарајуће измене, како је показано на часу.