Norite patobulinti savo React tobulėjimo įgūdžius? Sukurkite savo „Hacker News“ versiją naudodami šį vadovą.

„Hacker News“ yra populiari svetainė tarp verslininkų ir kūrėjų. Jame pateikiamas turinys, orientuotas į kompiuterių mokslą ir verslumą.

Paprastas „Hacker News“ išdėstymas gali tikti tam tikriems asmenims. Tačiau, jei norite patrauklesnės ir labiau suasmenintos versijos, galite naudoti naudingas API, kad sukurtumėte savo pritaikytą „Hacker News“ patirtį. Be to, „Hacker News“ klono kūrimas gali padėti sustiprinti savo React įgūdžius.

Projekto ir plėtros serverio nustatymas

Šiame projekte naudojamas kodas yra prieinamas a GitHub saugykla ir jūs galite nemokamai naudotis pagal MIT licenciją.

Norėdami sukurti stilių, nukopijuokite turinį index.css failą iš saugyklos ir įklijuokite juos į savo index.css failą. Jei norite pažvelgti į tiesioginę šio projekto versiją, galite tai patikrinti demo.

Šiam projektui reikalingi paketai apima:

  • „React Router“ maršruto parinkimui tvarkyti Vieno puslapio programa (SPA).
  • instagram viewer
  • HTMLReactParser, skirtas analizuoti HTML, kurį grąžino Programų programavimo sąsaja (API).
  • MomentJS už API grąžintų datų tvarkymą.

Atidarykite terminalą ir paleiskite:

verpalai sukurti vite

Taip pat galite naudoti Mazgo paketų tvarkyklė (NPM) jei jums labiau patinka, o ne verpalai. Aukščiau pateikta komanda turėtų naudoti Vite kūrimo įrankį pagrindiniam projektui sukurti. Pavadinkite savo projektą ir, kai būsite paraginti įvesti sistemą, pasirinkite Reaguoti ir nustatykite variantą į JavaScript.

Dabar cd į projekto aplanką ir įdiekite anksčiau minėtus paketus vykdydami šias komandas terminale:

verpalai pridėti html-react-parser
verpalai pridėti react-router-dom
verpalai pridėti momentą
verpalai dev

Įdiegę visus paketus ir paleidę kūrimo serverį, atidarykite projektą bet kuriame kodo rengyklėje ir sukurkite tris aplankus. src aplankas būtent: komponentai, kabliukai, ir puslapių.

Viduje komponentai aplanką, pridėkite du failus Comments.jsx ir Navbar.jsx. Viduje kabliukai aplanką, pridėkite vieną failą useFetch.jsx. Tada į puslapių aplanką, pridėkite du failus ListPage.jsx ir PostPage.jsx.

Ištrinkite App.css failą ir pakeiskite turinį pagrindinis.jsx failą su tokia informacija:

importuoti Reaguoti 'reaguoti'
importuoti { Naršyklės maršrutizatorius } 'react-router-dom'
importuoti ReactDOM 'react-dom/client'
importuoti Programėlė „./App.jsx“
importuoti'./index.css'

ReactDOM.createRoot(dokumentas.getElementById("šaknis")).pateikti(



</BrowserRouter>
</React.StrictMode>,
)

Viduje App.jsx failą, pašalinkite visą pagrindinį kodą ir pakeiskite failą taip, kad liktų tik funkcinis komponentas:

funkcijaProgramėlė() {
grąžinti (
<>
</>
)
}

eksportuotinumatytas Programėlė

Importuokite reikiamus modulius:

importuoti { Maršrutai, maršrutas } 'react-router-dom'
importuoti Sąrašo puslapis „./pages/ListPage“
importuoti Navigacijos juosta „./components/Navbar“
importuoti Pašto puslapis „./pages/PostPage“

Fragmente „React“ pridėkite Maršrutai komponentai su trimis Maršrutas antriniai komponentai su keliais: /, /:type, ir /item/:id atitinkamai.


'/'
element={<> <Navigacijos juosta /><Sąrašo puslapis /></>}>
</Route>
'/:type'
element={<> <Navigacijos juosta /><Sąrašo puslapis /></>}>
</Route>
'/elementas/:id'
element={}>
</Route>
</Routes>

„useFetch Custom Hook“ sukūrimas

