Szintre szeretné emelni React fejlesztési készségeit? Készítse el saját Hacker News verzióját ennek az útmutatónak a segítségével.
A Hacker News népszerű webhely a vállalkozók és a fejlesztők körében. Olyan tartalmakat tartalmaz, amelyek a számítástechnikára és a vállalkozói szellemre összpontosítanak.
A Hacker News egyszerű elrendezése bizonyos személyeknek megfelelhet. Ha azonban vonzóbb és személyre szabott verzióra vágyik, hasznos API-k segítségével létrehozhatja saját testreszabott Hacker News-élményét. Ezenkívül a Hacker News klón felépítése segíthet megszilárdítani React képességeit.
A projekt- és fejlesztési szerver beállítása
A projektben használt kód elérhető a GitHub adattár és az MIT licence alapján ingyenesen használható.
Stílushoz másolja a tartalmát a index.css fájlt a tárolóból, és illessze be őket a sajátjába index.css fájlt. Ha meg szeretné tekinteni a projekt élő változatát, ezt megtekintheti demó.
A projekthez szükséges csomagok a következők:
- React Router az útválasztás kezeléséhez a Egyoldalas alkalmazás (SPA).
- HTMLReactParser a által visszaadott HTML elemzéséhez Alkalmazásprogramozási felület (API).
- MomentJS az API által visszaadott dátumok kezelésére.
Nyissa meg a terminált, és futtassa:
fonal létre vite
Használhatja a Node Package Manager (NPM) ha inkább a fonal helyett. A fenti parancsnak a Vite build eszközt kell használnia egy alapprojekt felépítéséhez. Nevezze el projektjét, és amikor a rendszer kéri a keretrendszert, válassza ki Reagál és állítsa be a változatot JavaScript.
Most CD a projekt mappába, és telepítse a korábban említett csomagokat a következő parancsok futtatásával a terminálban:
fonal add html-react-parser
fonal add react-router-dom
fonal add pillanat
fonal dev
Az összes csomag telepítése és a fejlesztői kiszolgáló elindítása után nyissa meg a projektet bármelyik kódszerkesztőben, és hozzon létre három mappát a src mappa nevezetesen: alkatrészek, horgok, és oldalakat.
Ban,-ben alkatrészek mappát, adjon hozzá két fájlt Megjegyzések.jsx és Navbar.jsx. Ban,-ben horgok mappát, adjon hozzá egy fájlt useFetch.jsx. Aztán a oldalakat mappát, adjon hozzá két fájlt ListPage.jsx és PostPage.jsx.
Törölje a App.css fájlt, és cserélje ki a tartalmát main.jsx fájl a következővel:
import Reagál tól től'reagál'
import { BrowserRouter } tól től"react-router-dom"
import ReactDOM tól től'react-dom/client'
import App tól től'./App.jsx'
import'./index.css'
ReactDOM.createRoot(dokumentum.getElementById('gyökér')).Vakol(
</BrowserRouter>
</React.StrictMode>,
)
Ban,-ben App.jsx fájlt, távolítsa el az összes alapkódot, és módosítsa a fájlt úgy, hogy csak a funkcionális összetevő maradjon meg:
funkcióApp() {
Visszatérés (
<>
</>
)
}
exportalapértelmezett App
Importálja a szükséges modulokat:
import { Útvonalak, Útvonal } tól től"react-router-dom"
import Listaoldal tól től"./pages/ListPage"
import Navbar tól től'./components/Navbar'
import PostPage tól től"./pages/PostPage"
A React töredékben adja hozzá a Útvonalak alkatrészek hárommal Útvonal gyermekkomponensek elérési utakkal: /, /:type, és /item/:id illetőleg.
'/'
elem={<> <Navbar /><Listaoldal /></>}>
</Route>
'/:típus'
elem={<> <Navbar /><Listaoldal /></>}>
</Route>
'/tárgy azonosító'
elem={}>
</Route>
</Routes>
A useFetch Custom Hook létrehozása
Ez a projekt két API-t használ. Az első API felelős az adott kategóriában lévő bejegyzések listájának lekéréséért (típus), míg a második API az Algolia API, amely egy adott bejegyzés és annak lekéréséért felelős Hozzászólások.
Nyissa meg a useFetch.jsx fájlba, adja meg a horgot alapértelmezett exportálásként, és importálja a useState és useEffect horgok.
import { useState, useEffect } tól től"reagál";
exportalapértelmezettfunkcióuseFetch(típus, id) {
}
Határozzon meg három állapotváltozót, nevezetesen: adat, hiba, és Betöltés, a megfelelő beállító funkcióival.
const [data, setData] = useState();
const [hiba, setError] = useState(hamis);
const [betöltés, setLoading] = useState(igaz);
Ezután adja hozzá a useEffect horog a függőségekkel: id és típus.
useEffect(() => {
}, [azonosító, típus])
Ezután a visszahívási függvényben adja hozzá a függvényt fetchData() hogy lekérje az adatokat a megfelelő API-król. Ha az átadott paraméter az típus, használja az első API-t. Ellenkező esetben használja a második API-t.
asyncfunkciófetchData() {
hagyja válasz, url, paraméter;
ha (típus) {
url = " https://node-hnapi.herokuapp.com/";
paraméter = type.toLowerCase();
}
másha (id) {
url = " https://hn.algolia.com/api/v1/items/";
paraméter = id.toLowerCase();
}
próbáld ki {
válasz = várja fetch(`${url}${parameter}`);
} fogás (hiba) {
setError(igaz);
}
ha (válasz) ha (response.status !== 200) {
setError(igaz);
} más {
hagyja adatok = várja válasz.json();
setLoading(hamis);
setData (adat);
}
}
fetchData();
Végül küldje vissza a Betöltés, hiba, és adat állapotváltozókat objektumként.
Visszatérés { betöltés, hiba, adatok };
A bejegyzések listájának megjelenítése a kért kategóriától függően
Amikor a felhasználó ide navigál / vagy /:type, React kell renderelni a Listaoldal összetevő. A funkció megvalósításához először importálja a szükséges modulokat:
import { useNavigate, useParams } tól től"react-router-dom";
import useFetch tól től"../hooks/useFetch";
Ezután határozza meg a funkcionális komponenst, majd rendelje hozzá a dinamikus paramétert, típus hoz típus változó. Ha a dinamikus paraméter nem elérhető, állítsa be a típus változó -ra hírek. Ezután hívja a useFetch horog.
exportalapértelmezettfunkcióListaoldal() {
hagyja { type } = useParams();
const navigate = useNavigate();
ha (!típus) type = "hírek";
const { betöltés, hiba, adatok } = useFetch (típus, nulla);
}
Ezután adja vissza a megfelelő JSX kódot attól függően, hogy melyik Betöltés, hiba, vagy adat változók igazak.
ha (hiba) {
Visszatérés<div>Valami elromlott!div>
}ha (Betöltés) {
Visszatérés<div>Betöltésdiv>
}
ha (adat) {
dokumentum.title = type.toUpperCase();
Visszatérés<div>"lista-típus">{type}</div>{data.map(tétel =>"tétel">"cikk-cím"
onClick={() => navigate(`/elem/${item.id}`)}>
{item.title}
</div>
{item.domain &&
"elem-link"
onClick={() => open(`${item.url}`)}>
({elem.domain})</span>}
</div>)}
</div>
</div>
}
A PostPage komponens létrehozása
Először importálja a megfelelő modulokat és összetevőket, majd határozza meg az alapértelmezett funkcionális összetevőt, és rendelje hozzá a id dinamikus paramétert a id változó, és hívja a useFetch horog. Ügyeljen arra, hogy megsemmisítse a választ.
import { Link, useParams } tól től"react-router-dom";
import elemezni tól től"html-react-parser";
import pillanat tól től"pillanat";
import Hozzászólások tól től"../components/Comments";
import useFetch tól től"../hooks/useFetch";
exportalapértelmezettfunkcióPostPage() {
const { id } = useParams();
const { betöltés, hiba, adatok } = useFetch(nulla, id);
}
És csakúgy, mint a Listaoldal komponens, jelenítse meg a megfelelő JSX-et a következő változók állapota alapján: Betöltés, hiba, és adat.
ha (hiba) {
Visszatérés<div>Valami elromlott!div>
}ha (Betöltés) {
Visszatérés<div>Betöltésdiv>
}
ha (adat) {
dokumentum.title=data.title;
Visszatérés<div>"postai cím">{data.title}</div>"utómetaadatok">
{data.url &&
osztálynév="post-link">Látogassa meg a webhelyet</Link>}
"utószerző">{data.author}</span>
"utóidő">
{moment (data.created_at).fromNow()}
</span>
</div>
{data.text &&"utószöveg">
{elemzés (adat.szöveg)}</div>}"utólagos megjegyzések">"comments-label">Megjegyzések</div>
</div>
</div>
}
Importálja a elemezni modul és a pillanat modult. Határozza meg az alapértelmezett funkcionális összetevőt Hozzászólások amely beveszi a megjegyzésekAdatok tömb kellékként, áthalad a tömbökön, és megjeleníti a Csomópont komponens minden elemhez.
import elemezni tól től"html-react-parser";
import pillanat tól től"pillanat";
exportalapértelmezettfunkcióHozzászólások({ commentsData }) {
Visszatérés<>
{commentsData.map(commentData =><CsomópontcommentData={commentData}kulcs={commentData.id}
/>)}
</>
}
Ezután határozza meg a Csomópont funkcionális komponens közvetlenül a alatt Hozzászólások összetevő. A Csomópont komponens a megjegyzést, a metaadatokat és az egyes megjegyzésekre adott válaszokat (ha van ilyen) önmaga rekurzív megjelenítésével jeleníti meg.
funkcióCsomópont({ commentData }) {
Visszatérés<divosztály név="megjegyzés">
{
commentData.text &&
<>
"megjegyzés-metaadatok">
{commentData.author}</span>
{moment (commentData.created_at).fromNow()}
</span>
</div>
"megjegyzés-szöveg">
{elemzés (commentData.text)}</div>
</>
}
'megjegyzés-válaszok'>
{(commentData.children) &&
commentData.children.map(gyermek =>
)}
</div>
</div>
}
A fenti kódblokkban elemezni felelős a benne tárolt HTML elemzéséért commentData.text, míg pillanat felelős a megjegyzés idejének elemzéséért és a relatív idő visszaadásáért a mostantól() módszer.
A Navbar komponens létrehozása
Nyissa meg a Navbar.jsx fájlt, és importálja a NavLink modul a react-router-dom modult. Végül határozza meg a funkcionális komponenst, és adjon vissza egy szülőt nav elem öttel NavLink a megfelelő kategóriákra (vagy típusokra) mutató elemek.
import { NavLink } tól től"react-router-dom"
exportalapértelmezettfunkcióNavbar() {
Visszatérés<nav>"/hírek">Otthon</NavLink> "/legjobb">Legjobb</NavLink> "/előadás">Megjelenítés</NavLink> "/kérdez">Kérdezz</NavLink> "/jobs">Munkák</NavLink>
</nav>
}
Gratula! Ön most építette fel saját front-end kliensét a Hacker News számára.
Erősítse meg reakciókészségeit a klón alkalmazás létrehozásával
A Hacker News klón megépítése a React segítségével segíthet megszilárdítani React készségeit, és praktikus egyoldalas alkalmazást biztosít a munkavégzéshez. Sokféleképpen viheti tovább a dolgokat. Például hozzáadhat bejegyzések és felhasználók keresésének lehetőségét az alkalmazáshoz.
Ahelyett, hogy a semmiből próbálná meg saját útválasztóját megépíteni, jobb, ha olyan szakemberek által készített eszközt használ, akik elkötelezettek a SPA-k létrehozásának megkönnyítésében.