はじめに
この記事では、前回作成した「GitHubのリポジトリ一覧アプリ」に、「スター(いいね)」機能を追加していきます。
具体的には、GraphQLのMutation(更新処理)を使って、表示された各リポジトリに対して
「⭐をつける」機能を実装します。
前回と同じく、React + TypeScript + Apollo Client + GitHub GraphQL API の構成で、コードの全体像から細かいReactの記法レベルまで、初心者にやさしく解説していきます。
完成イメージ
- GitHubのユーザー名を入力 → リポジトリ一覧を取得
- 各リポジトリに「⭐ボタン」が追加される

- ⭐を押すと、GitHubの該当リポジトリにスターが付く(APIを通じて)

1. 準備|前回アプリの再利用
本記事は、以下の記事で作成したアプリの続編です。
参考:【30分でできるアプリ】GraphQL × TypeScript × React入門|作って学ぶAPI連携(コード完全解説付き)
そのため、以下の前提が整っている必要があります:
- Vite + React + TypeScript プロジェクトが作成済み
- GitHubのアクセストークン(
VITE_GITHUB_TOKEN
)が.env
に保存済み - Apollo Client のセットアップが完了している
ここからは、この状態をベースに進めます。
2. Mutationの定義

まずは、GraphQLのMutationを定義するファイルを用意します。
ファイル:src/graphql/mutations.ts
import { gql } from '@apollo/client';
export const ADD_STAR = gql`
mutation AddStar($repoId: ID!) {
addStar(input: { starrableId: $repoId }) {
starrable {
viewerHasStarred
}
}
}
`;
解説
export const ADD_STAR = gql\
…“
GraphQLのMutationを定義しています。
ここでは、「特定のリポジトリにスターを追加する」処理を、ADD_STAR
という定数でエクスポートしています。
mutation AddStar($repoId: ID!)
mutation
は GraphQLにおける「更新操作」のことです。$repoId: ID!
は、変数(リポジトリID)を受け取る記述です。$repoId
は「このMutation実行時に外から値を渡す変数」ID!
は「nullを許容しないID型」という意味です。
addStar(input: { starrableId: $repoId })
GitHubのGraphQL APIでは、リポジトリへのスター追加はこの addStar
というMutationで行います。starrableId
にスターを付けたいリポジトリのIDを渡します。
3. スター追加用ボタンの作成
リポジトリ一覧の表示に、スターを付けるボタンを追加します。
ファイル:src/components/StarButton.tsx
import { useMutation } from '@apollo/client';
import { ADD_STAR } from '../graphql/mutations';
type Props = {
repoId: string;
};
export const StarButton = ({ repoId }: Props) => {
const [addStar, { loading, error }] = useMutation(ADD_STAR);
const handleClick = () => {
addStar({ variables: { repoId } });
};
return (
<div style={{ marginTop: '0.5rem' }}>
<button onClick={handleClick} disabled={loading}>
いいね!⭐
</button>
{error && <p style={{ color: 'red' }}>エラー: {error.message}</p>}
</div>
);
};
解説
useMutation(ADD_STAR)
ReactでGraphQLのMutationを実行するためのフック(関数)です。
これにより、ボタンを押したときに addStar
を呼び出すだけでリクエストが送信されます。
addStar
は実行関数loading
は実行中かどうかのフラグerror
はエラーが発生した場合の情報
handleClick
ボタンが押されたときに実行される関数です。addStar({ variables: { repoId } })
によって、先ほど定義した $repoId
に値を渡してMutationを実行しています。
JSXのポイント
<button onClick={handleClick} disabled={loading}>
いいね!⭐
</button>
onClick={handleClick}
:クリック時にMutation実行disabled={loading}
:実行中はボタンを押せないように制御
4. RepoList側にスター機能を追加
リポジトリの一覧に、先ほどの StarButton
を組み込みます。
修正ファイル:src/components/RepoList.tsx
import { useQuery } from '@apollo/client';
import { GET_REPOS } from '../graphql/queries';
import { StarButton } from './StarButton';
type Props = {
username: string;
};
export const RepoList = ({ username }: Props) => {
const { loading, error, data } = useQuery(GET_REPOS, {
variables: { login: username },
skip: !username,
});
if (!username) return <p>ユーザー名を入力してください</p>;
if (loading) return <p>読み込み中...</p>;
if (error) return <p>エラーが発生しました:{error.message}</p>;
return (
<ul>
{data.user.repositories.nodes.map((repo: any) => (
<li key={repo.id}>
<a href={repo.url} target="_blank" rel="noreferrer">
{repo.name}
</a>
<StarButton repoId={repo.id} />
</li>
))}
</ul>
);
};
解説
import { StarButton } from './StarButton';
先ほど作成した StarButton
を読み込んでいます。
<StarButton repoId={repo.id} />
各リポジトリのIDを StarButton
に渡すことで、「このリポジトリにスターをつける」という意図を持たせています。
5. 動作確認
開発サーバーを起動して、以下を確認しましょう。
npm run dev
- GitHubユーザー名を入力
- リポジトリが表示される
- 「いいね!⭐」ボタンが表示される
- 押すとGitHubリポジトリにスターが付く
※ うまくいかない場合は、コンソールログやネットワークタブでエラーを確認してください。


まとめ
- GraphQLの Mutation を使えば、データの更新も簡単にできる
useMutation
を使えば、ReactアプリでもMutationが簡潔に扱える- GitHub APIの認証・構文ルールをしっかり押さえることが大切
関連リンク
- 4ステップで作れるカウントアプリ|useState・useEffect・propsを実践で習得
- GraphQLとは?仕組みと導入メリット
- React入門ガイド(useStateやuseEffectが不安な人向け)
コメントを残す