Next의 기본 지식을 소개합니다.회사 명
create-react-app
) 을 만들고 브라우저에 불러올 때 모든 내용이 클라이언트javascript에서 만들어진다는 것을 의미한다.따라서javascript가 없는 사용자나 장치는 응용 프로그램에 접근할 수 없습니다.브라우저에서react 프로그램을 열고 페이지 원본 코드를 볼 수 있습니다.당신은 당신이 만든 내용을 볼 수 없을 것입니다!실제로 프로젝트가
create-react-app
을 통해 생성된 경우 다음을 볼 수 있습니다.<noscript>
You need to enable JavaScript to run this app.
</noscript>
<div id="root"></div>
이것은 명백히 알 수 있다. 왜냐하면react에 대한 우리의 행동은 단지 내용을 #root
에 부가하는 것뿐이기 때문이다.자바스크립트를 사용하지 않으면 내용이 사라집니다.따라서 다음.js, 그것은 우리를 위해 이 문제를 해결했다.
다음 단계를 동시에 배우다.js는 인스타그램의 기본 기능을 갖춘 작은 프로그램을 만들고 있습니다. - 마음에 들면 미니 인스타그램 복제입니다.나는 우리가 오늘 쓸 코드가 신축할 수 없다는 것을 알고 있기 때문에react 응용 프로그램에 대한 공헌은 크지 않지만,next의 기본 내용을 포함할 것이다.회사 명
시작합시다.
우선, 우리는
document.getElementById('root')
을 초기화하고next에 필요한 유일한 소프트웨어 패키지를 설치해야 한다.js 작업:npm init
npm install --save next react react-dom
(npm
을 사용하는 경우 어떻게 해야 하는지 알 수 있음)생성된
yarn
에 다음 스크립트를 추가해야 합니다. "scripts": {
"start": "next"
},
브라우저에서 이 프로그램을 실행하려면 package.json
을 실행해야 합니다.다음js는 우리가 페이지를 통해 노선을 조직할 수 있도록 허락합니다.이 강좌에서, 우리는 두 페이지를 만들어서 그들이 어떻게 상호작용을 하는지 이해할 것이다.먼저 색인 페이지를 만듭니다.그것은
npm start
에 필요하다.다음 항목을 추가합니다.export default () => (
<div className="app">
<header>
<h1>gallery</h1><h2>Original art</h2>
</header>
</div>
)
이렇게./pages/index.js
을 실행하면 색인 페이지가 표시됩니다.물론, 여기서 가장 중요한 것은 페이지 원본 코드를 보면, 위의 HTML이 다음 js에서 우리를 위해'하드 인코딩'하는 것을 볼 수 있다는 것이다.스타일링
CSS 스타일은
npm start
으로 바로 이동할 수 있습니다.각 섹션을 모듈화합니다.우리 제목을 예쁘게 합시다.
export default () => (
<div className="app">
<header>
<h1><Link href={{ pathname: '/' }}><a>gallery</a></Link></h1>
</header>
<style jsx>{`
@import url('https://fonts.googleapis.com/css?family=Oleo+Script');
//... you can get the full code at github
header h1{
font-family: 'Oleo Script', cursive;
font-size: 25rem;
color: #AD0044;
text-shadow: #7F0D23 0px 0 40px;
letter-spacing: -20px;
display: inline-block;
}
h2{
font-size: 3.5rem;
color: white;
text-shadow: none;
letter-spacing: normal;
font-weight: normal;
font-family: 'Dancing Script', cursive;
position: absolute;
top: 50%;
left: 50%;
}
`}</style>
</div>
)
문서에서 "우리는 독립적인 역할 영역 CSS에 대한 지원을 제공하기 위해 스타일화된 jsx를 묶었다."이런 식으로 패턴을 넣는 게 해커 같아!나는 외부 스타일을 더 좋아하지만, 그것은 확실히 모든 고립을 유지하는 데 도움이 된다.나는 단지 습관이 필요할 뿐이다. 아마도.
구성 요소 추가
pages/index.js
에 레이아웃 구성 요소를 추가한다고 혼란스럽지 않도록 이 코드를 한층 더 분할합시다import Link from 'next/link'
import Head from 'next/head'
export default ({ children, title = 'gallery: original art' }) => (
<div>
<Head>
<title>{ title }</title>
<meta charSet='utf-8' />
<meta name='viewport' content='initial-scale=1.0, width=device-width' />
</Head>
<div className="app">
<header>
<h1><Link href={{ pathname: '/' }}>gallery</Link></h1>
<h2>Original art</h2>
</header>
{ children }
<footer>
Footer
</footer>
</div>
<style global jsx>{`
:root {
--green: #65C5D9;
--white: #F4F5F7;
--light-gray: #EAEEEF;
}
...
body{...}
`}</style>
<style jsx>{`
header{ ...}
header h1 a{ ...}
h2{....}
footer { ...}
`}</style>
</div>
)
위에서 주의해야 할 몇 가지 중요한 사항:./components/Layout.js
태그의 내용을 조작할 수 있는 Head
구성 요소를 제공합니다.예를 들어, 더 많은 메타 정보가 필요할 수 있습니다.<head>
구성 요소를 사용하여 페이지를 조회해야 합니다.그것도 닻 라벨이 필요하다.나는 빈 닻 표시를 추가했지만, 그 다음에 그에 상응하는 닻을 채울 것이다.Link
입니다.가장 좋은 예는 css 변수와 바디 표시입니다.각 페이지/구성 요소는 이 정보에 접근해야 하기 때문에 global
.global
으로 돌아가서 우리는 계속 이렇게 한다.import Layout from '../components/Layout';
export default () => (
<Layout>
<p>this is the content </p>
</Layout>
)
약간의 데이터를 처리하다.
./pages/index.js
페이지 구성 요소를react 구성 요소로 변환하고react 구성 요소의 생명 주기에서 데이터를 얻거나 무상태 함수 방법을 계속 사용할 수 있습니다.이 강좌에서, 우리는react 구성 요소를 도입하지 않고 간단하게 유지할 것입니다. (다음 강좌에서 소개할 것입니다.)import Layout from '../components/Layout';
import getPhotos from '../data/data.js'
const Index = (props) => (
<Layout>
<p>{props.images[0].tagline}</p>
</Layout>
)
Index.getInitialProps = async ({ }) => {
// Would fetch data
return { images: getPhotos() } // return { images: [ { }, { } ] }
}
export default Index
Index
우리는 획득 조작을 실행하고 얻은 데이터를 getInitialProps
도구에 전달할 것입니다. 그러나 우리는 여기에서 그것을 하드코딩하는 것은 단지 편의를 위해서입니다.Index
에 다음과 같은 하드 인코딩 데이터가 있습니다.export default () => {
return [
{
id: 0,
tagline: 'You\'re looking at me punk?',
image: '927756_283684128492129_838664181_n',
likes: 2,
comments: [
{
user: 'rex2018',
body: 'Hey this is dope! xxx'
}
]
},
...
]
}
이 모든 데이터는 아이템을 통해 얻을 수 있습니다../data/data.js
구성 요소의 데이터를 어떻게 처리하는지는 기본적인react 내용입니다.일단 Index
구성 요소를 편집하도록 하겠습니다.import Layout from '../components/Layout';
import getPhotos from '../data/data.js'
import Photo from '../components/Photo';
const Index = (props) => (
<Layout>
{
props.images.map((image, key) => <Photo id={key} id={key} data={image} />)
}
</Layout>
)
...
우리는 각 이미지를 순환하고 Index
구성 요소를 렌더링합니다.Photo
에서 이 구성 요소를 만들어야 합니다.import CommentsFunctionality from './InteractiveButtons'
import Link from 'next/link'
export default (props) => {
return (
<div className="photoComponent">
<div style={{flex: '1 0 auto'}}>
<Link href={{ pathname: '/photo', query: { id: props.id } }}>
<img src={`/static/art/${props.data.image}.jpg`} alt=""/>
</Link>
<div className="meta">
<p className="tagline">{props.data.tagline}</p>
<CommentsFunctionality likes={props.data.likes} />
</div>
</div>
<style>{`
.photoComponent {
...
}
`}</style>
</div>
)
}
요컨대, ./components/Photo.js
에서 우리는 모든 그림을 순환해서 훑어보았다.각 이미지에 대해 위의 ./pages/Index.js
어셈블리를 렌더링합니다.그 중의 새로운 내용은 코드를 단독 Photo
구성 요소로 옮기기로 결정했다는 것이다.처음에 내가 이렇게 한 것은 순전히 InteractiveButtons
구성 요소의 CSS를 깨끗하게 유지하기 위해서였다.어쨌든 이것은 Photo
의 코드이다import { MdModeComment, MdFavoriteBorder } from 'react-icons/md'
export default ({likes}) => (
<div className="meta">
<a href="/" className="heart"><MdFavoriteBorder />34</a>
<a href="/"><MdModeComment />{likes}</a>
<style>{`....`}</style>
</div>
)
나는 방금 InteractiveButtons
npm 모듈을 찾았고, 동시에 아이콘을 추가하는 방법을 찾았으며, 어떠한 css 프레임워크도 다운로드하지 않았다. 나는 이것을 정말 좋아한다.그것은 사용하기 쉽다.here에서 제공하는 모든 아이콘을 볼 수 있습니다.이상 재료 설계 아이콘에 react-icons
및 MdModeComment
을 요청합니다 (이에 따라 MdFavoriteBorder
)정적 파일
/md
구성 요소에서 ./components/Photo.js
디렉터리에서 이미지 파일에 접근하려고 합니다.우리가 해야 할 일은 이 디렉터리를 만들고 이미지 파일을 추가하는 것입니다.js는 나머지 부분을 책임진다.지금까지의 최종 결과:
다른 페이지 만들기
우리는 지금 위의 사진 중 하나를 클릭하고 그들에 대한 정보를 더 많이 볼 수 있어야 한다.
static
구성 요소 중 다음 코드가 있습니다.<Link href={{ pathname: '/photo', query: { id: props.id } }}>
<img src={`/static/art/${props.data.image}.jpg`} alt=""/>
</Link>
클릭하시면 ./components/Photo.js
으로 넘어갑니다.따라서, /photo?id=0
구성 요소는 하나의 검색을 받아들일 수 있으며, 우리는 그 안에 자신의 검색 문자열을 추가할 수 있습니다.이런 상황에서 우리는 도구에서 id를 가져와 전달하기만 하면 된다.그리고
Link
페이지를 만들어야 합니다.import Layout from '../components/Layout';
import Photo from '../components/Photo';
import CommentsFunctionality from '../components/InteractiveButtons'
import getPhotos from '../data/data.js'
const PhotoPage = (props) => (
<Layout>
<div className="container">
<div className="display_image">
<img src={`/static/art/${props.image.image}.jpg`} alt=''/>
<CommentsFunctionality />
</div>
<div className="comments">
<p className="tagline">{props.image.tagline}</p>
{
props.image.comments.map((comment, key) => <p key={key}><strong>{comment.user}:</strong>{comment.body}</p>)
}
<form className="comment-form" >
<input type="text"placeholder="Author" />
<input type="text" placeholder="comment..." />
<input type="submit" hidden />
</form>
</div>
</div>
<style>{` `}</style>
</Layout>
)
PhotoPage.getInitialProps = async ({query}) => {
// could fetch data here
let {id} = {...query}
let image = getPhotos().find(m => m.id == id)
return { image }
}
export default PhotoPage
중요한 기능은 ./pages/photo.js
내부에 있습니다.다른 정보에서, getInitialProps
은 검색 문자열에 접근할 수 있기 때문에, 우리는 asgetInitialProps
을 전달하고, 그 중에서 우리는 색인 페이지에서 온 id를 얻는다.그리고 우리는 같은 id를 가진 {query}
대상을 찾아 구성 요소 도구로 전달할 수 있습니다.이것은 내가 다른 파일(
image
)에 데이터를 추가한 유일한 이유이다../data/data.js
이 검색 문자열을 바탕으로 데이터를 얻는 가장 기본적인 방식을 보여 줍니다.url 가져오기 getInitialProps
단일 사진 페이지 완성:결론
이것은 데이터를 처리하는 가장 좋은 방법이 아니라는 것을 쉽게 알 수 있다.우리는 정말react 구성 요소를 추가하고react의 구성 요소의 생명 주기를 이용해야 합니다.비록 나는 Redux에 비하면 이 점도 부족하다고 생각한다.
내가 말한 바와 같이 다음 강좌에서react 구성 요소를 사용하여 API에서 완전히 같은 데이터를 얻고 칭찬과 주석을 더욱 동적으로 얻을 것이다.
또한 github (branch 'part1')에서 모든 코드를 얻을 수 있습니다
Next 소개js- API에서 데이터 가져오기
아레르 쿠투라・ 2018년 8월 24일・ 5분 읽기
#nextjs
#node
#react
#tutorial
Reference
이 문제에 관하여(Next의 기본 지식을 소개합니다.회사 명), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/aurelkurtula/introduction-to-the-basics-of-nextjs-1loa텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)