Sebelum materi ini dimulai, pastikan:
Apa saja yang akan dibahas?
Sebelum kita masuk ke React...
Ada baiknya kita mengetahui hal ini terlebih dahulu...
Apakah itu Pemrograman secara Imperatif vs Deklaratif
Imperatif | Deklaratif |
---|---|
How and What | What not How |
Prosedural (Runutan Perintah) | Logical (Output yang ingin dicapai) |
Sistem bodoh, kita yang pintar | Sistem pintar, kita tidak peduli |
Mari kita analogikan: Pesan Pizza
Imperatif
Deklaratif
Pilih yang mana?
Mari kita melihat secara kodingan
<script type="text/javascript">
const app = document.getElementById('app');
const header = document.createElement('h1');
const headerContent = document.createTextNode('Mari bikin Secara DOM');
header.appendChild(headerContent);
app.appendChild(header);
</script>
Instruksi secara langkah per langkah
<script type="text/jsx">
const app = document.getElementById('app');
ReactDOM.render(<h1>Mari bikin secara React</h1>, app);
</script>
Ngasih tau saja inginnya apa
Pilih yang mana?
React
Sebuah Pustaka JavaScript untuk membangun tampilan antar-muka
Perusahaan pengguna React
AirBNB
Netflix
Khan Academy
Paypal
Uber
Slack
Microsoft
Tanpa ba bi bu lagi ...
Mari buat project React !
Dengan menggunakan create-react-app atau CRA
# npx create-react-app <nama-project-yang-ingin-dibuat>
npx create-react-app app-react-pertamaku
cd app-react-pertamaku
WARNING:
Perintah di atas memerlukan waktu yang cukup lama, dan kuota yang cukup besar yah !
Per Mei 2022, satu project React dengan CRA adalah sekitar 300MB ++
Pada saat CRA dibuat, kira kira struktur foldernya adalah sebagai berikut:
app-react-pertamaku
│ .gitignore
│ package-lock.json
│ package.json
│ README.md
│
└───node_modules
│
└───public
│
└───src
│ │ App.css
│ │ App.js
│ │ App.test.js
│ │ ...
│ ...
node_modules
public
src
package.json & package_lock.json
Cara menjalankannya adalah dengan
npm run start
Yes aplikasi React-nya berjalan !!!
Padahal kan dengan DOM bisa bisa saja.
Kenapa React bisa selaku itu sih?
Mari kita coba lihat dari kode yang dibuat dengan DOM vs dibuat dengan React
<!-- Bagian Body -->
<p>Halo DOM !</p>
<p>Bahasaku:</p>
<ul id="listBahasa"></ul>
<!-- Bagian Script (DOM Manipulasi) -->
<script type="text/javascript">
const kumpulanBahasa = ['HTML', 'CSS', 'JavaScript'];
const penahanUl = document.getElementById('listBahasa');
// Untuk setiap list kita akan buatkan node li nya
let nodesLi = kumpulanBahasa.map((bahasa) => {
// Buat element li
const penahanLi = document.createElement('li');
penahanLi.textContent = bahasa;
return penahanLi;
});
// Kita buatkan si nodesnya
penahanUl.append(...nodesLi);
// ini sama saja dengan
// penahanUl.append(nodesLi[0], nodesLi[1], nodesLi[2]);
</script>
// Bagian Body
<div id="app"></div>
// Bagian Script (React)
import React from 'react';
export default function App() {
const kumpulanBahasa = ['JSX', 'CSS', 'React'];
return (
// Element HTML di sini (namanya JSX)
<div>
<p>Halo React !</p>
<p>Bahasaku:</p>
{/* Langsung kita buatkan listnya */}
{kumpulanBahasa.map((bahasa) => {
// Langsung kita returnkan list yang baru
return <li>{bahasa}</li>;
})}
</div>
);
}
Pilih yang mana?
Konsep Utama dalam React:
Umumnya pada HTML standar ataupun Pustaka / Framework lainnya, kita menuliskan "JS" di dalam HTML
=>
<div *ngFor="let user of users">
=>
<div v-for="user in users">
=>
{{#each user in users}}
Namun pada JSX, kita akan menuliskan HTML di dalam "JS" !
=>
{users.map(createUser)}
class HaloDunia extends React.Component {
render() {
return (
// Ini adalah penulisan JSXnya
<h1 className='hola'>Halo {this.nama}!</h1>
);
}
}
Catatan: Dalam JSX, penulisan JavaScript ada di dalam kurung kurawal { ... }
Perlu diingat juga bahwa JSX itu TIDAK SAMA dengan HTML
class Halo extends React.Component {
render() {
return (
<div className="container">
<h1>Baru mulai React nih !</h1>
</div>
)
}
}
ReactDOM.render(<Halo />, nodeUtama);
class Halo extends React.Component {
render() {
return (
React.createElement("div", {className: "container"},
React.createElement("h1", null, "Baru mulai React nih !")
);
)
}
}
ReactDOM.render(React.createElement(Halo, null), nodeUtama);
Tulisan dalam Component
Card Component
Image Component
Tulisan dalam Component
Text Component
Button Component
Pada demo ini kita akan membuat folder components di dalam folder src, kemudian kita akan membuat 2 buah file dengan nama ButtonClass dan ButtonFunctional
Demo dapat dilihat di sini
Walaupun demo ini diberikan, SANGAT DISARANKAN untuk mencoba mengetiknya sendiri di dalam VSCode, karena tulisan tangan sendiri akan jauh lebih teringat oleh memori tangan kita (muscle memory never lies) dan bisa menambah jam terbang kita terhadap React !
Hasil akhir dari demonya adalah sebagai berikut:
Hasil output bisa berbeda apabila diketik secara manual
dikarenakan adanya CSS yang telah disuntik ke dalam component
Masih ingat HTML kan?
Atribut pada HTML bisa diartikan sebagai Data yang bisa mengubah suatu keadaan dari element
<img src="https://placekitten.com/120">
<img src="https://placekitten.com/240">
<a href="https://www.google.com/">Google</a>
<a href="https://www.youtube.com/">Youtube<a>
Nah dengan cara yang mirip seperti ini juga, kita bisa men-transfer data sebagai property ke dalam sebuah Komponen React
Hal ini disebut dengan props
Mari kita coba modifikasi kode sebelumnya dengan props
Cara deklarasi Props
...
// Before Props
export default function App() {
return (
<div style={{ display: 'flex', flexDirection: 'row', gap: '0.5em' }}>
<ButtonClass />
<ButtonFunctional />
</div>
);
}
...
...
// After props
export default function App() {
return (
<div style={{ display: 'flex', flexDirection: 'row', gap: '0.5em' }}>
{/*
Sekarang kita akan mencoba untuk melemparkan data via props
asumsi nama props yang akan digunakan adalah "text"
*/}
<ButtonClass text="Button Class" />
<ButtonFunctional text="Button Functional" />
</div>
);
}
...
Cara menggunakan props (Functional)
import React from 'react';
// Cara 1: props dideclare sebagai parameter di dalam fungsi
const ButtonFunctional = (props) => {
// Lalu tinggal digunakan (asumsikan sebagai object)
return <button>{props.text}</button>;
};
export default ButtonFunctional;
import React from 'react';
// Cara 2: props dideclare sebagai parameter di dalam fungsi kemudian
// destructuring dalam fungsi
const ButtonFunctional = (props) => {
// Lalu destructuring
// Berawal dari
// const text = props.text;
// Disingkat jadi cara bawah (istilahnya destructuring)
const { text } = props;
// Gunakan, tanpa perlu gunakan kata-kata props
return <button>{text}</button>;
};
export default ButtonFunctional;
import React from 'react';
// Cara 3: props langsung di-destructuring sesuai kebutuhan
const ButtonFunctional = ({ text }) => {
// Gunakan, tanpa perlu gunakan kata-kata props
return <button>{text}</button>;
};
export default ButtonFunctional;
Cara menggunakan props (Class)
import React, { Component } from 'react';
class ButtonClass extends Component {
// Cara 1: Karena ini merupakan class React.Component,
// maka kita bisa memasukkan propsnya ke dalam super
// di dalam constructor
constructor(props) {
// di sini kita passing propsnya via super
// super adalah method untuk memanggil constructor dari parent
super(props);
}
render() {
// rendernya sekarang akan kita panggil dari props (object)
// props memiliki property dengan nama "text"
return <button>{this.props.text}</button>;
}
}
export default ButtonClass;
import React, { Component } from 'react';
class ButtonClass extends Component {
// Cara 2: Langsung gunakan this.props
// karena pada ES2015 diperkenalkan sesuatu yang dinamakan
// default class constructor
// Maka di sini kita bisa skip bagian constructor(props) {...}
// tersebut, karena sudah di-defaultkan
render() {
// rendernya sekarang akan kita panggil dari props (object)
// props memiliki property dengan nama "text"
return <button>{this.props.text}</button>;
}
}
export default ButtonClass;
Contoh kode props Class dan Functional dapat dilihat di sini
Bagaimana bila sekarang kita ingin menggunakan props, tapi ingin memiliki "default value" (nilai default bila props tidak digunakan)?
Salah satu solusinya adalah dengan menggunakan conditional rendering ini.
Kunci utamanya adalah dengan menggunakan ternary operator
kondisi ? exprJikaBenar : exprJikaSalah
Contoh kode conditional rendering dapat dilihat di sini
Kepala sudah panas dan overheat bukan?
Sebenarnya masih ada beberapa hal utama dari React yang belum kita pelajari loh...
Kita simpan untuk pertemuan selanjutnya yah !