Šiame projekte naudojamos dvi API. Pirmoji API yra atsakinga už tam tikros kategorijos pranešimų sąrašo gavimą (tipas), o antroji API yra Algolia API, kuri yra atsakinga už konkretaus įrašo ir jo gavimą komentarus.

Atidaryk useFetch.jsx failą, apibrėžkite kabliuką kaip numatytąjį eksportą ir importuokite useState ir naudojimoEfektas kabliukai.

importuoti { useState, useEffect } "reaguoti";
eksportuotinumatytasfunkcijauseFetch(tipas, id) {

}

Apibrėžkite tris būsenos kintamuosius, būtent: duomenis, klaida, ir pakrovimas, su atitinkamomis nustatymo funkcijomis.

konst [duomenys, setData] = useState();
konst [error, setError] = useState(klaidinga);
konst [įkeliama, setLoading] = useState(tiesa);

Tada pridėkite a naudojimoEfektas kabliukas su priklausomybėmis: id ir tipo.

useEffect (() => {
}, [id, tipas])

Toliau prie skambinimo funkcijos pridėkite funkciją gautiduomenys () kad gautumėte duomenis iš atitinkamų API. Jei perduotas parametras yra tipo, naudokite pirmąją API. Kitu atveju naudokite antrąją API.

asyncfunkcijagauti duomenis() {
leisti atsakymas, url, parametras;
jeigu (tipas) {
url = " https://node-hnapi.herokuapp.com/";
parametras = type.toLowerCase();
}
Kitasjeigu (id) {
url = " https://hn.algolia.com/api/v1/items/";
parametras = id.toLowerCase();
}
bandyti {
atsakymas = laukti atnešti (`${url}${parameter}`);
} sugauti (klaida) {
setError(tiesa);
}

jeigu (atsakymas) jeigu (response.status !== 200) {
setError(tiesa);
} Kitas {
leisti duomenys = laukti atsakymas.json();
setLoading(klaidinga);
setData (duomenys);
}
}
gautiduomenys ();

Galiausiai grąžinkite pakrovimas, klaida, ir duomenis būsenos kintamuosius kaip objektą.

grąžinti { įkeliama, klaida, duomenys };

Įrašų sąrašo pateikimas atsižvelgiant į pageidaujamą kategoriją

Kai vartotojas naršo į / arba /:type, React turėtų pateikti Sąrašo puslapis komponentas. Norėdami įdiegti šią funkciją, pirmiausia importuokite reikiamus modulius:

importuoti { useNavigate, useParams } "react-router-dom";
importuoti useFetch "../hooks/useFetch";

Tada apibrėžkite funkcinį komponentą ir priskirkite dinaminį parametrą, tipo prie tipo kintamasis. Jei dinaminis parametras nepasiekiamas, nustatykite tipo kintamasis į žinios. Tada skambinkite useFetch kabliukas.

eksportuotinumatytasfunkcijaSąrašo puslapis() {
leisti {tipas} = useParams();
konst naršyti = useNavigate();
jeigu (!tipas) tipas = "žinios";
konst { įkeliama, klaida, duomenys } = useFetch (tipas, nulinis);
}

Tada grąžinkite atitinkamą JSX kodą, atsižvelgdami į tai, kuris iš pakrovimas, klaida, arba duomenis kintamieji yra tiesa.

jeigu (klaida) {
grąžinti<div>Kažkas ne taip!div>
}

jeigu (įkeliama) {
grąžinti<div>Įkeliamadiv>
}

jeigu (duomenys) {
dokumentas.title = type.toUpperCase();
grąžinti<div>

'sąrašo tipas'>{tipas}</div>
{data.map(daiktas =>
"prekė">
"prekės pavadinimas"
onClick={() => naršyti(`/prekė/${item.id}`)}>
{item.title}
</div>
{item.domain &&
"elemento nuoroda"
onClick={() => atidaryti(`${item.url}`)}>
({item.domain})</span>}
</div>)}
</div>
</div>
}

„PostPage“ komponento kūrimas

Pirma, importuokite atitinkamus modulius ir komponentus, tada nustatykite numatytąjį funkcinį komponentą, priskirkite id dinaminis parametras id kintamasis ir skambinkite useFetch kabliukas. Įsitikinkite, kad sunaikinote atsakymą.

