πŸš— Π‘Π°ΠΌΡ‹ΠΉ «скользкий» ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π² Redux – useSelector

Redux Π²Ρ€ΠΎΠ΄Π΅ ΠΊΠ°ΠΊ ΠΈΠ·ΡƒΡ‡ΠΈΠ»ΠΈ вдоль ΠΈ ΠΏΠΎΠΏΠ΅Ρ€Π΅ΠΊ, Π½ΠΎ ΠΎΡ‚ этого ΠΎΠ½ Π½Π΅ стал ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ. Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· самых нСприятных ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² Π² Redux, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΡ‚Ρ€Π΅Π»ΡΡŽΡ‚ сСбС Π² Π½ΠΎΠ³Ρƒ – useSelector.

ВсСм ΠΏΡ€ΠΈΠ²Π΅Ρ‚!

Redux Π²Ρ€ΠΎΠ΄Π΅ ΠΊΠ°ΠΊ ΠΈΠ·ΡƒΡ‡ΠΈΠ»ΠΈ вдоль ΠΈ ΠΏΠΎΠΏΠ΅Ρ€Π΅ΠΊ, Π½ΠΎ ΠΎΡ‚ этого ΠΎΠ½ Π½Π΅ стал ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ. Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· самых нСприятных ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² Π² Redux, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΡ‚Ρ€Π΅Π»ΡΡŽΡ‚ сСбС Π² Π½ΠΎΠ³Ρƒ. БобствСнно, этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΌΡ‹ ΠΈ ΠΈΠ·ΡƒΡ‡ΠΈΠΌ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ (данная ΡΡ‚Π°Ρ‚ΡŒΡ являСтся Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠΎΠΉ этого Π²ΠΈΠ΄Π΅ΠΎ):

Бкрытная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ useSelector

И Ρ‚Π°ΠΊ Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ с ΠΎΠ±Ρ‰Π΅ΠΉ схСмы.

Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Cars со списком машин. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ этот список машин, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ useSelector с сСлСктором getCars, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΈΠ΄Π΅Ρ‚ Π² Redux Π·Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ Π½Π°ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. И Π² ΠΈΡ‚ΠΎΠ³Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ Π²Ρ‹Ρ‚ΡΠ³ΠΈΠ²Π°Ρ‚ΡŒΡΡ, ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΊΠΎΠ½Π΅Ρ† Π²ΠΈΠ΄ΠΈΡ‚ список машин Ρƒ сСбя Π½Π° страницС:

Π”Π°Π»Π΅Π΅, допустим, Ρ‡Ρ‚ΠΎ Π² этом ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅ ΠΌΡ‹ Π²Ρ‹Π·Π²Π°Π»ΠΈ action с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π½ΠΎΠ²ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π² список машин. БобствСнно этот action ΠΈ обновляСт Redux store, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ Π² список:

Π”Π°Π»Π΅Π΅, ΠΊΠ°ΠΊ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Redux store Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ наш ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚. Но вопрос, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½ это Π΄Π΅Π»Π°Π΅Ρ‚ с тСхничСской стороны?

Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ это ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: useSelector Π½Π΅ просто считываСт Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Redux store ΠΏΡ€ΠΈ любом ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ Π΅Ρ‰Π΅ нСявно подписываСтся Π½Π° Π»ΡŽΠ±Ρ‹Π΅ измСнСния Redux store (Π±Π΅ΠΆΠ΅Π²Ρ‹Π΅ Ρ‡Π΅Ρ€Ρ‚ΠΎΡ‡ΠΊΠΈ Π½Π° рисункС).

