レスポンスデータの送信
20699 ワード
📌Fetch関数PostをFormDateに変換 //ReviewForm.js
import { createReview } from '../api';
const INITIAL_VALUES = {
title: '',
rating: 0,
content: '',
imgFile: null,
};
const handleSubmit = async (e) => {
e.preventDefault();
const formData = new FormData();
formData.append('title', values.title);
formData.append('rating', values.rating);
formData.append('content', values.content);
formData.append('imgFile', values.imgFile);
try {
setSubmittingError(null);
setIsSubmitting(true);
await createReview(formData);
} catch (error) {
setSubmittingError(error);
return;
} finally {
setIsSubmitting(false);
}
setValues(INITIAL_VALUES);
};
<button disabled={isSubmitting} type="submit">
확인
</button>
{submittingError && <div>{submittingError.message}</div>}
//api.js
export async function createReview(formData) {
const response = await fetch(`${BASE_URL}/film-reviews`, {
method: 'POST',
body: formData,
});
if (!response.ok) {
throw new Error('리뷰를 생성하는데 실패했습니다.');
}
const body = await response.json();
return body;
fetch関数でPostを行う場合はformDataを使用することが望ましい.
📌React Hook
🔍Hookのルール
//ReviewForm.js
import { createReview } from '../api';
const INITIAL_VALUES = {
title: '',
rating: 0,
content: '',
imgFile: null,
};
const handleSubmit = async (e) => {
e.preventDefault();
const formData = new FormData();
formData.append('title', values.title);
formData.append('rating', values.rating);
formData.append('content', values.content);
formData.append('imgFile', values.imgFile);
try {
setSubmittingError(null);
setIsSubmitting(true);
await createReview(formData);
} catch (error) {
setSubmittingError(error);
return;
} finally {
setIsSubmitting(false);
}
setValues(INITIAL_VALUES);
};
<button disabled={isSubmitting} type="submit">
확인
</button>
{submittingError && <div>{submittingError.message}</div>}
//api.js
export async function createReview(formData) {
const response = await fetch(`${BASE_URL}/film-reviews`, {
method: 'POST',
body: formData,
});
if (!response.ok) {
throw new Error('리뷰를 생성하는데 실패했습니다.');
}
const body = await response.json();
return body;
🔍Hookのルール
🔍useCallback
const handleLoad = useCallback((option) => {
// ...
}, [dep1, dep2, dep3, ...]);
関数を作成する場合は、数値コピーのリストが変更されるだけで、毎回新しい関数が作成されるわけではありません.📌なぜContextを書くのですか?
サブエレメントにstateを書き込むには、親エレメントからpropに降格し続ける必要があります.
これを防ぐためにContextが作成され、グローバルで利用可能な変数が生成されます.
🔍Contextとは?
多数のコンポーネントで使用されるデータは、重複した支柱伝達なしで共有されます.
🔍Contextの適用
Contextを使用する場合は、使用範囲を設定して書き込む必要があります.この場合、範囲をProviderという名前の構成部品に設定できます.
ContextはcreateContextというレスポンス関数を使用して作成できます.import { createContext } from 'react';
const LocaleContext = createContext('ko');
function App() {
return (
<div>
... 바깥의 컴포넌트에서는 LocaleContext 사용불가
<LocaleContext.Provider value="en">
... Provider 안의 컴포넌트에서는 LocaleContext 사용가능
</LocaleContext.Provider>
</div>
);
}
🔍Contextの使用
Contextという名前のHookでContextを使用します.芸術作品として使うContextをめくってみましょうimport { createContext, useContext } from 'react';
const LocaleContext = createContext('ko');
function Board() {
const locale = useContext(LocaleContext);
return <div>언어: {locale}</div>;
}
function App() {
return (
<div>
<LocaleContext.Provider value="en">
<Board />
</LocaleContext.Provider>
</div>
);
}
🔍StateとHookを併用
共有範囲を設定するProviderコンポーネントを追加し、stateを作成してvalueに渡します.
Contextに値を含めると、userLocale、userSetLocaleのようにカスタムhookを作成できます.import { createContext, useContext, useState } from 'react';
const LocaleContext = createContext({});
export function LocaleProvider({ children }) {
const [locale, setLocale] = useState();
return (
<LocaleContext.Provider value={{ locale, setLocale }}>
{children}
</LocaleContext.Provider>
);
}
export function useLocale() {
const context = useContext(LocaleContext);
if (!context) {
throw new Error('반드시 LocaleProvider 안에서 사용해야 합니다');
}
const { locale } = context;
return locale;
}
export function useSetLocale() {
const context = useContext(LocaleContext);
if (!context) {
throw new Error('반드시 LocaleProvider 안에서 사용해야 합니다');
}
const { setLocale } = context;
return setLocale;
}
}
Reference
この問題について(レスポンスデータの送信), 我々は、より多くの情報をここで見つけました
https://velog.io/@winethaysay/React-데이터-보내기
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
import { createContext } from 'react';
const LocaleContext = createContext('ko');
function App() {
return (
<div>
... 바깥의 컴포넌트에서는 LocaleContext 사용불가
<LocaleContext.Provider value="en">
... Provider 안의 컴포넌트에서는 LocaleContext 사용가능
</LocaleContext.Provider>
</div>
);
}
import { createContext, useContext } from 'react';
const LocaleContext = createContext('ko');
function Board() {
const locale = useContext(LocaleContext);
return <div>언어: {locale}</div>;
}
function App() {
return (
<div>
<LocaleContext.Provider value="en">
<Board />
</LocaleContext.Provider>
</div>
);
}
import { createContext, useContext, useState } from 'react';
const LocaleContext = createContext({});
export function LocaleProvider({ children }) {
const [locale, setLocale] = useState();
return (
<LocaleContext.Provider value={{ locale, setLocale }}>
{children}
</LocaleContext.Provider>
);
}
export function useLocale() {
const context = useContext(LocaleContext);
if (!context) {
throw new Error('반드시 LocaleProvider 안에서 사용해야 합니다');
}
const { locale } = context;
return locale;
}
export function useSetLocale() {
const context = useContext(LocaleContext);
if (!context) {
throw new Error('반드시 LocaleProvider 안에서 사용해야 합니다');
}
const { setLocale } = context;
return setLocale;
}
}
Reference
この問題について(レスポンスデータの送信), 我々は、より多くの情報をここで見つけました https://velog.io/@winethaysay/React-데이터-보내기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol