πŸ“– Π˜ΡΡ‚ΠΎΡ€ΠΈΡ «Stop unnecessary re-rendering component in React !!!»

ΠΊΠΎΠ³Π΄Π°-Ρ‚ΠΎ Π΄Π°Π²Π½ΠΎ…

πŸ’Ž ГСнСрация ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° класса

🚩 Чистый ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚()

Π‘Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ ΠΈ старый props/state, Ссли ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Π°, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ рСндСрится

ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ?? Π½ΠΎ ΠΊΠ°ΠΊ ΠΈΡ… ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ????

<< случай Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° Π² React >>

  1. ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ состояния
  2. Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ рСндСрится
  3. измСнСния Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Π°
  4. функция shouldcomponentUpdate Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true (ΠΎΠ± этом я расскаТу ΠΏΠΎΠ·ΠΆΠ΅)
  5. forceUpdate

для Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² 1 ΠΈ 2, React Ρ€Π΅ΡˆΠ°Π΅Ρ‚, Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· Π½Π΅Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ сравнСниС.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π½Π΅Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ сравнСниС?

Для Π½Π°Ρ‡Π°Π»Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ссылка
β–Ό с этого сайта

  1. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠΎ ссылкС (Π½Π΅Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅)
    Если Π²Ρ‹ Π½Π°Π»ΠΈΠ²Π°Π΅Ρ‚Π΅ ΠΊΠΎΡ„Π΅ Π² ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ‡Π°ΡˆΠΊΡƒ, Ρ‚ΠΎ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡˆΠΊΠ° Ρ‚ΠΎΠΆΠ΅ наполнится ΠΈΠΌ (ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ±Π° Π΄Π°Π½Π½Ρ‹Ρ… находятся Π² ΠΎΠ΄Π½ΠΎΠΌ пространствС выдСлСния памяти)

  2. ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ (Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅)
    Если Π²Ρ‹ Π½Π°Π»ΠΈΠ²Π°Π΅Ρ‚Π΅ ΠΊΠΎΡ„Π΅ Π² ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ‡Π°ΡˆΠΊΡƒ, ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡˆΠΊΠ° остаСтся пустой

Π² Javascript ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… (String, Number, Bigint, Boolean, Undefined, Symbol) ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, Π° Object, Array — ΠΏΠΎ ссылкС.

ЧСстно говоря, сравнСниС с ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ Ρ‚Π°ΠΊ слоТно, Π½ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ сравнСнии с Object.

случай ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅

import shallowCompare from 'react-addons-shallow-compare';

const a = { country: "poland", country2: "japan" }
const b = a

console.log(shallowEqual(a, b))
// true
Π’Ρ…ΠΎΠ΄ Π² полноэкранный Ρ€Π΅ΠΆΠΈΠΌ Π’Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· полноэкранного Ρ€Π΅ΠΆΠΈΠΌΠ°

случай ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ отличаСтся

  1. Π½Π΅ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚
import shallowCompare from 'react-addons-shallow-compare';

const a = { country: "poland", country2: "japan" }
const b = { country: "poland", country2: "japan" }

console.log(shallowEqual(a, b))
// true
Π’ΠΎΠΉΡ‚ΠΈ Π² полноэкранный Ρ€Π΅ΠΆΠΈΠΌ Π’Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· полноэкранного Ρ€Π΅ΠΆΠΈΠΌΠ°
  1. Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚
import shallowCompare from 'react-addons-shallow-compare';

const a = {
  country: "poland",
  coountry2: {
    city1: "tokyo",
    city2: "osaka"
  }
}

const b = {
  country: "poland", // country is primitive type, scalar data is the same -> true
  country2: { // country2 is object, so reference is different -> false
    city1: "tokyo",
    city2: "osaka"
  }
}

console.log(shallowEqual(a, b))
// ⭐ false
Π’ΠΎΠΉΡ‚ΠΈ Π² полноэкранный Ρ€Π΅ΠΆΠΈΠΌ Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· полноэкранного Ρ€Π΅ΠΆΠΈΠΌΠ°

🚩 shouldComponentUpdate()

πŸ‘¦ Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ всС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ чистыми ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ, Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ?
πŸ‘©πŸ’» Π½Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ сравнСния старого ΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ состояния/процСссов высока
πŸ‘¦ Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ Ρ‚ΠΎΠ³Π΄Π° Π΄Π΅Π»Π°Ρ‚ΡŒ?
πŸ‘©πŸ’» просто Ρ€Π΅ΡˆΠΈΡ‚Π΅ сравнСниС состояния ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‡Π΅Ρ€Π΅Π· «shouldComponentUpdate()»