И ΠΊΠΎΠ³Π΄Π° ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰Π΅Π΅ нас Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Redux store измСняСтся, useSelector Π΅Ρ‰Π΅ ΠΈ заставляСт вСсь Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΏΠ΅Ρ€Π΅ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒΡΡ. Π’ ΠΈΡ‚ΠΎΠ³Π΅ послС dispatch(addCar(newCar)), ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ reducer ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ наш Redux store. И благодаря Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ useSelector подписан Π½Π° измСнСния Π² Redux store ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΆΠ΅Π»Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅Π½Π΄Π΅Ρ€ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° с Π½ΠΎΠ²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ cars, Π³Π΄Π΅ ΡƒΠΆΠ΅ Π² спискС присутствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ добавлСнная машина:

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ useSelector Π½Π΅ Ρ‚Π°ΠΊ прост, ΠΊΠ°ΠΊ каТСтся. Π­Ρ‚ΠΎ Π½Π΅ просто ΠΌΠ΅Ρ‚ΠΎΠ΄ для получСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Redux store. На Π½Π΅ΠΌ Π»Π΅ΠΆΠΈΡ‚ ΠΊΡƒΠ΄Π° большС отвСтствСнности, Ρ‡Π΅ΠΌ каТСтся Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд.

ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ всю ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ, которая Π»Π΅ΠΆΠΈΡ‚ Π½Π° useSelector, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ страничка, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ. НиТС ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ со списком Ρ‚Π΅Ρ… самых машин, Π° послС Π½Π΅Π³ΠΎ ΠΏΡƒΡΡ‚ΡŒ Π΅Ρ‰Π΅ Π±ΡƒΠ΄Π΅Ρ‚ список Π΄ΠΈΠ»Π΅Ρ€ΠΎΠ², Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ приобрСсти Π½ΠΎΠ²ΠΎΠ΅ Π°Π²Ρ‚ΠΎ:

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· этих ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² нуТдаСтся Π² Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Redux. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Ρƒ Π½ΠΈΡ… всСх ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ useSelector. Волько ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ тянСт свои Π΄Π°Π½Π½Ρ‹Π΅. ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ сСлСктор getCurrentUser, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ с машинами, соотвСтствСнно, тянСт список машин с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ getCars. И ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ с Π΄ΠΈΠ»Π΅Ρ€Π°ΠΌΠΈ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, тянСт список Π΄ΠΈΠ»Π΅Ρ€ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ getDealers. На Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: всС эти сСлСкторы тянут ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Redux store:

Π’Ρ€ΠΎΠ΄Π΅ с Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ условиями Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ прСдставим, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π²Ρ‹Π·Π²Π°Π»ΠΈ Ρ‚ΠΎΡ‚ самый action с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π½ΠΎΠ²ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹. ВслСдствиС Ρ‡Π΅Π³ΠΎ Redux store Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ ΠΈ, соотвСтствСнно, ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ всСм useSelector сигнал, ΠΌΠΎΠ», ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ваши ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. И, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ useSelector ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° с машинами СдинствСнный обновится Π² Π΄Π°Π½Π½ΠΎΠΉ ситуации. Π­Ρ‚ΠΎ Π·Π²ΡƒΡ‡ΠΈΡ‚ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΌΠ°ΡˆΠΈΠ½Ρƒ, Π° Π½Π΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π΄ΠΈΠ»Π΅Ρ€Π°

Π—Π²ΡƒΡ‡ΠΈΡ‚ ΠΊΡ€Π°ΠΉΠ½Π΅ просто ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Π½ΠΎ Ρƒ этого всСго Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΡƒΠ·ΠΊΠΎΠ΅ Π³ΠΎΡ€Π»Ρ‹ΡˆΠΊΠΎ – useSelector, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Π³ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ…Ρ€ΡƒΠΏΠΊΠΈΠΉ, Ρ‡Ρ‚ΠΎ я Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ Π²ΠΈΠ΄Π΅Π», ΠΊΠ°ΠΊ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… вмСсто ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Cars ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π° любой Ρ‡ΠΈΡ… сразу всС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹. И Π½Π΅Π²Π°ΠΆΠ½ΠΎ, добавляли ΠΌΡ‹ ΠΌΠ°ΡˆΠΈΠ½Ρƒ ΠΈΠ»ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

