Open7

最新の TypeScript, React, Next.js 辺りのキャッチアップ

HoshiHoshi

最近 TypeScript や React 、 Next.js といったフロントエンド技術に触れていなかったが、研究室でフロントエンド勉強会を開くことになったので、最新情報をキャッチアップしながら、初心者向けに正確な情報をまとめていくためのスクラップ記事

HoshiHoshi

Your First Component

Component とは何たるかについての説明。「Pitfall」としてドキュメントに躓きやすい箇所を明示してくれているのありがたい。

React はマークアップと CSS と JavaScript を "components" として結合します。これによりアプリ内の UI 要素を再利用可能にすることができます。

(Pitfall) React のコンポーネントは普通の JavaScript の関数ですが、関数名は大文字で始める必要があります。

(Pitfall) return のあとに ( ) をつけずに改行すると、それ以降は無視されます。

// ✅ it works
return <img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" />;

// ✅ it also works
return (
  <div>
    <img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" />
  </div>
);

// 🔴 doesn't work!
return (
  <div>
    <img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" />
  </div>
);

(Pitfall) レンダリングが非常に遅くなり、またバグの原因にもなるため、コンポーネントの定義をコンポーネント内に含めないでください。すべてのコンポーネントはトップレベルに定義してください。

export default function Gallery() {
  // 🔴 Never define a component inside another component!
  function Profile() {
    // ...
  }
  // ...
}

export default function Gallery() {
  // ...
}

// ✅ Declare components at the top level
function Profile() {
  // ...
}
HoshiHoshi

Importing and Exporting Components

公式でも default export と named export のどちらを使うべきという指針はないが、export default () => {} のように無名関数をエクスポートするなどはデバッグが難しくなるので止めてほしいとのこと。常に意味のある命名を心がける。

Syntax Export Statement Import Statement
Default export default function Button() {} import Button from './Button.js';
Named export function Button() {} import { Button } from './Button.js';
HoshiHoshi

Writing Markup with JSX

JSX のルール

  1. 単一の要素を return する(一番外に余計な要素を追加する必要がない場合は Fragment <></> をつける)
  2. すべてのタグを閉じる(<img> ではなく <img /><li>orange ではなく <li>orange</li>
  3. 属性名には(ほとんどの場合)キャメルケースを使用する(stroke-width ではなく strokeWidthclassfor は予約語なので、それぞれ classNamehtmlFor とする)

歴史的な理由から、 aria-*data-* 属性は、HTML と同じようにハイフン区切りで記載する。

参考:

https://stackoverflow.com/questions/52398380/why-react-wai-aria-is-not-in-camelcase

HoshiHoshi

JavaScript in JSX with Curly Braces

JSX の内部で JavaScript の情報を使いたい場合は「波括弧 {}」を使用する。
JSX で波括弧を使う方法は以下の2種類のみ。

  1. テキストとして(JSXタグの内部に直接記述する。例: <h1>{name}'s To Do List</h1>
  2. 属性の値として(タグの属性の=のあとに記述する。例: <img src={avatar}>

Object を使いたい場合は波括弧を二重にする。

    <ul style={{
      backgroundColor: 'black',
      color: 'pink'
    }}/>

(落とし穴) インラインの style プロパティはキャメルケースとなっていることに注意する。

HoshiHoshi

Passing Props to a Component

props は JSX タグに渡す情報のことです。たとえば <img> タグに渡せる props として、classNamesrcalt などがあります

destructuring 記法での書き方

function Avatar({ person, size }) {
  // ...
}

以下の書き方と同じ

function Avatar(props) {
  let person = props.person;
  let size = props.size;
  // ...
}
  • props にはデフォルト値を含められる。
  • 全部渡したいときは spread syntax も使える <Avatar {...props}>
  • JSX 自体を渡したい場合に children
  • props 自体は immutable (=unchangeable)なので、コンポーネント内では変更せずに、常に親から新しい props を渡す