π Higher-Order Components (HOC) Π² React: ΠΠ°ΡΡΠ΅ΡΠ½ Π΄Π»Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π»ΠΎΠ³ΠΈΠΊΠΈ
ΠΡΠΈΠ²Π΅Ρ, Π΄ΡΡΠ·ΡΡ!
π Π‘Π΅Π³ΠΎΠ΄Π½Ρ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎ
Higher-Order Components (HOC) β ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ
ΠΏΠ°ΡΡΠ΅ΡΠ½ΠΎΠ² Π² React, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ.
πΉ Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ HOC?
HOC (ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π²ΡΡΡΠ΅Π³ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ°) β ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΎΠ²ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡΡ.
HOC β ΠΎΠ±ΡΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ. ΠΡΠΎ ΡΠΊΠΎΡΠ΅Π΅ ΠΎΠ±ΡΡΡΠΊΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ°ΡΡΠΈΡΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» Π²Π°ΡΠΈΡ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ².
Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ:
const withExtraProps = (WrappedComponent) => {
return (props) => {
// ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π½ΠΎΠ²ΡΠ΅ ΠΏΡΠΎΠΏΡΡ ΠΈΠ»ΠΈ Π»ΠΎΠ³ΠΈΠΊΡ
const extraProps = { additional: 'value' };
return <WrappedComponent {...props} {...extraProps} />;
};
};
πΉ ΠΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ HOC?
HOC ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° Π½ΡΠΆΠ½ΠΎ:
1.
ΠΠΎΠ²ΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ.
2.
ΠΠ±ΠΎΡΠ°ΡΠΈΠ²Π°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ, Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π΄Π°Π½Π½ΡΡ
.
3.
ΠΠΎΠ±Π°Π²ΠΈΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΏΡΠΎΠΏΡΡ ΠΈΠ»ΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ.
ΠΡΠΈΠΌΠ΅Ρ: HOC Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ.
πΉ ΠΡΠΈΠΌΠ΅Ρ HOC
ΠΠ°Π΄Π°ΡΠ°: Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ HOC Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π°Π²ΡΠΎΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ
ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ.
import React from 'react';
// HOC Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ
const withAuth = (WrappedComponent) => {
return (props) => {
const isAuthenticated = props.isAuthenticated; // ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΏΡΠΎΠΏΡ
if (!isAuthenticated) {
return <div>ΠΠΎΡΡΡΠΏ Π·Π°ΠΏΡΠ΅ΡΡΠ½. ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, Π²ΠΎΠΉΠ΄ΠΈΡΠ΅ Π² ΡΠΈΡΡΠ΅ΠΌΡ.</div>;
}
return <WrappedComponent {...props} />;
};
};
// ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°
const UserProfile = (props) => {
return <div>ΠΡΠΈΠ²Π΅Ρ, {props.name}! ΠΡΠΎ ΡΠ²ΠΎΠΉ ΠΏΡΠΎΡΠΈΠ»Ρ.</div>;
};
// ΠΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ
const ProtectedUserProfile = withAuth(UserProfile);
// ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
export default function App() {
return (
<div>
<ProtectedUserProfile isAuthenticated={false} name="ΠΠ»Π΅ΠΊΡΠ΅ΠΉ" />
</div>
);
}
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ: ΠΡΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π΅ Π°Π²ΡΠΎΡΠΈΠ·ΠΎΠ²Π°Π½, Π²ΠΌΠ΅ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°
UserProfile
ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ "ΠΠΎΡΡΡΠΏ Π·Π°ΠΏΡΠ΅ΡΡΠ½".
πΉ ΠΠ°ΠΆΠ½ΡΠ΅ Π°ΡΠΏΠ΅ΠΊΡΡ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ HOC
1.
ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° ΠΏΡΠΎΠΏΡΠΎΠ²
HOC Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π²ΡΠ΅ ΠΏΡΠΎΠΏΡΡ Π²Π½ΡΡΡΡ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΠΎΡΡΠ°Π²Π°Π»ΡΡ Π³ΠΈΠ±ΠΊΠΈΠΌ:
<WrappedComponent {...props} />
2.
ΠΠ΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎΠ΅ ΠΈΠΌΡ
ΠΡΠΈΠ΄ΡΠΌΠ°ΠΉΡΠ΅ ΡΠΈΡΠ°Π΅ΠΌΠΎΠ΅ ΠΈΠΌΡ Π΄Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ HOC, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,
withAuth
,
withLogger
.
3.
ΠΠ΅ ΠΏΠ΅ΡΠ΅ΡΡΠ»ΠΎΠΆΠ½ΡΠΉΡΠ΅
HOC ΠΌΠΎΠΆΠ΅Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠΎΠ΄ ΡΠ»ΠΎΠΆΠ½Π΅Π΅ Π΄Π»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ. ΠΡΠ»ΠΈ Π»ΠΎΠ³ΠΈΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ½Π΅ΡΡΠΈ Π² ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠ΅ Ρ
ΡΠΊΠΈ β Π²ΡΠ±ΠΈΡΠ°ΠΉΡΠ΅ ΠΈΡ
.
4.
ΠΠ΅ ΠΌΡΡΠΈΡΡΠΉΡΠ΅ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ
HOC Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, Π° ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°ΡΡ Π΅Π³ΠΎ.
πΉ ΠΠΎΠ³Π΄Π° ΠΠ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ HOC
Π‘Π΅Π³ΠΎΠ΄Π½Ρ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΅ΡΠ°Π»ΠΈΡΡ ΡΠ΅ΡΠ΅Π· HOC, ΠΏΡΠΎΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ:
-
Custom Hooks Π΄Π»Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π»ΠΎΠ³ΠΈΠΊΠΈ.
-
Context API Π΄Π»Ρ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ.
HOC ΠΎΡΡΠ°ΡΡΡΡ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠΌ, Π½ΠΎ Π΅Π³ΠΎ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΡΡΡ ΡΠ½ΠΈΠΆΠ°Π΅ΡΡΡ Π² ΠΏΠΎΠ»ΡΠ·Ρ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΡΡ
ΡΠ΅ΡΠ΅Π½ΠΈΠΉ.
π― ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Higher-Order Components β ΠΌΠΎΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, Π΅ΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌ, ΡΠΎΡ
ΡΠ°Π½ΡΡ ΠΈΡ
ΡΠΈΡΡΠΎΡΡ ΠΈ ΠΏΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΡΡΡ. ΠΠΎ ΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ HOC β Π½Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π»ΠΎΠ³ΠΈΠΊΠΈ, ΠΈ Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
ΡΠ»ΡΡΠ°ΡΡ
ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠ΅ Ρ
ΡΠΊΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π»ΡΡΡΠΈΠΌ Π²ΡΠ±ΠΎΡΠΎΠΌ
π
ReactJs Daily | #begginers