javascript - Ska jag använda connect eller hooks för react redux och vilket har bättre prestanda?
Jag använder react-redux för mitt react-projekt, tydligen finns det 2 sätt att använda redux-tillståndet connect eller useSelector,
Min redux-butik har en reducer för varje sida,
För startsida > homePageReducer
För Meddelandesida > messagePageReducer
För autentisering > authReducer
För användarens blogg > blogReducer
För Inställningar > userSettingsReducer
För användarens profil > userProfileReducer
I min toppnivåkomponent eller huvudkomponent har jag använt en selector-hook för att hämta alla reducers och skickat ner reducers som props till de nödvändiga komponenterna
const {home, messages, auth, settings, blogs} = useSelector( (state:RootState) => state)
return(
<main>
<Switch>
<Route exact to={HOME_ROUTE}>
<HomeApp auth={auth} settings={settings} userProfile={userProfile}/>
</Route>
<Route exact to={CHAT_ROUTE}>
<ChatApp auth={auth} messages={messages} userProfile={userProfile}/>
</Route>
<Route exact to={BLOG_ROUTE}>
<BlogApp auth={auth} blogs={blogs} userProfile={userProfile}/>
</Route>
</Switch>
</main>
)
Är det en bra arkitektur för mitt projekt och ger inga prestandaproblem för mitt projekt eller borde jag använda connect eller useSelector hook inuti de där komponenterna? Vad är bättre?
Svar #1
Redux har en mycket användbar stilguide som förklarar alla nuvarande bästa metoder. Det finns några rekommendationer på den listan som är tillämpliga på ditt exempel.
Använd React-Redux Hooks API
Föredra att använda React-Redux hooks API (
useSelectorochuseDispatch) som standardmetod för att interagera med en Redux-store från dina React-komponenter.
Anslut fler komponenter för att läsa data från lagret
Föredra att ha fler UI-komponenter som prenumererar på Redux-butiken och läser data på en mer detaljerad nivå. Detta leder vanligtvis till bättre UI-prestanda, eftersom färre komponenter behöver renderas när en viss del av tillståndet ändras.
Anropa useSelector flera gånger i funktionskomponenter
När du hämtar data med
useSelector-hooken, föredra att anropauseSelectormånga gånger och hämta mindre mängder data, istället för att ha ett enda störreuseSelector-anrop som returnerar flera resultat i ett objekt.
Du vill definitivt använda useSelector. Istället för att välja allt i föräldern och skicka ner det, bör dina Route render-komponenter inte ta några props och själva hämta allt de behöver från Redux.
const App = {
return(
<Switch>
<Route exact to={HOME_ROUTE}>
<HomeApp />
</Route>
<Route exact to={CHAT_ROUTE}>
<ChatApp />
</Route>
<Route exact to={BLOG_ROUTE}>
<BlogApp />
</Route>
</Switch>
)
}
const HomeApp = () => {
const userProfile = useSelector( (state: RootState) => state.user );
// We probably don't need the whole auth object
const isLoggedIn = useSelector( (state: RootState) => !! state.auth );
// Do you need to return *every* setting? Just select what you need.
const settings = useSelector( (state: RootState) => state.settings );
...
}
Du kanske vill skapa selektor-funktioner särskilt för ofta åtkomliga värden som userProfile.
Ett alternativ till att modifiera de nuvarande komponenterna HomeApp etc. skulle vara att skapa en HomeScreen-komponent som ett omslag runt HomeApp och behålla HomeApp som en ren presentational-komponent. HomeScreen skulle hämta all data från Redux och anropa HomeApp med rätt props.
