ΠΊΠΎΠ³Π΄Π°-ΡΠΎ Π΄Π°Π²Π½ΠΎ…
π ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΊΠ»Π°ΡΡΠ°
π© Π§ΠΈΡΡΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ()
Π‘ΡΠ°Π²Π½ΠΈΠ²Π°Π΅ΠΌ Π½ΠΎΠ²ΡΠΉ ΠΈ ΡΡΠ°ΡΡΠΉ props/state, Π΅ΡΠ»ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ Π΅ΡΡΡ ΡΠ°Π·Π½ΠΈΡΠ°, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΡΡΡ
ΡΡΠ°Π²Π½ΠΈΡΡ?? Π½ΠΎ ΠΊΠ°ΠΊ ΠΈΡ ΡΡΠ°Π²Π½ΠΈΡΡ????
<< ΡΠ»ΡΡΠ°ΠΉ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π° Π² React >>
- ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ
- ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΡΡΡ
- ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ΅ΠΊΠ²ΠΈΠ·ΠΈΡΠ°
- ΡΡΠ½ΠΊΡΠΈΡ shouldcomponentUpdate Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ true (ΠΎΠ± ΡΡΠΎΠΌ Ρ ΡΠ°ΡΡΠΊΠ°ΠΆΡ ΠΏΠΎΠ·ΠΆΠ΅)
- forceUpdate
Π΄Π»Ρ Π½ΠΎΠΌΠ΅ΡΠΎΠ² 1 ΠΈ 2, React ΡΠ΅ΡΠ°Π΅Ρ, Π½ΡΠΆΠ½ΠΎ Π»ΠΈ ΡΠ΅Π½Π΄Π΅ΡΠΈΡΡ ΡΠ΅ΡΠ΅Π· Π½Π΅Π³Π»ΡΠ±ΠΎΠΊΠΎΠ΅ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Π½Π΅Π³Π»ΡΠ±ΠΎΠΊΠΎΠ΅ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅?
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡΡ, ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΡΡΡΠ»ΠΊΠ°
βΌ Ρ ΡΡΠΎΠ³ΠΎ ΡΠ°ΠΉΡΠ°
-
ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅ (Π½Π΅Π³Π»ΡΠ±ΠΎΠΊΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅)
ΠΡΠ»ΠΈ Π²Ρ Π½Π°Π»ΠΈΠ²Π°Π΅ΡΠ΅ ΠΊΠΎΡΠ΅ Π² ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ°ΡΠΊΡ, ΡΠΎ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½Π°Ρ ΡΠ°ΡΠΊΠ° ΡΠΎΠΆΠ΅ Π½Π°ΠΏΠΎΠ»Π½ΠΈΡΡΡ ΠΈΠΌ (ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ±Π° Π΄Π°Π½Π½ΡΡ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ) -
ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ (Π³Π»ΡΠ±ΠΎΠΊΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅)
ΠΡΠ»ΠΈ Π²Ρ Π½Π°Π»ΠΈΠ²Π°Π΅ΡΠ΅ ΠΊΠΎΡΠ΅ Π² ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ°ΡΠΊΡ, ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½Π°Ρ ΡΠ°ΡΠΊΠ° ΠΎΡΡΠ°Π΅ΡΡΡ ΠΏΡΡΡΠΎΠΉ
Π² 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
ΡΠ»ΡΡΠ°ΠΉ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ
- Π½Π΅ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ
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
- Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ
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