Closed12
Next.js学習日記
公式リファレンスに従って
yarn create next-app --typescript
What is your project named?
と聞かれたので、next-playground
としてEnter。
色々インストールされて、
Success! Created next-playground at /Users/taro/Desktop/next-playground
✨ Done in 103.30s.
最初に書き忘れたけど、Node.jsのバージョンは16.16.0、Next.jsのバージョンは12.2.3です。
cd next-playground
してls
したら
README.md next.config.js package.json public tsconfig.json
next-env.d.ts node_modules pages styles yarn.lock
って感じで色々作られている(当たり前)。とりあえずlocalで起動する。yarn dev
すると、
yarn run v1.22.10
$ next dev
ready - started server on 0.0.0.0:3000, url: http://localhost:3000
info - SWC minify release candidate enabled. https://nextjs.link/swcmin
event - compiled client and server successfully in 2.7s (169 modules)
ここのメッセージはNuxt.jsと違ってそっけない。
写真は省略するが、ブラウザでそれっぽいものが表示できた。
NextオリジナルのコンポーネントでLink
、Image
などがある。Link
はNuxtでいうNuxtLink
。ただし行き先はto
ではなくhref
で指定。Image
は、public
フォルダに置いた画像をいい感じに最適化して表示するコンポーネント。src
にpublic
フォルダからの相対パスを渡す。
装飾用に色々追加
yarn add -D tailwindcss autoprefixer postcss sass
props
関数の引数に渡すだけ。
const Hoge = ({ text }) => {
return (
<div>{text}</div>
)
}
繰り返し
map
を使う。
const Hoge = () => {
const people = ['Alice', 'Bob', 'Charlie']
return (
<ul>
{people.map(person => <li key={person}>{person}</li>)}
</ul>
)
}
子要素
children
というpropsが予約されている。
const Child = ({ children }) => {
return <div>{children}</div>
}
const Parent = () => {
return <Child>hogehoge</Child>
}
useState
コンポーネントが何らかの情報を保持して、変更されるたびにレンダーし直す。
import { useState } from 'react'
const Hoge = () => {
const [people, setPeople] = useState(['Alice', 'Bob'])
const add = () => setPeople(people.concat('Charlie'))
return (
<div onClick={add}>click me!</div>
<ul>
{people.map((person, i) => <li key={i}>{person}</li>)}
</ul>
)
}
setPeople
は古い値を新しい値でまるっと置換するらしい。デカいデータをそのまま突っ込んだりすると重くなったりするんだろうか?わからん。
useEffect
コンポーネントが更新された直後や、消える直前に実行される。
const [count, setCount] = useState(0)
useEffect(() => {
const id = window.setInterval(() => {
setCount(count + 1)
}, 5000)
return () => window.clearInterval(id)
})
第1引数に実行したい関数を渡す。影響を「お掃除」する関数をreturn
する。
第2引数は省略可能。監視したい変数を配列にして渡すと、その中身が書きかわった場合だけ実行される。
フォーム入力を受け取る
Vueでいうところのv-model
的なやつはないので、原始的にやる。
const SimpleForm = () => {
const [text, setText] = useState('')
const handleChange: ChangeEventHandler<HTMLInputElement> = (e) => {
setText(e.target.value)
}
return (
<div className={styles.container}>
<form action="">
<input type="text" name="aaa" id="aaa" onChange={handleChange} />
</form>
<span>What you wrote: {text}</span>
</div>
)
}
このスクラップは2022/09/08にクローズされました