Cum sa gestionati starea aplicatiei cu ascultatorii de evenimente si cu React hooks
Acest articol introduce conceptul de stat al aplicatiei si exploreaza scenarii comune in care statul aplicatiei este utilizat in React Native – care este accesat prin obiectul AppState furnizat de cadru.
Vom acoperi modul in care ascultatorii de evenimente pot accesa starea cea mai actualizata a unei componente prin referinte si carligul useRef, care, la randul sau, va poate pregati aplicatia pentru fundal sau prim plan. Modificarile AppState vor fi, de asemenea, demonstrate impreuna cu contextul React si o clasa Timer, care va masura cat timp o aplicatie este in fundal sau in prim plan.
Desi subiectele despre care se vorbeste pot fi aplicate atat iOS cat si Android, demonstratiile din acest articol au fost testate exclusiv pe iOS. Aceste instrumente si concepte utile care, fara indoiala, vor fi utile pe masura ce dezvoltati aplicatii React Native. Sa incepem cu AppState. porno interracial
AppState este un API simplu furnizat de cadrul react-native, deci este cel mai probabil disponibil acum in proiectele dvs. React Native acum. In cea mai simpla utilizare, ne putem referi pur si simplu la starea curenta a aplicatiei utilizand proprietatea sa curentaState, care va fi fie activa, inactiva sau in fundal:
// obtineti starea curenta a aplicatiei din importul `AppState` React, {useState} din
importul ‘ react ’ {AppState} din‘ react-native’const App = (props) => {
const [appState, setAppState] = useState (AppState.currentState);
… chinese porno
}
In exemplul de mai sus, componenta aplicatiei va stoca starea curenta a aplicatiei pe masura ce este redata – care va fi aproape sigur activa.
Numai acest lucru nu este prea util – aplicatia trebuie sa stie cand se schimba aceasta stare, ceea ce la randul sau trebuie reflectat in carligul de mai sus useState. Pentru a aborda acest lucru, ascultatorii de evenimente pot fi atasati la AppState, care ofera componentei posibilitatea de a se actualiza cu valoarea de baza:
// Ascultatori de evenimente `AppState` in cadrul` useEffect` const handleAppStateChange = (state: any) => {
console.log (state);
} useEffect (() => {
AppState.addEventListener (‘change’, handleAppStateChange);
return (() => {
AppState.removeEventListener (‘change’, handleAppStateChange);
})
}, []);
A fost introdus aici un carlig useEffect cu o matrice de dependenta goala, asigurandu-se ca ascultatorii de evenimente se vor monta doar pe randul initial al componentei. teresa w porno Functia de returnare a useEffect este executata cand componenta se demonteaza, oferind componentei posibilitatea de a elimina ascultatorul de evenimente.
Sa facem acest lucru putin mai inteligent actualizand AppState in handleAppStateChange si sa folosim un alt carlig useEffect pentru a consola.registrati aceasta valoare la redarea urmatoare:
// ascultarea ` AppState` changes const [appState, setAppState] = useState (AppState.currentState); const handleAppStateChange = (state: any) => {
setAppState (state);
} useEffect (() => {
AppState.addEventListener (‘change’, handleAppStateChange);
return (() => {
AppState.removeEventListener (‘change’, handleAppStateChange);
})
}, []); useEffect (() = > {
console. porno belle soeur log (appState);
});
Cu aceasta configurare simpla, avem deja mijloacele de a gestiona actualizarile la starea aplicatiei din interiorul unei componente. Cu toate acestea, exista intr-adevar unele limitari pentru ascultatorii nostri de evenimente in aceasta configurare, deoarece acestia vor fi constienti de starea componentelor doar la randarea initiala. Vom explora de ce este cazul mai jos in articol.
Dar cand apar aceste „schimbari” de fapt? Sa examinam acest lucru in continuare pentru a intelege exact cand se declanseaza aceste evenimente.
Cand se intampla modificari AppState
Cele trei valori ale AppState (activ, inactiv si in fundal) sunt comutate intre doua evenimente cheie:
- Minimizarea si deschiderea aplicatiei, catre si din ecranul de pornire. Dupa ce faceti acest lucru, aplicatia comuta intre activ si fundal, cu o stare temporara de inactivitate, deoarece aplicatia este minimizata. karin schubert porno
- Intrarea in comutatorul de aplicatii din aplicatia insasi. Daca acest lucru se realizeaza din interiorul aplicatiei, starea aplicatiei se va schimba permanent in inactiva pana cand utilizatorul paraseste comutatorul de aplicatii.
Pentru a demonstra acest lucru, am copiat exemplul de cod de mai sus in ecranul Tabloului de bord al unei aplicatii pe care o dezvolt personal. Observati modificarile dintre starea aplicatiei pe masura ce trec de la prim-plan la fundal si cand intru in comutatorul de aplicatii:
Demonstrarea modificarilor AppState pe masura ce aplicatia se schimba din prim-plan, fundal si aplicatie de comutare
Ceea ce ati fi observat este ca avem intotdeauna o perioada de inactivitate atunci cand minimizati aplicatia pe ecranul de pornire al dispozitivului, inainte de a trece din nou la fundal. In plus, aceasta stare inactiva este declansata numai din aplicatie . Daca incercati sa intrati in comutatorul de aplicatii in timp ce pe ecranul de pornire al dispozitivului, aplicatia va ramane in starea de fundal, pana cand va fi deschisa din nou in prim-plan. porno tabou
Observati cum unele aplicatii isi estompeaza ecranele in comutatorul de aplicatii?
In perioada inactiva temporara puteti face modificari interesante aplicatiei, cum ar fi suprascrierea ecranului curent cu un ecran substituent, in cazul in care ecranul curent contine informatii confidentiale – cum ar fi o aplicatie bancara sau o aplicatie FinTech.
Acest lucru poate fi gestionat pur si simplu redand un ecran diferit daca AppState.currentState este inactiv. Daca doriti acest comportament la nivel global, puteti infasura intreaga aplicatie in jurul unei componente, sa zicem, o componenta <AppStateManager>, care va reda aplicatia de la nivelul superior atunci cand starea se transforma in inactiva:
// redati ecranul `inactiv` prin intermediul componentei de nivel superior` AppStateManager` export const const AppStateManager = (props: any) => {const [appState, setAppState] = useState (AppState.currentState); const handleAppStateChange = (state: any) => {
setAppState (state);
} useEffect (() => {
AppState.addEventListener (‘change’, handleAppStateChange);
return (() => {
AppState. rihanna porno removeEventListener (‘change’, handleAppStateChange);
})
}, []); return (
{appState === ‘inactiv’
? <View> <Text> Ecran inactiv! </Text> <View>
: <> {props.children} </>
}
)
}
Acest lucru adauga un anumit nivel de securitate in cadrul aplicatiilor React Native – o caracteristica fara indoiala obligatorie pentru aplicatiile mai sensibile.
Cu o intelegere la nivel inalt a AppState, sa examinam acum cum sa depasim limitarea ascultatorilor de evenimente, care citesc doar starea componentelor din randarea ascultatorilor de eveniment. Acest lucru poate fi rezolvat cu Refs.
Asa cum s-a mentionat mai sus, ascultatorii de evenimente vor fi constienti de starea componentei la randarea initiala. Deoarece ascultatorii de evenimente nu sunt actualizati la redarea ulterioara (atunci cand starea se schimba), nu vor fi constienti de aceste schimbari care au loc. porno infirmière
Pentru a vedea aceasta problema in actiune, putem incrementa un contor care va exista in useState si putem inregistra acest contor intr-un ascultator de evenimente pe masura ce este incrementat. Deoarece ascultatorul de evenimente nu este la curent cu actualizarile de stare dupa ce este initializat, contorul va inregistra intotdeauna zero.
Urmatorul fragment seteaza aceasta demonstratie cu un ascultator de evenimente adaugat la evenimentul didFocus react-navigation.
In scopuri de testare, evenimentele didFocus si didBlur ale React Navigation sunt cu adevarat utile pentru testarea logicii componentelor, care sunt declansate pe masura ce ecranele sunt vizitate si lasate.
Acest eveniment este initializat pe masura ce ecranul in cauza este vizitat pentru prima data – starea in acest moment va fi inregistrata:
const [counter, setCounter] = useState (0); // actualizati starea la fiecare 2 secunde setInterval (() => {
setCounter (contor + 1);
}, 2000); // console.log `counter` in cadrul ascultatorului de evenimente la fiecare 2 secunde useEffect (() => {
this. film sex porno focusListener = props.navigation.addListener (‘didFocus’, async () => {
setInterval (() => {
// acesta va fi intotdeauna 0
console.log (contor);
}, 2000);
});
return (() => {
this.focusListener.remove ();
})
}, []);
Concret, ascultatorul de evenimente nu va avea acces la valorile de stare actualizate. yps porno Aceasta este o problema inerenta relatiei React cu ascultatorii de evenimente in general si nu este legata doar de AppState.
Pentru a depasi acest lucru, putem folosi carligul useRef, precum si React.createRef (), pentru a accesa valorile starii in timp real (din cea mai recenta actualizare), din useState sau din elementele DOM.
In primul rand vizitand useRef, putem oferi ascultatorilor de evenimente o adevarata valoare a starii, facand cateva modificari mici de la codul de mai sus:
- Crearea unei referinte pentru a contoriza cu useRef si utilizati acele ascultatori de evenimente in loc sa utilizati direct contorul.
- Definirea unei metode setCounter personalizate care va actualiza valoarea actuala a referintei, precum si valoarea starii contorului. Pentru a face acest lucru, putem schimba numele setCounter al useState in _setCounter si il putem folosi in metoda setCounter personalizata. porno cochonne
Poate fi greu de vizualizat – iata exemplul de contor actualizat cu useRef integrat:
Cu aceste modificari facute, valorile starii curente pot fi acum accesate din ascultatorii de evenimente – ascultatori de evenimente care au fost initializati pe randul componentei initiale.
Aceasta este o solutie necesara atunci cand vine vorba de AppState , permitandu-va sa va referiti la valorile starii curente atunci cand determinati logica de comutare a starii aplicatiei, unde poate fi necesar sa accesati starea locala sau starea globala actualizata dintr-un magazin Redux sau similar.
Dar despre obtinerea starii curente a elementelor HTML / JSX in ascultatorii de evenimente?
In exemplul de mai sus, valorile useState au fost mentionate cu useRef. Dar ce se intampla daca am dori sa preluam atribute ale elementelor redate, cum ar fi elementele de forma, sau chiar sa stam din componentele React Native, cum ar fi ScrollView, unde ascultatorul de evenimente ar putea avea nevoie sa cunoasca pozitia curenta de derulare.
- gold porno
- porno cuq
- porno tunisien
- porno jeune couple
- porno vrai.com
- star wars porno
- femme poilue porno
- porno emma watson
- porno français mature
- film porno black
- sister porno
- barbie porno
- ville porno
- porno family
- twerk porno
- porno chantage
- vierge porno
- porno femmes fontaine
- porno dingues
- meilleur actrice porno
Aici este nevoie de o abordare usor diferita.
Sa luam acest scenariu Scroll View. porno kif Putem face urmatorii pasi pentru a rezolva acest lucru:
- Creati o referinta la elementul Vizualizare defilare cu React.createRef. Aceasta va actiona ca un indicator al elementului.
- Infasurati ref-ul de mai sus cu un carlig useRef si utilizati aceasta referinta in ascultatorii de evenimente si in referinta <ScrollView />.
In acest scenariu, infasuram un ref cu un carlig useRef – care poate parea confuz, dar subliniaza ca cele doua implementari actioneaza diferit. Sa analizam de ce sunt utilizate ambele API-uri. porno academie
Prima diferenta este sintaxa insasi:
const scrollview = React.createRef ();
const scrollviewRef = React.useRef (scrollview);
Acum, daca am ignora scrollviewRef si l-am atribui pur si simplu scrollview la <ScrollView /> ref prop si am incerca sa facem referire la aceasta valoare in ascultatorii de evenimente, am obtine o valoare nula.
Incercati acest lucru singur cu urmatorul fragment:
// INCORRECT: incercarea de a atribui `scrollview` ca ref si de a utiliza in ascultatorul de evenimente const scrollview = React.createRef (); useEffect (() => {
this.focusListener = props. porno sperme navigation.addListener (‘didFocus’, async () => {
// aceasta va fi `null`
console.log (scrollview.current);
});
return (() => {
this.focusListener.remove ();
})
}, []);
return (
<ScrollView
ref = {scrollview}
. oksana porno ..
/>
);
Problema de aici se datoreaza aceluiasi motiv ca si exemplul de contor anterior – in momentul initializarii ascultatorilor de evenimente, scrollview.current este inca nul si inca nu este legat de componenta <ScrollView />.
Ceea ce putem aplica aici este aceeasi solutie useRef si sa folosim acea referinta ca referinta a <ScrollView />:
// CORECT: accesarea ref `ScrollView` in cadrul ascultatorului de evenimente const scrollview = React.createRef ();
const scrollviewRef: any = React. kalissu porno useRef (scrollview); useEffect (() => {
this.focusListener = props.navigation.addListener (‘didFocus’, async () => {
// acum va face referinta cu succes <ScrollView />
console.log ( scrollviewRef.current );
});
return (() => {
this. video porno xxl focusListener.remove ();
})
}, []); return (
<ScrollView
ref = {scrollviewRef}
…
/>
);
Acum ascultatorii nostri de evenimente vor face referire cu succes la elementele JSX, folosind capacitatea useRefs pentru a-si pastra obiectul de referinta pentru majoritatea vietii componentei.
Poate ca o modalitate mai clara de a va gandi la aceasta solutie este ca scrollview actioneaza ca indicatorul catre <ScrollView /> la nivelul DOM, in timp ce scrollviewRef actioneaza ca un pointer la nivelul componentei. porno teen gay
Cum se aplica acest lucru pentru AppState?
Modificarile AppState sunt gestionate in cadrul ascultatorilor de evenimente, ale caror functii vor avea nevoie de acces la cea mai recenta stare (si, in cazuri, element) pentru a gestiona logica necesara atunci cand aplicatia se muta in prim-plan sau in fundal.
Cu posibilitatea de a accesa cea mai actualizata stare utilizand solutiile de mai sus, veti putea face lucruri precum:
- Intrerupeti automat un joc sau anuntati automat un chat live ca persoana respectiva nu mai este activa.
- Manipulati cu usurinta scenarii in timp real (adesea scenarii in care un websocket sau evenimentele RxJS se actualizeaza continuu).
- Am mentionat deja inlocuirea continutului ecranului curent cu un ecran substituent pentru aplicatii sensibile, in timp ce aplicatia este in fundal. Acest concept poate fi extins si prin salvarea textului sau a datelor sensibile din formular si prin reintroducerea acestuia atunci cand aplicatia se deschide din nou.
- Pornirea sau oprirea unui cronometru pentru a calcula cat timp un utilizator este in aplicatie sau in afara aplicatiei. porno fairy tail Pentru prima abordare, cronometrul trebuie sa fie intrerupt atunci cand utilizatorul minimizeaza aplicatia si invers pentru cel de-al doilea scenariu.
Acest caz de utilizare a temporizatorului este o modalitate amuzanta de a demonstra in continuare modul in care clasele pot fi folosite cu AppState pentru a obtine mai multe informatii despre schimbarea de stare in cauza. In cele din urma, sa integram o clasa simpla de temporizator pentru a lucra cu AppState, intrerupem temporizatorul atunci cand aplicatia este redusa la minimum si reluam cand aplicatia este cumparata din nou in prim plan.
Aceasta sectiune finala arata cum sa utilizati o clasa Timer impreuna cu AppState. Deoarece clasele nu respecta regulile de stare React, nu este nevoie sa cream o referinta la un anumit obiect de clasa pentru a accesa valorile sale curente ale proprietatii.
Definirea clasei Timer
Clasa Timer (a carei implementare completa va fi inclusa mai jos intr-un Gist) poate fi utilizata in cadrul oricarui proiect JavaScript. kim glow porno
Momentul a fost folosit pentru a simplifica si mai mult sintaxa clasei si este singura dependenta a Timerului. Pur si simplu instalati momentul cu fire in directorul de proiect pentru a testa Timerul:
fire add moment
Timerul implementeaza metode de pornire, pauza, reluare si finalizare, precum si proprietati active startTime, totalTime si terminate pentru a persista starea temporizatorului. Toate orele sunt formatate ca valori UNIX pentru ao simplifica in continuare:
Cu Timerul definit acum, putem continua si instantia cronometrele in cadrul componentelor React Native si le putem folosi in orice mod doriti.
Cu toate acestea, inainte de a utiliza Timer cu AppState, sa facem posibila accesarea acestuia intr-un mod mai asemanator React – ca context.
Infasurarea temporizatorului intr-un furnizor de context
Urmatorul Gist infasoara Timer intr-un context, definind, de asemenea, o metoda newTimer (), inclusa in furnizorul de context, pentru a crea un nou Timer. In plus, este definit un carlig useTimer useContext, precum si componenta <TimerContextProvider /> care ar trebui sa infasoare intregul copac al componentelor care necesita acces la cronometru:
Controlul unui cronometru cu AppState
Acest Gist final demonstreaza cum sa porniti, sa intrerupeti si sa reluati un cronometru bazat pe AppState, cu urmatoarea logica:
- Temporizatorul porneste dupa redarea initiala a componentei. De asemenea, la randarea initiala, se initializeaza ascultatorul de evenimente de modificare AppState.
- Cand AppState.currentState se schimba, Temporizatorul se va relua sau se va intrerupe. Daca aplicatia intra in fundal sau devine inactiva, temporizatorul se va intrerupe. Si cand aplicatia este deschisa din nou in prim-plan, cronometrul se reia.
Obiectul temporizator este accesat prin carligul contextului useTimer definit anterior. Iata implementarea:
Acest articol a actionat ca o imagine de ansamblu cuprinzatoare asupra AppState, documentand cazurile sale de utilizare impreuna cu ascultatorii de evenimente si cadrul React.
In cazul in care starea actualizata trebuie accesata in ascultatorii de evenimente, referintele pot fi folosite pentru a indica acele valori de stare particulare. In cazul in care trebuie sa faceti referire la elementele DOM, API-urile React.createRef si useRef pot fi utilizate impreuna pentru a obtine acelasi rezultat.
De asemenea, am acoperit un caz de utilizare atunci cand lucram cu clase, prin intermediul clasei Timer. Poate fi util sa stabiliti cat timp utilizatorul ramane in afara (sau in interiorul) aplicatiei sau sa poata intrerupe o anumita activitate atunci cand aplicatia devine inactiva si sa reluati cand este in prim plan din nou.
Sper ca acest articol a fost de ajutor si ca cititorul isi poate gestiona in mod eficient aplicatia, fie in prim plan, fie in fundal.
Lecturi suplimentare
Pentru a citi mai multe despre utilizarea React Ref Hook, consultati articolul meu general:
Pentru a citi referintele in general, inclusiv referintele de redirectionare si apelare, am publicat un alt articol dedicat subiectului: