B. useEffect
useEffect
adalah salah satu hook penting dalam React yang memungkinkan kita untuk menangani side effects dalam function component
. Side effects
adalah tindakan yang terjadi di luar lingkup pembaruan tampilan normal, seperti berlangganan data, memanggil API, memperbarui DOM, dan sejenisnya.
1. Penggunaaan useEffect
Note
fn
merupakanfunction
yang akan kita berikan ke dalam useEffect agar dipanggil setelah komponen selesai melakukan render.deps
adalahArray
berisi identifier baik variabel atau fungsi yang akan menyebabkanfn
dipanggil lagi saat nilaiidentifier
tersebut mengalami perubahan.- Pada Nextjs 13, gunakan
client component
jika menggunakanuseEffect
dengan menambahkan kode'use client'
Warning
Peringatan! fungsi fn
tidak boleh async
. Jika perlu fungsi async
bikin fungsi lain di luar effect
kemudian panggil di dalam effect
.
Berikut ini contoh sederhana dari useEffect
'use client'
import { useEffect } from "react";
const Home = () => {
useEffect(() => {
console.log("effect berjalan");
}, []);
return <div>Belajar useEffect</div>;
};
export default Home;
Pada kode di atas, jika komponen di render maka komponen akan menjalankan kode yang ada di dalam useEffect
dalam hal ini adalah console.log("effect berjalan")
.
2. useEffect
tanpa array dependency
Jika kita membuat useEffect
tanpa memberikan array depedency maka useEffect akan dipanggil terus menerus setiap kali komponen di render
, baik render
pertama maupun re-render
berikutnya. Seperti contoh berikut.
"use client";
import { useEffect, useState } from "react";
const Home = () => {
let [count, setCount] = useState(0);
useEffect(() => {
setCount((c) => c + 1);
console.log('useEffect berjalan')
});
return <div>{count}</div>;
};
export default Home;
Pada kode di atas, kita membuat useEffect
tanpa memberikan array depedency
, maka yang terjadi adalah useEffect akan berjalan terus menerus. Hal ini tidak disarankan karena akan membuat aplikasi menjadi crash.
Jalankan pada browser
3. useEffect
dengan array dependency
kosong
Jika kita memberikan array
kosong pada depedency
maka useEffect
hanya akan dijalankan sekali saja pada render
pertama.
"use client";
import { useEffect, useState } from "react";
const Home = () => {
let [count, setCount] = useState(0);
useEffect(() => {
setCount((c) => c + 1)
console.log('useEffect berjalan')
},[]);
return <div>{count}</div>;
};
export default Home;
Pada kode diatas, useEffect
akan dijalankan sekali ketika render pertama yang akan mengupdate nilai dari count.
Jalankan pada browser
4. useEffect
dengan array dependency
"use client";
import { useEffect, useState } from "react";
import InputText from "./component/InputText";
const Home = () => {
let [count, setCount] = useState(0);
let [text, setText] = useState("");
useEffect(() => {
setCount((c) => c + 1);
console.log("useEffect berjalan");
}, [text]);
return (
<>
<div>{count}</div>
<InputText
value={text}
id="text"
name="text"
onChange={(e) => {
setText(e.target.value);
}}
/>
</>
);
};
export default Home;
Jalankan pada browser
"use client";
import { useEffect, useState } from "react";
import InputText from "./component/InputText";
import Button from "./component/Button";
const Home = () => {
let [count, setCount] = useState(0);
let [text, setText] = useState("");
let [change, setChange] = useState(false);
useEffect(() => {
setCount((c) => c + 1);
console.log("useEffect berjalan");
}, [text, change]);
return (
<>
<div>{count}</div>
<InputText
value={text}
id="text"
name="text"
onChange={(e) => {
setText(e.target.value);
}}
/>
<Button
title="ubah count"
colorSchema="red"
variant="solid"
onClick={() => {
setChange(!change);
}}
/>
</>
);
};
export default Home;
Jalankan pada browser