ΠŸΡ€ΠΎΡΡ‚ΠΎ Π·Π°Π΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ΡΡŒ, насколько Π²Π΅Π»ΠΈΠΊΠ° Ρ†Π΅Π½Π° нСпонимания Ρ€Π°Π±ΠΎΡ‚Ρ‹ этого ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°, Ссли Ρƒ вас вся страница зависит ΠΎΡ‚ Redux Π΄Π°Π½Π½Ρ‹Ρ…. ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π° с этим ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ всС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½Π° Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ любой action. А actions Ρƒ вас ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ количСство. Π’ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΌ быстродСйствии прилоТСния ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΎΠ»ΠΈΡ‚ΡŒΡΡ Π½Π° Π²Ρ‹Π½ΠΎΡΠ»ΠΈΠ²ΠΎΡΡ‚ΡŒ устройств ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ ΡƒΠ·ΠΊΠΎΠ΅ Π³ΠΎΡ€Π»Ρ‹ΡˆΠΊΠΎ

Π‘Π°ΠΌΠΎΠ΅ врСмя Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² дСталях, Ρ‡Ρ‚ΠΎ ΠΈΠ· сСбя прСдставляСт Ρ‚ΠΎΡ‚ самый ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ. Покопавшись Π² исходниках, я Π±Ρ‹ Π°ΠΊΡ†Π΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π» Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ мСстС. НачнСм с 70 ΠΈ 71 строк:

// We may be able to reuse the previous invocation's result.
const prevSnapshot: Snapshot = (memoizedSnapshot: any);
const prevSelection: Selection = (memoizedSelection: any);

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ создаСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ prevSnapshot ΠΈ Π½ΠΈΠΆΠ΅ prevSelection. Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ слова prev, snapshot ΠΈ selection Π² ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅ Π½Π° Π·Π½Π°ΠΊΠΎΠΌΡ‹Π΅ Π½Π°ΠΌ слова. Snapshot Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌ state. Π’ΠΎ Π΅ΡΡ‚ΡŒ это состояниС всСго Redux store, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ ΠΏΠΎΡ‚ΠΎΠΌ достаСм Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ»ΠΈ список машин ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

const getCars = (state) => state.cars
const getCurrentUser = (state) => state.currentUser

А selection ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚Π°ΠΊΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠ΅ нас Π΄Π°Π½Π½Ρ‹Π΅, Ρ‚Π΅ самыС ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΈΠ»ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ. Π’Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ наш сСлСктор.

Π”Π°Π»Π΅Π΅ ΠΎ приставкС prev ΠΈ Π΅Ρ‰Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ приставку next. Они ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅. Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ список ΠΈΠ· 2 машин. И ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Ρ‚ΡƒΠ΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ ΠΌΠ°ΡˆΠΈΠ½Ρƒ. БоотвСтствСнно, prev состояниС, это ΠΊΠΎΠ³Π΄Π° ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π΅Ρ‰Π΅ 2, Π° next состояниС – это ΠΊΠΎΠ³Π΄Π° машин ΡƒΠΆΠ΅ 3. Π’ΠΎ Π΅ΡΡ‚ΡŒ это Π΄ΠΎ измСнСния любой части Redux store ΠΈ послС измСнСния.

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Π°ΠΌ Π±Ρ‹Π»ΠΎ Π»Π΅Π³Ρ‡Π΅ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ исходники, я Ρ€Π΅ΡˆΠΈΠ» ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ со Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΌΠΈ для нас всСх словами Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ со списком машин.

// We may be able to reuse the previous invocation's result.
const prevState: State = (memoizedSnapshot: any);
const prevCars: Cars = (memoizedSelection: any);

if (is(prevState, nextState)) {
  // The snapshot is the same as last time. Reuse the previous selection.
  return prevState;
}

// The snapshot has changed, so we need to compute a new selection.
const nextCars = getCars(nextState);

// If a custom isEqual function is provided, use that to check if the data
// has changed. If it hasn't, return the previous selection. That signals
// to React that the selections are conceptually equal, and we can bail
// out of rendering.
if (isEqual !== undefined && isEqual(prevCars, nextCars)) {
  return prevCars;
}

memoizedSnapshot = nextState;
memoizedSelection = nextCars;
return nextCars;

