Jedan od mojih projekata koristi knjižnicu pod nazivom Fixed-Data-Table-2 (FDT2) i izvrsna je za učinkovito generiranje tona redaka podataka.
Njihova dokumentacija prikazuje odgovarajuću tablicu koja se mijenja na temelju širine i visine preglednika.
Mislio sam da bi bilo cool podijeliti ovaj primjer koristeći React Hooks.
Što su reakcijske kuke?
To su funkcije koje vam daju React značajke poput stanja i kuka životnog ciklusa bez ES6 klasa.
Neke su prednosti
- izolirajući logiku stanja, olakšavajući testiranje
- dijeljenje logike stanja bez prikazivanja rekvizita ili komponenti višeg reda
- razdvajanje zabrinutosti vaše aplikacije na temelju logike, a ne kukica životnog ciklusa
- izbjegavajući predavanja ES6, jer su neobični, a ne zapravo predavanja , i spotaknu čak i iskusne programere JavaScript-a
Za više detalja pogledajte Reactov službeni uvod u Hooks.
UPOZORENJE: Ne koristiti u proizvodnji!
U vrijeme pisanja ovog članka, Kuke su u alfa verziji. Njihov se API može promijeniti u bilo kojem trenutku.
Preporučujem vam da eksperimentirate, zabavljate se i koristite udice u svojim sporednim projektima, ali ne u produkcijskom kodu dok ne postanu stabilni.
Cilj
Izgradit ćemo odgovarajuću tablicu s fiksnim podacima. Neće biti preuska ili preširoka za našu stranicu, uklopit će se baš kako treba!
Postaviti
Ovdje su veze GitHub i CodeSandbox.
git clone //github.com/yazeedb/Responsive-FDT2-Hooks/ cd Responsive-FDT2-Hooks npm install
master
Grana ima gotov projekt, pa naplata start
granu ako želite slijediti zajedno.
git checkout start
I voditi projekt.
npm start
Aplikacija bi trebala biti pokrenuta localhost:3000
. Počnimo s kodiranjem.
Uvoz stilova tablice
Prvo ćete htjeti uvesti FDT2 tablicu stilova index.js
, kako vaša tablica ne bi izgledala čudno.
Generiranje lažnih podataka
Naša tablica treba podatke, zar ne? Stvorite datoteku u src
mapi pod nazivom getData.js
.
Za generiranje podataka upotrijebit ćemo strašnu biblioteku faker.js. Već je došlo s vašim npm install
.
Evo izvora ako želite kopirati / zalijepiti.
import faker from 'faker'; const createFakeRowData = () => ({ firstName: faker.name.firstName(), lastName: faker.name.lastName(), email: faker.internet.email(), city: faker.address.city(), salary: faker.random .number({ min: 50000, max: 500000 }) .toLocaleString('en-US', { style: 'currency', currency: 'USD' }) }); export default () => Array.from({ length: 2000 }, createFakeRowData);
createFakeRowData
vraća objekt s punim imenom, e-poštom, gradom i plaćom u američkim dolarima.
Naša izvožena funkcija vraća ih 2000.
Neodgovarajuća tablica
Imamo svoje podatke, hajde da sada kodiramo tablicu.
Pri vrhu index.js
uvezite naše podatke i komponente FDT2.
import { Table, Column, Cell } from 'fixed-data-table-2'; import getData from './getData';
I koristite ih tako.
function App() { const data = getData(); return (
{ return {data[rowIndex][columnKey]}; }} />
{ return {data[rowIndex][columnKey]}; }} />
{ return {data[rowIndex][columnKey]}; }} />
{ return {data[rowIndex][columnKey]}; }} />
{ return {data[rowIndex][columnKey]}; }} />
); }
Tablu konfiguriramo s našim podacima i izrađujemo Column
za svako polje koje želimo prikazati.
getData
objekti sadrže ime / prezime, e-poštu, grad i plaću, pa nam je potreban stupac za svaki.
Naše korisničko sučelje sada izgleda ovako.
Pokušajte promijeniti veličinu prozora preglednika, primijetit ćete da uopće ne reagira. Ili je prevelik ili premalen za vašu vizuru i može ostaviti višak prostora.
Pobjeći nečistom
Kao što smo saznali, React-ova deklarativna priroda omogućuje vam pisanje korisničkog sučelja koristeći čiste, determinističke i lako provjerljive funkcije.
Isti ulaz uvijek treba vraćati isti izlaz.
Međutim, ponekad moramo posjetiti "nečisti" svijet, radi DOM manipulacije, dodajući događaje poput slušatelja, pretplata i odbrojavanja.
HOCS i renderirani rekviziti
Reperski rekviziti i komponente višeg reda (HOCS) standardno su rješenje, ali imaju neke kompromise koje Hooks sada pokušava riješiti.
Korištenje udica
Kuke su novo grotlo za uporabu imperativnog koda. U našem slučaju, dobivanje veličine prozora je učinak za kojim tragamo.
Stvorite novu datoteku pod nazivom useWindowSize.js
.
Za to ćemo trebati dvije stvari:
- Slušajte
resize
događaj prozora , tako da ćemo biti obaviješteni kada se promijeni - Spremite širinu / visinu za dijeljenje s našom tablicom
Dvije kuke mogu pomoći:
useEffect
useState
useEffect
To će vjerojatno zamijeniti componentDidMount
, componentDidUpdate
i componentWillUnmount
životnog ciklusa kuke nakon što je stabiliziran.
useEffect
je savršen za većinu logike inicijalizacije i čitanja DOM-a.
Tu ćemo postaviti resize
slušatelje prozorskih događaja.
Za više detalja pogledajte službene dokumente.
useState
Izuzetno jednostavno, ova Kuka vraća vrijednost sa statusom i funkciju za njezino ažuriranje. Jednom kad zabilježimo širinu / visinu prozora, morat ćemo ga useState
pratiti.
Pisanje naše prilagođene Kuke
Prema službenim dokumentima:
Prilagođena udica je JavaScript funkcija čije ime počinje s "koristi" i koja može pozvati druge udice.
Our custom hook will be called useWindowSize
, and it’ll call the useState
and useEffect
hooks.
This Hook’s mainly from Gabe Ragland’s useWindowSize
on useHooks.com.
// `useWindowSize.js` import { useState, useEffect } from 'react'; export default () => { const getSize = () => { return { width: window.innerWidth, height: window.innerHeight }; }; const [windowSize, setWindowSize] = useState(getSize); useEffect(() => { const handleResize = () => { setWindowSize(getSize()); }; window.addEventListener('resize', handleResize); return () => { window.removeEventListener('resize', handleResize); }; }, []); return windowSize; };
Let’s break this down.
Getting the window size
const getSize = () => { return { width: window.innerWidth, height: window.innerHeight }; };
getSize
simply returns the window’s innerWidth
and innerHeight
.
Initializing useState
const [windowSize, setWindowSize] = useState(getSize);
useState
can take an initial value or a function that returns a value.
In this case we want the window’s dimensions to start, so getSize
is the perfect initializer.
useState
then returns an array, the first index is the value and the second index is the updater function.
Configuring useEffect
useEffect(() => { const handleResize = () => { setWindowSize(getSize()); }; window.addEventListener('resize', handleResize); return () => { window.removeEventListener('resize', handleResize); }; }, []);
useEffect
takes a function that will run your desired effect.
Whenever the window size changes, handleResize
sets the state by giving setWindowSize
the latest width/height.
Cleanup Logic
Our effect function then returns a new function, which useEffect
recognizes as cleanup logic.
return () => { window.removeEventListener('resize', handleResize); };
When we leave the page or somehow unmount our component, this cleanup function runs and removes the resize
event listener. This helps prevent memory leaks.
useEffect’s Second Argument
useEffect
's first argument is the function handling our logic, but we also gave it a second argument: an empty array.
useEffect(() => { ... }, []); // empty array
Why an empty array?
useEffect
's second argument is an array of values to watch over. If any of those values change useEffect
runs again.
We’re just setting/removing event listeners, which only needs to happen once.
An empty array is how we communicate “just run once” to useEffect
.
Empty array = no values ever change = just run once
Return windowSize
Now that our effect’s set up, just return windowSize
. As the browser’s resized, windowSize
will be updated.
Using our custom Hook
Time to throw our Hook at Fixed-Data-Table2!
Back in index.js
, go ahead and import useWindowSize
.
And use it like so.
For fun you can console.log(windowSize)
and watch it update in real-time.
Cool, we get back an object of the window’s width
and height
!
Instead of hardcoding our table’s width and height, we can use our Hook’s exposed state.
Now your table should adjust to the window’s dimensions.
I hope you enjoyed this tutorial!