Hari 19: React Hooks

30 Hari Javascript

Subscribe to my newsletter and never miss my upcoming articles

Pada saat menulis ini saya baru sadar, kenapa tidak materi Hooks terlebih dahulu saya tulis kemudian redux, tapi yasudahlah, anggap saja ini seperti movie dengan alur maju mundur.

React Hooks

Sejak react versi 16.8, hooks diperkenalkan sehingga component dengan function memiliki akses ke state dan lifecycle secara sederhananya.

useState

useState adalah cara menggunakan state pada react hooks, cara penggunaannya sangat simple dengan mendeklarasikan array untuk menyimpan data dan untuk pengubahnya.

const [hitung, updateHitung] = useState(0);

Penggunaannya seperti berikut.

import React, { useState } from "react";

const Perhitungan = () => {
  const [hitung, updateHitung] = useState(0);

  return (
    <div>
      {hitung}

      <button onClick={() => updateHitung(hitung + 1)}> Tambah 1</button>
    </div>
  );
};

useRef

Hooks useRef digunakan untuk membuat pointer atau referensi terhadap elemen DOM.

Cara penggunaannya.

import React, { useState, useRef } from "react";

const Perhitungan = () => {
  const inputRef = useRef(null);

  return (
    <div>
      <label>Input:</label>
      <input type="text" ref={inputRef} placeholder="Asrul Dev" />
      <button
        onClick={() => {
          const element = inputRef.current;
          element.focus();
        }}
      >
        Fokuskan!
      </button>
    </div>
  );
};

useEffect / lifeCycle Hooks

useEffect digunakan sebagai pengganti lifeCycle pada react versi class component.

Sebagai componentDidMount, jika parameter kedua adalah array kosong.

useEffect(() => {
  console.log("Mounted Yah:)");
}, []);

Sebagai componentWillMount adalah apasaja yang direturn pada useEffect.

useEffect(() => {
  console.log("Mounted Yah:)");

  return () => {
    console.log("Will UnMount Yah :(");
  };
}, []);

useEffect dijalankan jika props berubah.

useEffect(() => {
  console.log("Mounted Yah:)");
}, [props.nilaiAwal]);

Jalankan jika state berubah.

useEffect(() => {
  console.log("Hitung terapdet");
}, [hitung]);

Konsum Redux

Sebelumnya kita telah membahas redux. Sempat terhenti karena ada materi penting yang harus dipahami sebelum konsum redux, yaitu Hooks pada react. Sekarang setelah kita bahas tentang Hooks, maka materi ini barulah bisa lanjut kembali.

Pada file pages/Home.js konsums redux dengan mengubah kode menjadi seperti berikut.

import React, { useEffect } from "react";
import { useDispatch, useSelector } from "react-redux";
import { getUsers } from "../actions/user.action";

const Home = (props) => {
  const dispatch = useDispatch();
  const usersData = useSelector((state) => state.users);

  useEffect(() => {
    dispatch(getUsers());
  }, []);

  return (
    <div className="page">
      <h1 className="page-title">Member 30 Hari Js</h1>

      {usersData.isLoading && <h1>Loading ....</h1>}

      {usersData.isError && <h1>Error Data ....</h1>}
      <div className="users">
        {!usersData.isError &&
          usersData.data.length > 0 &&
          usersData.data.map((user, index) => (
            <div className="user" key={index}>
              <div className="user-img-container">
                <img src={user.picture} alt={user.picture} />
              </div>
              <div className="user-detail">
                <h3> {user.name} </h3>
              </div>
            </div>
          ))}
      </div>
    </div>
  );
};

export default Home;

Penggunaan map baca disini

Kemudia poles sedikt dengan mengubah css agar tampilan lebih menarik, sehingga file App.css menjadi seperti berikut.

* {
  margin: 0;
  padding: 0;
  text-decoration: none;
  list-style: none;
}

body {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -ms-flex-direction: column;
  flex-direction: column;
  min-height: 100vh;
}

body nav {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: horizontal;
  -webkit-box-direction: normal;
  -ms-flex-direction: row;
  flex-direction: row;
  -webkit-box-pack: end;
  -ms-flex-pack: end;
  justify-content: flex-end;
  -webkit-box-align: center;
  -ms-flex-align: center;
  align-items: center;
  background: green;
  width: 100%;
  height: 40px;
}

body nav li {
  margin-right: 2rem;
}

body nav li a {
  color: white;
}

body nav li a:hover {
  color: yellow;
}

body main {
  padding: 3rem;
  color: gray;
}

.page {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -ms-flex-direction: column;
  flex-direction: column;
}

.page .page-title {
  color: black;
  text-align: center;
  margin-bottom: 1rem;
}

.page .users {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: start;
  -ms-flex-pack: start;
  justify-content: flex-start;
}

.page .users .user {
  width: 25%;
  border: 1px green solid;
  margin-right: 1rem;
}

.page .users .user:nth-child(4n) {
  margin-right: 0;
}

.page .users .user .user-img-container img {
  width: 100%;
  -o-object-fit: cover;
  object-fit: cover;
}

.page .users .user .user-detail h3 {
  text-align: center;
  margin-top: 0.5rem;
  margin-bottom: 0.5rem;
}

Hasil nya akan menjadi seperti berikut.

https://raw.githubusercontent.com/AsrulLove/img-db/master/hasil1.gif

No Comments Yet