ΠŸΠ΅Ρ€Π²Ρ‹Π΅ строки ΠΌΡ‹ ΡƒΠΆΠ΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈ. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ if, Π³Π΄Π΅ ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ состояниС всСго стора ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС всСго стора. Π‘Ρ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΎΠ½ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ is. Под ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Π°Ρ функция Object.is. ΠœΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ³ΡƒΠ³Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ Ссли Π²ΠΊΡ€Π°Ρ‚Ρ†Π΅, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΎΠ½Π° сравниваСт ссылки ΠΎΠ±ΠΎΠΈΡ… Redux store. Если это ΠΎΠ΄Π½Π° ΠΈ Ρ‚Π° ΠΆΠ΅ ссылка Π² памяти, ΠΌΡ‹ просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ список машин ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Ρ€Π΅Π½Π΄Π΅Ρ€ΠΎΠ².

Поясню, для Ρ‡Π΅Π³ΠΎ это Π½ΡƒΠΆΠ½ΠΎ Π½Π° простом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ с ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ состояниСм. А Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΡ‹ достаСм ΠΈΠ· Redux store Ρ‚ΠΎΡ‚ самый список машин. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π° экранС Π²ΠΈΠ΄ΠΈΡ‚, ΠΊΠ°ΠΊ систСма ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, сколько Ρƒ Π½Π΅Π΅ машин Π² Π°Π²Ρ‚ΠΎΠΏΠ°Ρ€ΠΊΠ΅. И ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚: «А сколько машин Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² Π½Π°Π»ΠΈΡ‡ΠΈΠΈ?Β». И прСдоставлСно ΠΏΠΎΠ»Π΅ Π²Π²ΠΎΠ΄Π° для ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π° этот вопрос.

import { useState } from 'react';
import { useSelector } from 'react-redux';

export const SomeComponent = () => {
  const [answer, setAnswer] = useState('');
  
  const cars = useSelector(state => state.cars);

  const onChange = (event) => {
    setAnswer(event.target.value);
  }

  return (
    <div>
      <h1>Π£ мСня {cars.length} машин! Π° Ρƒ тСбя?</h1>
      <input value={answer} onChange={onChange} />
    </div>
  );
};

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²ΠΎΠ΄ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² input ΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π±ΡƒΠΊΠ²Ρƒ вызываСтся функция setAnswer. Π§Ρ‚ΠΎ являСтся ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Ρ€Π΅Π½Π΄Π΅Ρ€Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°. И Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π΅Π½Π΄Π΅Ρ€ useSelector Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ список машин, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ состояниС Redux store Π½Π΅ мСняСтся Π² этих случаях. И Ρ‡Ρ‚ΠΎΠ±Ρ‹ useSelector Π½Π΅ Π΄Π΅Π»Π°Π» Π»ΠΈΡˆΠ½ΠΈΡ… вычислСний ΠΈ сущСствуСт Ρ‚Π° самая if ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π² ΠΊΠΎΠ΄Π΅, Π³Π΄Π΅ сравниваСтся, измСнялся Π»ΠΈ Redux store с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Ρ€Π΅Π½Π΄Π΅Ρ€Π°.

Π₯ΠΎΡ€ΠΎΡˆΠΎ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ допустим, Ρ‡Ρ‚ΠΎ Redux store измСнился ΠΈ рассмотрим дальнСйший ΠΊΠΎΠ΄.

// The snapshot has changed, so we need to compute a new selection.
const nextCars = getCars(nextState);

// If a custom isEqual function is provided, use that to check if the data
// has changed. If it hasn't, return the previous selection. That signals
// to React that the selections are conceptually equal, and we can bail
// out of rendering.
if (isEqual !== undefined && isEqual(prevCars, nextCars)) {
  return prevCars;
}

memoizedSnapshot = nextState;
memoizedSelection = nextCars;
return nextCars;

Π’Π°ΠΊ ΠΊΠ°ΠΊ Redux store измСнился, Π½ΠΎ ΠΌΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ измСнилось, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŒ список машин ΠΈΠ· next Redux store ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π° измСнСния. Π§Ρ‚ΠΎ, собствСнно, ΠΈ происходит. И Π΄Π°Π»Π΅Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ isEqual сравниваСм, измСнился список машин ΠΈΠ»ΠΈ Π½Π΅ измСнился.

