Chcete zlepšit své vývojové dovednosti React? Sestavte si svou vlastní verzi Hacker News s pomocí tohoto průvodce.
Hacker News je oblíbený web mezi podnikateli a vývojáři. Obsahuje obsah zaměřený na informatiku a podnikání.
Jednoduché uspořádání Hacker News může některým jednotlivcům vyhovovat. Pokud však toužíte po atraktivnější a personalizovanější verzi, můžete využít užitečná rozhraní API k vytvoření vlastního přizpůsobeného prostředí Hacker News. Sestavení klonu Hacker News vám také může pomoci upevnit vaše schopnosti React.
Nastavení projektového a vývojového serveru
Kód použitý v tomto projektu je k dispozici v a úložiště GitHub a můžete jej používat zdarma pod licencí MIT.
Pro styling zkopírujte obsah souboru index.css soubor z úložiště a vložte je do svého vlastního index.css soubor. Pokud se chcete podívat na živou verzi tohoto projektu, můžete se podívat na toto demo.
Balíčky potřebné pro tento projekt zahrnují:
- React Router pro obsluhu směrování v Jednostránková aplikace (SPA).
- HTMLReactParser pro analýzu HTML vráceného souborem Aplikační programovací rozhraní (API).
- MomentJS pro zpracování dat vrácených rozhraním API.
Otevřete terminál a spusťte:
příze vytvořit vite
Můžete také použít Správce balíčků uzlů (NPM) pokud to dáváte přednost před přízí. Výše uvedený příkaz by měl používat nástroj Vite build k vytvoření základního projektu. Pojmenujte svůj projekt a po zobrazení výzvy k zadání rámce vyberte Reagovat a nastavte variantu na JavaScript.
Nyní CD do složky projektu a nainstalujte balíčky uvedené dříve spuštěním následujících příkazů v terminálu:
příze přidat html-react-parser
příze přidat reagovat-router-dom
příze přidat moment
příze voj
Po instalaci všech balíčků a spuštění vývojového serveru otevřete projekt v libovolném editoru kódu a vytvořte v něm tři složky src složka a to: komponenty, háčky, a stránky.
V komponenty složku, přidejte dva soubory Comments.jsx a Navbar.jsx. V háčky složku, přidejte jeden soubor useFetch.jsx. Poté v stránky složku, přidejte dva soubory ListPage.jsx a PostPage.jsx.
Smazat App.css a nahraďte obsah souboru main.jsx soubor s následujícím:
import Reagovat z'reagovat'
import { BrowserRouter } z'react-router-dom'
import ReactDOM z'react-dom/client'
import Aplikace z'./App.jsx'
import'./index.css'
ReactDOM.createRoot(dokument.getElementById('vykořenit')).poskytnout(
</BrowserRouter>
</React.StrictMode>,
)
V App.jsx soubor, odstraňte veškerý standardní kód a upravte soubor tak, aby vám zbyla pouze funkční součást:
funkceAplikace() {
vrátit se (
<>
</>
)
}
vývoznívýchozí Aplikace
Importujte potřebné moduly:
import { Routes, Route } z'react-router-dom'
import ListPage z'./pages/ListPage'
import Navbar z'./components/Navbar'
import PostPage z'./pages/PostPage'
Do fragmentu React přidejte Trasy komponenty se třemi Trasa podřízené komponenty s cestami: /, /:type, a /item/:id respektive.
'/'
prvek={<> <Navbar /><ListPage /></>}>
</Route>
'/:typ'
prvek={<> <Navbar /><ListPage /></>}>
</Route>
'/item/:id'
element={}>
</Route>
</Routes>
Vytvoření uživatelského háku useFetch
Tento projekt používá dvě rozhraní API. První API je zodpovědné za načtení seznamu příspěvků v dané kategorii (typ), zatímco druhé API je Algolia API, které je zodpovědné za načtení konkrétního příspěvku a jeho komentáře.
Otevři useFetch.jsx definujte hák jako výchozí export a importujte soubor useState a useEffect háčky.
import { useState, useEffect } z"reagovat";
vývoznívýchozífunkceuseFetch(typ, id) {
}
Definujte tři stavové proměnné, a to: data, chyba, a načítánís jejich příslušnými nastavovacími funkcemi.
konst [data, setData] = useState();
konst [chyba, setError] = useState(Nepravdivé);
konst [načítání, setLoading] = useState(skutečný);
Poté přidejte a useEffect háček se závislostmi: id a typ.
useEffect(() => {
}, [id, typ])
Dále ve funkci zpětného volání přidejte funkci fetchData() k načtení dat z příslušných rozhraní API. Pokud je předaný parametr typ, použijte první API. V opačném případě použijte druhé API.
asynchronnífunkcefetchData() {
nechat odpověď, url, parametr;
-li (typ) {
url = " https://node-hnapi.herokuapp.com/";
parametr = type.toLowerCase();
}
jiný-li (id) {
url = " https://hn.algolia.com/api/v1/items/";
parametr = id.toLowerCase();
}
Snaž se {
odpověď = čekat vynést(`${url}${parameter}`);
} chytit (chyba) {
setError(skutečný);
}
-li (Odezva) -li (response.status !== 200) {
setError(skutečný);
} jiný {
nechat údaje = čekat response.json();
setLoading(Nepravdivé);
setData (data);
}
}
fetchData();
Nakonec vraťte načítání, chyba, a data stavové proměnné jako objekt.
vrátit se { načítání, chyba, data };
Vykreslení seznamu příspěvků v závislosti na požadované kategorii
Kdykoli uživatel přejde na / nebo /:type, React by měl vykreslit ListPage komponent. Chcete-li implementovat tuto funkci, nejprve importujte potřebné moduly:
import { useNavigate, useParams } z"react-router-dom";
import useFetch z"../hooks/useFetch";
Poté definujte funkční komponent a poté přiřaďte dynamický parametr, typ k typ variabilní. Pokud dynamický parametr není k dispozici, nastavte typ variabilní k zprávy. Poté zavolejte na useFetch háček.
vývoznívýchozífunkceListPage() {
nechat { typ } = useParams();
konst navigovat = useNavigate();
-li (!typ) typ = "zprávy";
konst { načítání, chyba, data } = useFetch (typ, nula);
}
Dále vraťte příslušný kód JSX v závislosti na tom, který z nich načítání, chybanebo data proměnné je pravda.
-li (chyba) {
vrátit se<div>Něco se pokazilo!div>
}-li (načítání) {
vrátit se<div>načítánídiv>
}
-li (data) {
dokument.title = type.toUpperCase();
vrátit se<div>'typ seznamu'>{type}</div>{data.map(položka =>"položka">"název položky"
onClick={() => navigovat(`/item/${item.id}`)}>
{item.title}
</div>
{item.domain &&
"odkaz na položku"
onClick={() => otevřít(`${item.url}`)}>
({item.domain})</span>}
</div>)}
</div>
</div>
}
Vytvoření komponenty PostPage
Nejprve naimportujte příslušné moduly a komponenty, poté definujte výchozí funkční komponentu a přiřaďte id dynamický parametr k id proměnnou a zavolejte useFetch háček. Ujistěte se, že destruujete odpověď.
import { Link, useParams } z"react-router-dom";
import rozebrat z'html-react-parser';
import moment z"moment";
import Komentáře z"../components/Comments";
import useFetch z"../hooks/useFetch";
vývoznívýchozífunkcePostPage() {
konst { id } = useParams();
konst { načítání, chyba, data } = useFetch(nula, id);
}
A stejně jako s ListPage komponentu, vykreslete příslušné JSX na základě stavu následujících proměnných: načítání, chyba, a data.
-li (chyba) {
vrátit se<div>Něco se pokazilo!div>
}-li (načítání) {
vrátit se<div>načítánídiv>
}
-li (data) {
dokument.title=data.title;
vrátit se<div>"příspěvek">{data.title}</div>"post-metadata">
{data.url &&
className="post-link">Navštivte web</Link>}
"post-autor">{data.author}</span>
"post-time">
{moment (data.created_at).fromNow()}
</span>
</div>
{data.text &&"post-text">
{parse (data.text)}</div>}"post-komentáře">"označení komentářů">Komentáře</div>
</div>
</div>
}
Importujte rozebrat modul a moment modul. Definujte výchozí funkční komponentu Komentáře který bere v komentářeData pole jako podpěra, prochází skrz pole a vykresluje a Uzel komponent pro každý prvek.
import rozebrat z'html-react-parser';
import moment z"moment";
vývoznívýchozífunkceKomentáře({ commentsData }) {
vrátit se<>
{commentsData.map(data komentáře =><Uzeldata komentáře={commentData}klíč={commentData.id}
/>)}
</>
}
Dále definujte Uzel funkční součást přímo pod Komentáře komponent. The Uzel komponenta vykresluje komentář, metadata a odpovědi na každý komentář (pokud existuje) rekurzivním vykreslováním.
funkceUzel({ commentData }) {
vrátit se<divjméno třídy="komentář">
{
commentData.text &&
<>
'metadata komentáře'>
{commentData.author}</span>
{moment (commentData.created_at).fromNow()}
</span>
</div>
'text komentáře'>
{parse (commentData.text)}</div>
</>
}
'komentář-odpovědi'>
{(commentData.children) &&
commentData.children.map(dítě =>
)}
</div>
</div>
}
V bloku kódu výše rozebrat je zodpovědný za analýzu HTML uloženého v komentářData.text, zatímco moment je zodpovědný za analýzu času komentáře a vrácení relativního času pomocí od teď() metoda.
Vytvoření komponenty Navbar
Otevři Navbar.jsx soubor a importujte NavLink modul z reagovat-router-dom modul. Nakonec definujte funkční komponentu a vraťte rodiče nav prvek s pěti NavLink prvky ukazující na příslušné kategorie (nebo typy).
import { NavLink } z"react-router-dom"
vývoznívýchozífunkceNavbar() {
vrátit se<nav>"/zprávy">Domů</NavLink> "/nejlepší">Nejlepší</NavLink> "/ukázat">Ukázat</NavLink> "/dotázat se">Zeptejte se</NavLink> "/pracovní místa">Zaměstnání</NavLink>
</nav>
}
Gratuluji! Právě jste vytvořili vlastního front-end klienta pro Hacker News.
Upevněte své dovednosti React vytvořením aplikace klonování
Vytváření klonu Hacker News s Reactem může pomoci upevnit vaše dovednosti React a poskytnout praktickou jednostránkovou aplikaci, na které můžete pracovat. Existuje mnoho způsobů, jak můžete věci posunout dále. Do aplikace můžete například přidat možnost vyhledávat příspěvky a uživatele.
Spíše než se snažit postavit si vlastní router od nuly, je lepší použít nástroj vytvořený profesionály, kteří se věnují tomu, aby bylo vytváření SPA snazší.