Penggunaan useEffect untuk fetching data

Penggunaan useEffect untuk fetching data

Halo, sebenernya ini tutorial ga penting penting amat karna sebenernya udah ada di dokumentasi react, tapi karna orang indo biasanya males males baca artikel luar dan gw bingung mau nulis apa, yaudah bikin ginian aja.. lol

ok. pertama apa itu useEffetct?
useEffect adalah API pengganti buat componentDidMount dan componentDidUpdate. pada defaultnya useEffect akan dijalankan setiap pertama kali render, dan setiap ada update

untuk contoh pertama kita pake contoh yang ada di dokumentasinya aja karna gw mager bikin contoh lain lol

1const Example = () => {
2const [count, setCount] = useState(0);  
3useEffect(() => {    
4  document.title = `You clicked ${count} times`;    
5});
6}

nah contoh diatas adalah script buat agar setiap count berubah, judul halaman juga berubah..
jadi, ketika setCount dijalankan, maka count akan terupdate, nah ketika count ter update, useEffect akan dijalankan sehingga judul halaman berubah. Simplenya, useEffect ini buat subscribe suatu state stiap ada perubahan lah..

nah selain digunakan untuk subscribe setiap ada perubahan, useEffect ini punya parameter kedua, untuk nentuin data apa yang di subscribe

1const Example = (data) => {    
2const [count, setCount] = useState(0);    
3useEffect(() => {      
4  document.title = `data berubah`;    
5},data); //dia cuma bakal liat perubahan di data}}
6}

nah dengan contoh kode diatas, kita count bertambah useEffect ga bakal dijalankan, karena kita isi parameter ke 2 dengan variable data

parameter ke 2 sendiri bisa diisi dengan array kosong, gunanya buat bikin useEffect cuma dijalankan setiap mount dan unmount

1const Example = (data) => {  
2const [count, setCount] = useState(0);  
3useEffect(() => {  
4  document.title = `judul baru`;  
5},[]); //fungsi cuma bakal dijalankan saat mount dan unmount}
6}

ok sekarang kita bikin contoh kapan saya menggunakan useEffect

1import React, { useState, useEffect } from "react";
2
3const FComponent = () => {
4  const [state, setState] = useState({ data: [], offset: 0, limit: 5 });
5  const loadMore = () => {
6    setState({ ...state, offset: state.offset + 5, limit: state.limit + 5 });
7  };
8  useEffect(() => {
9    async function fetchData() {
10      console.log("fetch");
11      const response = await fetch(
12        `https://pokeapi.co/api/v2/pokemon/?offset=${state.offset}&limit=${
13          state.limit
14        }`
15      );
16      const data = await response.json();
17      setState(s => ({ ...s, data: [...s.data, ...data.results] }));
18    }
19    fetchData();
20  }, [state.offset, state.limit]);
21  return (
22    <div style={{ padding: 10 }}>
23      {state.data.map((data, i) => (
24        <div key={i}>{data.name}</div>
25      ))}
26      <button onClick={loadMore}>LoadMore</button>
27    </div>
28  );
29};
30
31export default FComponent;

ok sekarang kita bahas satu persatu potongan code diatas..

1useEffect(() => {
2    async function fetchData() {
3      console.log("fetch");
4      const response = await fetch(
5        `https://pokeapi.co/api/v2/pokemon/?offset=${state.offset}&limit=${
6          state.limit
7        }`
8      );
9      const data = await response.json();
10      setState(s => ({ ...s, data: [...s.data, ...data.results] }));
11    }
12    fetchData();
13  }, [state.offset, state.limit]);

fetchData adalah potongan code untuk ambil data dari api, nah karena useEffect dijalankan saat mount, dan parameter ke 2 berubah, maka dapetlah kita data dari API saat mount. nah, karena gw taro state.offset, dan limit di parameter ke 2, maka useEffect ini juga akan dijalankan ketika ada perubahan di kedua insan(?) tersebut..

nah di code

1const loadMore = () => {
2    setState({ ...state, offset: state.offset + 5, limit: state.limit + 5 });
3  };

gw ga manggil fetchData, tapi cuma ubah state offset sama limit maka fetchData akan dipanggil karena pengaruh useEffect seperti yang gw jelaskan diatas..

tarraaaa~ jadilah fungsi loadmore dengan useEffect..
kalo pengen coba langsung liat hasilnya bisa liat disini https://wc8ef.csb.app/

Terima Kasih sudah membaca

react