importuoti { Link, useParams } "react-router-dom";
importuoti analizuoti „html-react-parser“;
importuoti momentas "momentas";
importuoti Komentarai "../components/Comments";
importuoti useFetch "../hooks/useFetch";

eksportuotinumatytasfunkcijaPašto puslapis() {
konst { id } = useParams();
konst { įkeliama, klaida, duomenys } = useFetch(nulinis, id);
}

Ir kaip su Sąrašo puslapis komponentas, pateikti atitinkamą JSX pagal šių kintamųjų būseną: pakrovimas, klaida, ir duomenis.

jeigu (klaida) {
grąžinti<div>Kažkas ne taip!div>
}

jeigu (įkeliama) {
grąžinti<div>Įkeliamadiv>
}

jeigu (duomenys) {
dokumentas.title=duomenys.pavadinimas;
grąžinti<div>

"post-title">{data.title}</div>
„po metaduomenys“>
{data.url &&
className="post-link">Apsilankykite svetainėje</Link>}
"post-autorius">{data.author}</span>
„po laikas“>
{moment (data.created_at).fromNow()}
</span>
</div>
{data.text &&
"post-tekstas">
{analizuoti (duomenys.tekstas)}</div>}
"pašto komentarai">
"komentarai-etiketė">Komentarai</div>

</div>
</div>
}

Importuoti analizuoti modulis ir momentas modulis. Apibrėžkite numatytąjį funkcinį komponentą Komentarai kad paima į komentaraiDuomenys masyvas kaip atrama, eina per masyvus ir pateikia a Mazgas komponentas kiekvienam elementui.

importuoti analizuoti „html-react-parser“;
importuoti momentas "momentas";

eksportuotinumatytasfunkcijaKomentarai({ commentsData }) {
grąžinti<>
{commentsData.map(komentarasDuomenys =><MazgaskomentarasDuomenys={commentData}Raktas={commentData.id}
/>)}
</>
}

Toliau apibrėžkite Mazgas funkcinis komponentas tiesiai po Komentarai komponentas. The Mazgas komponentas pateikia komentarą, metaduomenis ir atsakymą į kiekvieną komentarą (jei yra), rekursyviai pateikdamas save.

funkcijaMazgas({ commentData }) {
grąžinti<divklasės pavadinimas="komentuoti">
{
commentData.text &&
<>
'komentaras-metaduomenys'>
{commentData.author}</span>

{moment (commentData.created_at).fromNow()}
</span>
</div>
'komentaras-tekstas'
>
{analizuoti (commentData.text)}</div>
</>
}
'komentarai-atsakymai'
>
{(commentData.children) &&
commentData.children.map(vaikas =>
)}
</div>
</div>
}

Aukščiau esančiame kodo bloke analizuoti yra atsakingas už saugomo HTML analizavimą komentarasData.tekstas, kol momentas yra atsakingas už komentaro laiko analizavimą ir santykinio laiko grąžinimą naudojant nuo dabar() metodas.

Navigacijos juostos komponento kūrimas

Atidaryk Navbar.jsx failą ir importuoti NavLink modulis iš react-router-dom modulis. Galiausiai apibrėžkite funkcinį komponentą ir grąžinkite pirminį elementą nav elementas su penkiais NavLink elementus, nurodančius atitinkamas kategorijas (ar tipus).

importuoti { NavLink } "react-router-dom"

eksportuotinumatytasfunkcijaNavigacijos juosta() {
grąžinti<nav>
"/žinios">Namai</NavLink>
"/geriausias">Geriausias</NavLink>
"/Rodyti">Rodyti</NavLink>
"/paklausti">Paklausk</NavLink>
"/darbai">Darbas</NavLink>
</nav>
}

Sveikinimai! Ką tik sukūrėte savo „Hacker News“ priekinį klientą.

Sustiprinkite savo reagavimo įgūdžius kurdami klono programą

„Hacker News“ klono sukūrimas naudojant „React“ gali padėti sustiprinti jūsų „React“ įgūdžius ir pateikti praktinę vieno puslapio programą, su kuria galite dirbti. Yra daug būdų, kaip galite tęsti reikalus. Pavyzdžiui, prie programos galite pridėti galimybę ieškoti įrašų ir naudotojų.

Užuot bandę sukurti savo maršrutizatorių nuo nulio, geriau naudoti įrankį, kurį sukūrė profesionalai, kurie yra skirti lengviau kurti SPA.