์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[React] Fetch data in React (2)๐Ÿ’ฆ

๐Ÿ˜Ž ์ง€์‹ in Action/React, Typescript, Javascript ๐ŸŒ

by :ํ•ดํ”ผ๋ž˜๋น—๐Ÿพ 2021. 5. 27. 15:15

๋ณธ๋ฌธ

4๋‹จ๊ณ„. Fetch Data with async/await in react

์•ž์—์„œ๋Š” javascript์˜ promises ์˜ then๊ณผ catch ๋ธ”๋ก์„ ์‚ฌ์šฉํ–ˆ์Œ.

ํ•˜์ง€๋งŒ, then() ๋Œ€์‹ ์— async/await statement๋ฅผ react์—์„œ data๋ฅผ fetchํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

import React, { Component } from 'react';
import axios from 'axios';
 
const API = 'https://hn.algolia.com/api/v1/search?query=';
const DEFAULT_QUERY = 'redux';
 
class App extends Component {
  ...
 
  async componentDidMount() {
    this.setState({ isLoading: true });
 
    try {
      const result = await axios.get(API + DEFAULT_QUERY);
 
      this.setState({
        hits: result.data.hits,
        isLoading: false
      });
    } catch (error) {
      this.setState({
        error,
        isLoading: false
      });
    }
  }
 
  ...
}
 
export default App;

async (๋น„๋™๊ธฐ) 

await ๋ฌธ์€ ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋น„๋™๊ธฐ ์ ์œผ๋กœ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€๊ธฐ ํ•œ ์š”์ฒญ์ด ํ•ด๊ฒฐ๋˜๊ธฐ ์ „์— ๋‹ค์Œ ์ค„์ด ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.  ๋˜ํ•œ ์š”์ฒญ์ด ์‹คํŒจ ํ•  ๊ฒฝ์šฐ try ๋ฐ catch ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5๋‹จ๊ณ„. Fetch Data in higher order component

๋ฐ˜๋ณต๋˜๋Š” fetch ์ž‘์—…์„ ์ค„์ด์ž.(์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ๋งŽ์•„์ง)

component๊ฐ€ mount๋  ๋•Œ, data๋ฅผ fetchํ•˜๊ณ  loading์ค‘, ์ด๋‚˜ error ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฑฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์Œ.

2๊ฐ€์ง€ ์ฑ…์ž„์œผ๋กœ componet๊ฐ€ ์ž˜๋ผ์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ, 

showing the fetched data with conditional renderings and fetching the remote data with storing it in local state afterward. Whereas the former is only there for rendering purposes, the latter could be made reusable by a higher-order component.

 

> ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ !

https://www.robinwieruch.de/react-higher-order-components/


6๋‹จ๊ณ„. Fetch Data in render props

const API = 'https://hn.algolia.com/api/v1/search?query=';
const DEFAULT_QUERY = 'redux';
 
...
 
const RenderPropApproach = () =>
  <Fetcher url={API + DEFAULT_QUERY}>
    {({ data, isLoading, error }) => {
      if (!data) {
        return <p>No data yet ...</p>;
      }
 
      if (error) {
        return <p>{error.message}</p>;
      }
 
      if (isLoading) {
        return <p>Loading ...</p>;
      }
 
      return (
        <ul>
          {data.hits.map(hit =>
            <li key={hit.objectID}>
              <a href={hit.url}>{hit.title}</a>
            </li>
          )}
        </ul>
      );
    }}
  </Fetcher>

7๋‹จ๊ณ„. Fetch data in hook

 

https://www.robinwieruch.de/react-hooks-fetch-data

- ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ

import React, { useState, useEffect } from 'react';
import axios from 'axios';
 
function App() {
  const [data, setData] = useState({ hits: [] });
 
  useEffect(() => {
    const fetchData = async () => {
      const result = await axios(
        'https://hn.algolia.com/api/v1/search?query=redux',
      );
 
      setData(result.data);
    };
 
    fetchData();
  }, []); //๋ Œ๋”๋ง ์ตœ์ดˆ์—๋งŒ
 
  return (
    <ul>
      {data.hits.map(item => (
        <li key={item.objectID}>
          <a href={item.url}>{item.title}</a>
        </li>
      ))}
    </ul>
  );
}
 
export default App;

- query๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งŒ, ๋‹ค์‹œ fetch

default๋กœ query๊ฐ’ ์ €์žฅ. 

loading์ค‘, error์ฒ˜๋ฆฌ

๋”๋ณด๊ธฐ
import React, { Fragment, useState, useEffect } from 'react';
import axios from 'axios';
 
function App() {
  const [data, setData] = useState({ hits: [] });
  const [query, setQuery] = useState('redux');
  const [url, setUrl] = useState(
    'https://hn.algolia.com/api/v1/search?query=redux',
  );
  const [isLoading, setIsLoading] = useState(false);
  const [isError, setIsError] = useState(false);
 
  useEffect(() => {
    const fetchData = async () => {
      setIsError(false);
      setIsLoading(true);
 
      try {
        const result = await axios(url);
 
        setData(result.data);
      } catch (error) {
        setIsError(true);
      }
 
      setIsLoading(false);
    };
 
    fetchData();
  }, [url]);
 
  return (
    <Fragment>
      <input
        type="text"
        value={query}
        onChange={event => setQuery(event.target.value)}
      />
      <button
        type="button"
        onClick={() =>
          setUrl(`http://hn.algolia.com/api/v1/search?query=${query}`)
        }
      >
        Search
      </button>
 
      {isError && <div>Something went wrong ...</div>}
 
      {isLoading ? (
        <div>Loading ...</div>
      ) : (
        <ul>
          {data.hits.map(item => (
            <li key={item.objectID}>
              <a href={item.url}>{item.title}</a>
            </li>
          ))}
        </ul>
      )}
    </Fragment>
  );
}
 
export default App;

 

 

custom data fetching in hook ๋ถ€ํ„ฐ~ ์‹œ์ž‘!

728x90

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