Π½Π° самом Π΄Π΅Π»Π΅ PureComponent — это ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ рСализуСтся ΠΊΠ΅ΠΌ-Ρ‚ΠΎ (Π±ΡƒΠ΄ΡŒ Ρ‚ΠΎ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ facebook) Ρ‡Π΅Ρ€Π΅Π· shouldComponentUpdate()

// something like that
class PureComponent extends React.Component {
    shouldComponentUpdate(nextProps, nextState) {
        return !(shallowEqual(this.props, nextProps) && shallowEqual(this.state, nextState));
    }
    …
}
Π’Ρ…ΠΎΠ΄ Π² полноэкранный Ρ€Π΅ΠΆΠΈΠΌ Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· полноэкранного Ρ€Π΅ΠΆΠΈΠΌΠ°

πŸ’Ž ПоколСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²

2022 ΠΌΡ‹ находимся Π² этом ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΈ

🚩 React.memo

это ΠΊΠ°ΠΊ PureComponent() + shouldComponentUpdate()

// if new props changes, this component will be rendered
const Button = React.memo(props => {
    return <div>{props.value}</div>
})
Π’Ρ…ΠΎΠ΄ Π² полноэкранный Ρ€Π΅ΠΆΠΈΠΌ Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· полноэкранного Ρ€Π΅ΠΆΠΈΠΌΠ°
// if you put second argument, it is like shouldComponentUpdate()
const Button = React.memo(
    props => {
        return <div>{props.value}</div>
    },
    (nextProps, prevProps) => {
        return nextProps.value === prevProps.value
    }
)
Π’ΠΎΠΉΡ‚ΠΈ Π² полноэкранный Ρ€Π΅ΠΆΠΈΠΌ Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· полноэкранного Ρ€Π΅ΠΆΠΈΠΌΠ°

🚩 useMemo

πŸ‘¦ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ useMemo? это Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ React.memo?
πŸ‘©πŸ’» Π½Π΅Ρ‚, хотя ΠΈ ΠΏΠΎΡ…ΠΎΠΆΠ΅. React.memo Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² React вСрсии16.6, Π° Π·Π°Ρ‚Π΅ΠΌ React hook Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² вСрсии 16.8, useMemo Ρ‚Π°ΠΊΠΆΠ΅.
πŸ‘¦ Π°Π³Π°
πŸ‘©πŸ’» useMemo Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вычислСний.

// when only "products props" changes, this component renders
const Component: React.FC = ({ products }) => {
    const soldoutProducts = React.useMemo(() => products.filter(x => x.isSoldout === true), [products])
}
Π’Ρ…ΠΎΠ΄ Π² полноэкранный Ρ€Π΅ΠΆΠΈΠΌ Π’Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· полноэкранного Ρ€Π΅ΠΆΠΈΠΌΠ°

🚩 useCallback

Когда Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΌΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ, создаСтся новая функция (Π½Π° самом Π΄Π΅Π»Π΅ функция — это просто ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²).
Благодаря этому Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ распознаСт, Ρ‡Ρ‚ΠΎ новая функция отличаСтся ΠΎΡ‚ старой, послС Ρ‡Π΅Π³ΠΎ с Π³Ρ€ΡƒΡΡ‚ΡŒΡŽ пСрСрисовываСт Π΅Π΅.

↓ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ ΠΌΠ΅ΠΆΠ΄Ρƒ дСтским/Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ

πŸ‘¨ Parentγ€Œre-renderiiingggg!!! И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ я воссоздал Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Ρƒ мСня Π΅ΡΡ‚ΡŒ !!!」
πŸ‘Ό Π Π΅Π±Π΅Π½ΠΎΠΊγ€Œ Мама!!! Π”Π°ΠΉ ΠΌΠ½Π΅ свою Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² качСствС Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Π°!!!」
πŸ‘¨ Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒγ€Œok Π― ΠΎΡ‚Π΄Π°ΡŽ Ρ‚Π΅Π±Π΅ свою Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ! 」
πŸ‘Ό Childγ€Œ Well now I need to confirm this object’s memory address is the same same object that I got before ….. Если адрСс Π΄Ρ€ΡƒΠ³ΠΎΠΉ, Ρ‚ΠΎ я Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Ρ‹Π²Π°ΡŽ!!!」

Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ этот Π½Π΅Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³, Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ useCallback

ΠžΡ†Π΅Π½ΠΈΡ‚Π΅ ΡΡ‚Π°Ρ‚ΡŒΡŽ
Procodings.ru
Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