0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

React で propsを使ってみた

Posted at

概要

今回はReactでのpropsの使い方についてまとめました。

propsとは親コンポーネントから値を受け取る際に使用されるものになります。

今回のpropsの基本的は使用手順

①TopPage.tsxファイル(親コンポーネントファイル)で使用するpropsの定義

 (例)MovieList.tsxファイル内で使用
  type Props = { movieList: MovieListType };

② ①で定義したPropsを型として、MovieList.tsx内で使用する
③引数にpropsを渡し、propsを使用できる様にする
 (例)MovieList.tsxファイル内で使用
  const MovieList: React.FC = (props) => {}

④型定義した movieList 内にuseStateで定義した変数{movieList}を代入している。

 (例)MovieList.tsxファイル内で使用
< MovieList movieList={movieList} />

「その他props」の値を使用した場面
map関数で使用するため、type Props = { movieList: MovieListType }; で定義した
配列のpropsの値「movieList」をprops.movieList で取り出し、movieListに格納している。
 (例)TopPage.tsxファイル内で使用
const movieList = props.movieList

propsの使用場面とコードの紹介

movieTypes.ts(型定義ファイルの全体)

/* MovieItemType にオブジェクトとして型を定義している。
   映画情報の型の定義
   (id(数値型)、
     poster_path:映画のポスター画像(文字列);
     title:映画タイトル(文字列);
     overview:映画の概要説明(文字列))*/
export type MovieItemType = {
  id: number;
  poster_path: string;
  title: string;
  overview: string;
};
// ↑で定義したオブジェクトの MovieItemType を配列に変換し、それを変数の MovieListType としている
export type MovieListType = MovieItemType[];

MovieList.tsx(全体)

import React from "react";
import { MovieListType } from "../../types/movieTypes";
import MovieItem from "../movieItem/MovieItem";
import styles from "./MovieList.module.scss";

/* {}内にある movieList にmovieTypes.tsファイルで
   定義した型(MovieListType(配列))を適用している。
   また、TopPage.tsxで使用する、
   MovieListコンポーネントにわたすべきPropsの型も定義している */
type Props = { movieList: MovieListType };

// ↑で定義した型(porps)を下記のコードの引数に渡している
const MovieList: React.FC<Props> = (props) => {
  /* 上で定義した、型付きの配列(movieList)を
     map関数で展開するため1つ1つのMolvieItemに渡していく */
  const movieList = props.movieList;

  // movieList配列(20個のデータ)の情報を1つ1つ展開している
  return (
    <div className={styles.root}>
      {movieList.map((movie) => {
        return <MovieItem item={movie} key={movie.id} />;
      })}
    </div>
  );
};

export default MovieList;

下記のコードは上のコード内のprops部をピックアップ

type Props = { movieList: MovieListType };
// ↑で定義した型(Porps)を下記のコードの引数に渡している
const MovieList: React.FC<Props> = (props) => {

  const movieList = props.movieList;

1行目
TopPage.tsxに渡すためのPropsの作成と、そのProps内のMovieListType
にmovieTypes.tsで定義した型を適応している。

type Props = { movieList: MovieListType };

2行目
ここでは1行目で定義したPropsを型として < Props > の形で適応している 。
また引数にpropsを定義し、このファイルでpropsが使いえる様にしている。

const MovieList: React.FC<Props> = (props) => {

TopPage.tsx

const TopPage: React.FC = () => {
  const [movieList, setMovieList] = useState<MovieListType>([
    { id: 0, poster_path: "", title: "", overview: "" },
  ]);

  // APIキーを「ApiKey」に格納
  const ApiKey = process.env.REACT_APP_MOVIE_APIKEY;
  //非同期通信を行う際は「async」が必要になる
  useEffect(() => {
    const fetchTrendMovies = async () => {
      //tryでApiが正常に動作したときの処理を書く
      try {
        const response = await axios.get(
          "https://api.themoviedb.org/3/trending/movie/day",
          {
            params: {
              api_key: ApiKey,
            },
          }
        );
        //moviesに映画情報の一覧(配列)を格納している
        const movies = response.data.results;
        // ↑で定義したmoviseを使用し映画の情報の一覧を配列で取得する。
        setMovieList(movies);
      } catch {}
    };

    fetchTrendMovies();
    // 第2引数で発火のタイミングを設定
  }, [ApiKey]);

  return (
    <div className={styles.root}>
      <header>
        <Header />
      </header>
      <main>
        <MovieList movieList={movieList} />
      </main>
      <footer></footer>
    </div>
  );
};

TopPage.tsx内のuseStateで初期値に「id」「poster_pathtitle」「overview」
の配列データをWeb Api から受け取る「movieList」がある。

const TopPage: React.FC = () => {
  const [movieList, setMovieList] = useState<MovieListType>([
    { id: 0, poster_path: "", title: "", overview: "" },
  ]);

↓のコードでsetMovieListの更新が行われる。

      const movies = response.data.results;
        // ↑で定義したmoviseを使用し映画の情報の一覧を配列で取得する。
        setMovieList(movies);

それを下の様にmainタグでカッコている< MovieList movieList={movieList} />に
反映している。
movieList={movieList} 部のmovieListはMovieList.tsxファイルで定義している
type Props = { movieList: MovieListType }; のmobieList部にあたる。

また、 < MovieList movieList={movieList} />にある {movieList} 部は
TopPage.tsxファイル内で定義しているuseStateの変数にあたる。

return (
    <div className={styles.root}>
      <header>
        <Header />
      </header>
      <main>
        <MovieList movieList={movieList} />
      </main>
      <footer></footer>
    </div>
  );
};

まとめ・今後の課題

今回はReactでpropsを使ったコードの紹介を行いました。
TypeScriptも使用したため、型の指定を行いました。
なんとなくでも伝わる記事になればと思います。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?