И Ссли список машин Π½Π΅ измСнился, Ρ‚ΠΎ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ список машин ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Ρ€Π΅Π½Π΄Π΅Ρ€ΠΎΠ². А Ссли измСнился, Π² Ρ‚Π°ΠΊΠΎΠΌ случаС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΡƒΠΆΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ список машин ΠΈ Π½Π΅ просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ список машин, Π° Π΅Ρ‰Π΅ ΠΈ заставляСм ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ΡŒΡΡ. Π’ΠΎ, ΠΎ Ρ‡Π΅ΠΌ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅.

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ Π²ΠΎΡ‚ эти Π΄Π²Π° if-условия ΠΈ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΡ‚ самый ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΊΠΎΠΌΡƒ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ΡŒΡΡ послС любого измСнСния Π² Redux store, Π° ΠΊΠΎΠΌΡƒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ΡŒΡΡ. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ useSelector заставляСт Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ΡŒΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΌΠΎΠ΅ΠΌ Π²ΠΈΠ΄Π΅ΠΎ с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ «ВсС Π»ΠΈ Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅ ΠΎ useSelector?Β», Π° ΠΏΠΎΠΊΠ° Π΄Π°Π²Π°ΠΉΡ‚Π΅ вСрнСмся ΠΊ нашим if-условиям.

Если Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ if-условии ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ сравнСниС ΠΈΠ΄Π΅Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Object.is ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ инстансы Redux store, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΌΡ‹ создаСм, Π² Ρ‚Π°ΠΊΠΎΠΌ случаС ΡˆΠ°Π½ΡΡ‹ ΡΠ»ΠΎΠΌΠ°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ здСсь Π½Π΅ Π²Π΅Π»ΠΈΠΊΠΈ.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π²Ρ‚ΠΎΡ€ΠΎΠ΅ if-условиС выглядит ΠΊΡƒΠ΄Π° опаснСС. Π—Π΄Π΅ΡΡŒ ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ нСпосрСдствСнно Ρ‚Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠΈΠ· сСлСктора, Ρ‚. Π΅. Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΌΡ‹ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠ»ΠΈ список машин. И Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ список машин ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅, зависит, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, ΠΎΡ‚ способа сравнСния. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ isEqual. И Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ это Π·Π° функция, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ исходникам Ρ…ΡƒΠΊΠ° useSelector

return function useSelector<TState, Selected extends unknown>(
  selector: (state: TState) => Selected,
  equalityFn: EqualityFn<NoInfer<Selected>> = refEquality
) {

// ...

}

Как Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, useSelector ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π΅ ΠΎΠ΄ΠΈΠ½, Π° Ρ†Π΅Π»Ρ‹Ρ… Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ называСтся equalityFn, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ. Π’ΠΎ Π΅ΡΡ‚ΡŒ, Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΠΌ способом Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ deepEqual, которая Π±ΡƒΠ΄Π΅Ρ‚ Π³Π»ΡƒΠ±ΠΎΠΊΠΎ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ список машин.

const cars = useSelector(getCars, deepEqual);

Но Ρ‡Π°Ρ‰Π΅ всСго ΠΌΡ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π½ΠΈΠΊΠ°ΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Π·Π° функция Π² Ρ‚Π°ΠΊΠΎΠΌ случаС сравниваСт списки машин? Если Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ ΠΊΠΎΠ΄Ρƒ ΠΈ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Ρƒ подставляСтся функция refEquality. Она описана Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ Ρ„Π°ΠΉΠ»Π΅. ВсС Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π΄Π΅Π»Π°Π΅Ρ‚, это сравниваСт Π΄Π²Π° значСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Ρ€ΠΎΠΉΠ½ΠΎΠ³ΠΎ Ρ€Π°Π²Π½ΠΎ. Π”Π°, всС Ρ‚Π°ΠΊ просто. Π’ этом ΠΈ кроСтся Ρ…Ρ€ΡƒΠΏΠΊΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°.

