Dev.to의 ReactJS 클론:React 갈고리 사용
Link to GitHub repo is now available. Check it out at the bottom of this article.
Check the Live Site hosted on GitHub Pages.
최근에 React 프로젝트에서 REST API를 사용하는 것에 관한 강연 자료를 준비해야 하기 때문에 dev.to API에 관한 글을 쓰기로 했습니다. https://docs.forem.com/api/ 에서 찾을 수 있습니다.다음은 내가 이 프로젝트를 할 때 총결한 내용이다.
소개하다.
API 또는 응용 프로그램 프로그래밍 인터페이스는 응용 프로그램이나 장치가 서로 연결되고 통신하는 방법을 정의하는 일련의 규칙입니다.REST API는 REST 설계 원칙이나 대표적인 상태 전환 아키텍처 스타일에 부합하는 API입니다.What is a REST API? | IBM .
React는 페이스북이 보유한 오픈소스 자바스크립트 라이브러리로, 응답이 빠르고 경량급인 UI를 개발하는 데 사용된다.
Dev.to는 개발자의 블로그 사이트로 소프트웨어 개발자를 대상으로 하는 건설적이고 포용적인 소셜네트워크서비스로 묘사된다.
너는 마땅히 알아야 한다
이 자습서를 이해하려면 JavaScript와 React의 기본 지식을 갖추어야 합니다.
이 부분에서 뭘 배울 거예요?
1. npm나 실로 새로운react 응용 프로그램 만들기
Before you can start building react apps you need to install the latest version of node on your development machine.This section is added as a refresher
npm
and npx
is bundled with the node installer. Download Node.js from the official website - Download | Node.js 환경을 설치하고 설정하면 명령줄(CLI) -
npx create-react-app my-awesome-app
에서 다음 명령을 실행할 수 있어야 합니다.자세한 내용은 React official documentation 또는 Create React App website를 참조하십시오.yarn
에 대해서는 yarn official documentation를 참조하십시오.이제 응용 프로그램을 만들었으니, 때가 되었다.
cd my-awesome-app
좋아요!현재 응용 프로그램 디렉토리에 있습니다.2. 반응 고리 사용
Navigate to your project folder and open the src
directory, i.e. C:/path/to/my-awesome-app/src, and open the index.js
file with your favourite editor. I use either SublimeText or VSCode.
Your html index file can be found at C:/path/to/my-awesome-app/public/index.html. We will need this file later when we are ready to push to GitHub pages.
If you open the html file in a browser, you would be greeted with a blank page. So, to start your app, run the following command: npm start
or yarn start
and wait for the development server to start your app in your default browser.
Your CLI commands so far would look like the following
> npx create-react-app my-awesome-app
> cd my-awesome-app
> npm start
Once the server comes up, you would see the default React app loaded. It's now time to start building your own project by editing the index.js
file that we opened earlier. Leave other files in the src directory for now. We will delete the ones we don't need later.
Delete the whole content of the index.js file and type the following:
file: index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
ReactDOM.render(
<React.StrictMode>{/* This component will notify us of potential problems */}
<App />
</React.StrictMode>,
document.getElementById('root')
);
Before we work on our App.js file, I would like us to create some components, so let's start with the navigation bar. You should access the dev.to homepage on a laptop to be able to see the navigation bar.
The Navbar view at >= 640px640px 미만의 탐색 모음 보기
파일:탐색 모음.js
import React from 'react';
import {Link} from 'react-router-dom';//npm install react-router-dom
function Navbar({query, onChange}) {
return (
<header className="flex header justify-between items-center p-2 px-3 m:p-0 m:px-0 m:pb-2">
<h1 className="crayons-subtitle-2">Posts</h1>
<nav className="crayons-tabs hidden s:flex" aria-label="View posts by">
<ul className="crayons-tabs__list">
<li>
<Link data-text="Feed" to="/" className={"crayons-tabs__item" + (query === "/" ? ' crayons-tabs__item--current' : '')}>Feed</Link>
</li>
<li>
<Link data-text="Week" to="/top/week" className={"crayons-tabs__item" + (query === "/top/week" ? ' crayons-tabs__item--current' : '')}>Week</Link>
</li>
<li>
<Link data-text="Month" to="/top/month" className={"crayons-tabs__item" + (query === "/top/month" ? ' crayons-tabs__item--current' : '')}>Month</Link>
</li>
<li>
<Link data-text="Year" to="/top/year" className={"crayons-tabs__item" + (query === "/top/year" ? ' crayons-tabs__item--current' : '')}>Year</Link>
</li>
<li>
<Link data-text="Infinity" to="/top/infinity" className={"crayons-tabs__item" + (query === "/top/infinity" ? ' crayons-tabs__item--current' : '')}>Infinity</Link>
</li>
<li>
<Link data-text="Latest" to="/latest" className={"crayons-tabs__item" + (query === "/latest" ? ' crayons-tabs__item--current' : '')}>Latest</Link>
</li>
</ul>
</nav>
<select className="right s:hidden f-16 pd5 b-r5 sh-focus" value={query} onChange={onChange}>
<option value="/">Feed</option>
<option value="/top/week">Week</option>
<option value="/top/month">Month</option>
<option value="/top/year">Year</option>
<option value="/top/infinity">Infinity</option>
<option value="/latest">Latest</option>
</select>
</header>
)
}
export default Navbar;
Navbar 구성 요소는 query와 onChange 두 개의 도구를 수락합니다.query
아이템은 획득한 아이템 종류의 현재 값을 저장합니다.총 6개의 유형이 있는데 그것이 바로 개요, 주, 월, 년, 무한과 최신이다.onChange
속성은 select 요소를 사용하여 글의 종류를 변경할 때마다 실행되는 리셋을 가리킨다.네비게이션 표시줄 구성 요소는 두 가지 기능 요소
nav
와 select
를 포함하고 있음을 주의하십시오.이 두 요소는 사이트에 나타나는 어느 곳에서든 함께 사용되며 현재 문장 유형의 같은 정보에 작용하기 때문에 단독 구성 요소에서 추출할 필요가 없다.탐색 모음 구성 요소 스타일 설정
간결하게 보기 위해서, 나는 본문의 모든 CSS 코드를 건너뛸 것이다. 그 어떠한 기능도 제공하지 않으면.전체 코드는 GitHub의 프로젝트 재구매에서 찾을 수 있습니다.
호응성
Dev.to에는 다음과 같은 네 개의 브레이크가 있습니다.
*, *:before, *:after {
/* Your general styles here */
/* Styles for extra small devices */
}
@media screen and (min-width: 640px) {
/* Takes care of small to medium devices */
}
@media screen and (min-width: 768px) {
/* Takes care of tablet devices */
}
@media screen and (min-width: 1024px) {
/* Takes care of laptop devices */
}
탐색 모음 기능우리는
react-router-dom
의 링크 구성 요소를 사용하여 우리의 링크를 처리합니다.잊지 마세요npm install react-router-dom
.잠시 후 우리는 왜 이것이 필요한지 이해할 것이다.우리는 또한 onChange
요소에 <select>
이벤트 탐지기를 추가하여 이 조작을 처리했다.이제 Navbar 디렉터를 작성해 보겠습니다.이 컨트롤러는
App.js
파일에 추가됩니다.파일: App.js
import React, {useState, useEffect} from 'react';
import {Route, Switch, useHistory, useLocation} from 'react-router-dom';
// import Home from './Home';
// import Article from './Article';
// import Search from './Search';
function App() {
const location = useLocation();// provided by the router bundle
const history = useHistory();// provided by the router bundle
const [posts, setPosts] = useState([]);
const [failure, setFailure] = useState(false);
const [query, setQuery] = useState(location.pathname);
const [isShowing, setIsShowing] = useState(false);// for the Hamburger
//
function handleChange(event) {
history.push(event.target.value); // adds a new entry to the history object
// event.target.value could be one of "/, /top/week, /top/month, /top/year, /top/infinity, /latest"
}
function SideNavToggler() {// Hamburger Menu is the Side Navigator
setIsShowing(isShowing => !isShowing);
} // we use this state to decide whether the side menu should be revealed or hidden during the next click of the trigger element.
//
useEffect(() => {
// 1. to avoid creating new object each time the component re-renders, we have to define this within the useEffect.
// 2. if it was passed in a dependency, React will create new object each time, causing the effect hook to run repeatedly for every effect.
// 3a. We are transforming the location pathname to something that the dev.to API understands, but we need to keep the path name SEO friendly.
// 3b. dev.to/api/articles?top=7 gets us the articles created over the week, but we want to make it appear as https://dev-to-blog/top/week => https://dev.to/top/week - hence, the need for this mapping.
const mymap = {
'/': 0,
'/top/week': 7,
'/top/month': 30,
'/top/year': 365,
'/top/infinity': 366,
'/latest': 1
}
const qpath = mymap[location.pathname]; // returns 0 for / and 7 for week...
const fetchArticles = async () => {
try {
setFailure(false);
setPosts([]);
//
const url = 'https://dev.to/api/articles' + (qpath ? '?top=' + qpath : '');
const api_response = await fetch(url);
const data = await api_response.json();
if (api_response.status !== 200) {
throw Error(api_response.error);
}
// console.log(data);
setQuery(location.pathname); // update this after a successful API request
setPosts(data);
} catch (error) {
// console.log(error);
setFailure(true);
setQuery(''); // do this to allow new request without change in location
}
}
!isNaN(qpath) && fetchArticles();
}, [location]) // the effect hook will only run when there is a change in the location's pathname, or after a failed request
const navState = {SideNavToggler, isShowing};
const data = {query, failure, posts, handleChange, ...navState};
return (
<div className="App">
{/* <Switch>
<Route path="/" render={() => <Home data={data} />} exact />
<Route path="/top" render={() => <Home data={data} />} />
<Route path="/latest" render={() => <Home data={data} />} />
<Route path="/search" component={Search} />
<Route render={() => <Article data={navState} />} />
</Switch> */}
</div>
);
}
export default App;
이 컨트롤러를 사용하면 사용자가 nav
링크를 누르면 위치가 업데이트되고,useEffet 갈고리에 의존항으로 추가되었기 때문에, API 백엔드에 새로운 요청을 보낼 것으로 확신하며, 요청이 성공하면 UI가 다시 나타납니다.use State 갈고리에 대한 정보를 더 알고 싶으면, 내가 보여준
useState
갈고리 사용법 useReducer
에서 배울 수 있습니다.요약
이 부분의 앞의 두 부분에서 우리는 새로운react 응용 프로그램을 만드는 방법과
useEffect
갈고리를 사용하여 서버에 비동기 요청을 하는 방법을 배웠다.우리는 또한 useState
갈고리를 어떻게 사용하여 응용 프로그램의 내부 상태를 관리하는지 배웠다.useEffect 갈고리가 있는 React Router 패키지를 사용하여 브라우저 기록을 업데이트하여 서버 요청을 활성화하는 방법을 보았고, 미디어 조회를 사용하여 응용 프로그램에 인터럽트를 설정하여 응답성 디자인을 실현하는 방법도 보았다.
다음은요?
본고의 두 번째 부분에서 우리는 React Router for SPA navigation의 세계와 우리의 응용 프로그램을github 페이지에 맞는 네비게이션 모델로 설정하는 방법을 깊이 있게 이해할 것이다.
만약 당신이 이 글을 좋아하고 다음 업데이트 준비가 다 되었을 때 알림을 받기를 원한다면,
Save
단추를 누르면 그것을 읽기 목록에 추가하거나, 내 계정을 사용할 수 있습니다.감사합니다;)
Link to Source Code on GitHub
Reference
이 문제에 관하여(Dev.to의 ReactJS 클론:React 갈고리 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/maswerdna/dev-to-blog-a-reactjs-clone-of-dev-to-5960텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)