質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%

Q&A

解決済

1回答

1832閲覧

React useContextとカスタムフックの使い分けについて

shunta80

総合スコア96

0グッド

0クリップ

投稿2022/06/08 11:12

編集2022/06/10 03:20

前提

React
カスタムフックとuseContextの違いについて

この2つの使い分けについて

state・変数・関数をまとめたいときや、どのコンポーネントでも使用できるようにする時にカスタムフックとuseContextがありますが、どちらを使ってもそれは可能かと思います。

この2つの使い分けやできればこっちを使ったほうがいいなど
大きな違いはあるのでしょうか。

その状況が発生しているコード

カスタムフック

import { useEffect, useMemo, useState } from "react"; import { useNavigate } from 'react-router'; import { useCallback } from 'react'; import axios from 'axios'; const useProvider =(props) => { const[data,setdata]=useState([]) useEffect(()=>{ axios.get('http://webservice.recruit.co.jp/hotpepper/large_area/v1/?format=json&key=***') .then(function(nn){ setdata(nn.data.results.large_area) }) .catch(error => console.log(error)) },[]) const history=useNavigate() const branch1=useCallback((t)=>{ switch (t.target.value) { case 10: history('/North') break; case 20: history('/East') break; case 30: history('/West') break; default: return; } },[]) const rock= {branch1,data} return rock }; export default useProvider;

useContext

import { createContext, useEffect, useMemo, useState } from "react"; import { useNavigate } from 'react-router'; import { useCallback } from 'react'; import axios from 'axios'; export const Context = createContext(); const Provider =(props) => { const { children } = props; const[data2,setdata2]=useState([]) useEffect(()=>{ axios.get('http://webservice.recruit.co.jp/hotpepper/large_area/v1/?format=json&key=***') .then(function(nn){ setdata2(nn.data.results.large_area) }) .catch(error => console.log(error)) },[]) const history=useNavigate() const branch2=useCallback((t)=>{ switch (t.target.value) { case 10: history('/North') break; case 20: history('/East') break; case 30: history('/West') break; default: return; } },[]) return ( <Context.Provider value={{branch2,data2}}> {children} </Context.Provider> ) }; export default Provider;

関数を使うファイル

import { memo } from "react"; import Menu from '@mui/material/Menu'; import MenuItem from '@mui/material/MenuItem'; import style from '../style.module.css' import { Context } from "./globalstate"; import { useContext } from "react"; import useProvider from "./customfook"; const Preselect=memo((props)=>{ // useContextから呼び出し const {branch2,data2}=useContext(Context) // カスタムフックから呼び出し const rock=useProvider() return( <> <button onClick={rock.branch1} value={10}>ボタン1</button> <button onClick={branch2} value={20}>ボタン2</button> <button onClick={branch2} value={30}>ボタン3</button> </> ) }) export default Preselect;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2022/06/08 11:58

> どちらを使ってもそれは可能かと思います。 逆に、この2つで迷う状況が想像できないのですが、どのような状況なのでしょうか。
shunta80

2022/06/09 07:52

関数を1つのファイルにまとめようと思い カスタムフックとuseContextの方法の両方試し、どちらでも同じ実装ができたので この2つの使い分け方がわからず質問しました。
maisumakun

2022/06/09 08:04

> カスタムフックとuseContextの方法の両方試し、どちらでも同じ実装ができたので そのコードをご提示ください。
shunta80

2022/06/10 03:22

コードを記載しました よろしくお願いいたします。
maisumakun

2022/06/10 03:39

この状況で、わざわざuseContextを使って実装する理由はどのようなものでしょうか?
shunta80

2022/06/10 04:33

単純に1つのファイルの記述が多くなるので、コードの長い関数を別ファイルに記載しようと思いました。 その場合はuseContextではなくカスタムフックを使用するべきでしょうか?
guest

回答1

0

ベストアンサー

カスタムフックとuseContextがありますが、どちらを使ってもそれは可能かと思います。

useContextは、「アプリケーション内の多くのコンポーネントから必要とされる」ものを「共有する」ための仕組みです(React公式)。

データを共有しない箇所で使うのは過剰装備です。

投稿2022/06/10 03:43

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2022/06/10 03:44

コンテクストは、ある React コンポーネントのツリーに対して「グローバル」とみなすことができる、現在の認証済みユーザ・テーマ・優先言語といったデータを共有するために設計されています(Reactのサイトより)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問