const refEquality: EqualityFn<any> = (a, b) => a === b

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ всю ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΡΡ‚ΡŒ этой ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, Π½ΡƒΠΆΠ½ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ сравнСниСм ΠΏΠΎ ссылкС ΠΈ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ. Если Π²Ρ‹ Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, ΠΎ Ρ‡Π΅ΠΌ ΠΈΠ΄Π΅Ρ‚ Ρ€Π΅Ρ‡ΡŒ, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΏΠΎΠ³ΡƒΠ³Π»ΠΈΡ‚ΡŒ Ρ„Ρ€Π°Π·Ρƒ Β«js сравнСниС ΠΏΠΎ ссылкС ΠΈ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽΒ».

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ всю ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ происходящСго, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π£ нас Π΅ΡΡ‚ΡŒ сСлСктор всС Ρ‚Π΅Ρ… ΠΆΠ΅ машин. Π£ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π΅ΡΡ‚ΡŒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ ΠΏΠΎ минимальной ΠΈ максимальной Ρ†Π΅Π½Π΅ ΠΌΠ°ΡˆΠΈΠ½Ρ‹. И Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ список Ρ‚Π΅Ρ… машин, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ удовлСтворяСт Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°ΠΌ.

const getFilteredCars = (state) => {
  const minPrice = getMinPriceFilter(state);
  const maxPrice = getMaxPriceFilter(state);
  const cars = getCars(state);

  return cars.filter(
    (car) => car.price >= minPrice && car.price <= maxPrice
  );
};

РСшСниС Π²Ρ€ΠΎΠ΄Π΅ ΠΊΠ°ΠΊ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅, Π½ΠΎ Π΅ΡΡ‚ΡŒ малСнький ΠΏΠΎΠ΄Π²ΠΎΡ…. ΠœΠ΅Ρ‚ΠΎΠ΄ filter всСгда, ΠΎΡ‚ слова 100%, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ ссылку массива.

Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Ссли ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ сСлСктор, с ΠΎΠ΄Π½ΠΈΠΌΠΈ ΠΈ Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΄Π²Π°ΠΆΠ΄Ρ‹ ΠΈ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ, Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ эквивалСнтными. Π₯ΠΎΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ списки машин.

getFilteredCars(state) !== getFilteredCars(state)

БоотвСтствСнно, Ссли Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌ Ρ€Π°Π½Π΅Π΅.

НС Π²Π°ΠΆΠ½ΠΎ обновился Ρƒ вас список Π΄ΠΈΠ»Π΅Ρ€ΠΎΠ² ΠΈΠ»ΠΈ ΠΆΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ. Π£ вас всСгда Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ΡŒΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ с машинами, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ getFilteredCars сСлСктор всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ссылку Π½Π° список машин.

А ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ссли Ρƒ вас Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° сломанных сСлСкторов. И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π° Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ любой экшСн Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ΡŒΡΡ Ρ‡ΡƒΡ‚ΡŒ Π»ΠΈ Π½Π΅ вся страница, просто ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ сСлСктор написан Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄Π°Ρ‡Π½ΠΎ. О Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΌ быстродСйствии, ΠΌΠ½Π΅ каТСтся, Π² Ρ‚Π°ΠΊΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΌΠ΅Ρ‡Ρ‚Π°Ρ‚ΡŒ ΡƒΠΆΠ΅ Π½Π΅ приходится.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½ΠΎ ΠΈ Π΄Π°ΠΆΠ΅ Π΅ΡΡ‚ΡŒ имя Ρƒ этого Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ – reselect. Но сСгодня Π΅Π³ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ

Для Ρ‡Π΅Π³ΠΎ писалась эта ΡΡ‚Π°Ρ‚ΡŒΡ

ИдСя Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ – ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒ вас с тонкостями ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ Redux Π² React. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° присутствуСт Π² вашСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΈ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ сказываСтся Π½Π° работоспособности прилоТСния, Π½ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ хотя Π±Ρ‹ Π·Π½Π°Ρ‚ΡŒ ΠΎ Π½Π΅ΠΉ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ сСлСкторы Π² Prod Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

***
Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π΅Ρ€Π°Β»

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•