Terakhir diperbaharui: Mar 1, 2021
Data & Event Handling
Daftar Isi
props state Pilih mana antara props dan state? Unidirectional Data Flow Komunikasi data antar component Event HandlingReact menggunakan props dan state untuk menghandle data di component
props
props adalah singkatan dari properties.
React component adalah seperti function JavaScript, jika function JavaScript bisa menerima sebuah argument maka React component bisa menerima props.
Dimana value dari props ini akan ditampilkan pada React element.
1<Component propsName="value" />
Data di dalam props ini dapat diakses di dalam component atau child component dengan mengakses object bernama props.
Kita akan tambahkan props pada component di App.js.
1const User = (props) => {2 const { name } = props; // access name properties from props object using destructuring3 return (4 <div>5 <h2>Hello {name}</h2>6 </div>7 );8};910export default function App() {11 return (12 <div>13 <User name="Brachio" />14 </div>15 );16}
Perlu diperhatikan bahwa props bersifat read-only, yang berarti data dari props tidak bisa diubah.
state
state digunakan untuk menghandle data di dalam component yang terus berubah.
state hanya bisa diakses di dalam component dimana state itu dibuat, sehingga tidak bisa diakses dari component lain.
Dalam sebuah React App perubahan dalam component atau proses render seringkali bergantung pada state.
Inisialisasi state
Pada React Function component inisialisasi state dilakukan dengan menggunakan React Hook useState().
1import React, { useState } from 'react';23export default function App() {4 const [state, setState] = useState('brachio');56 return (7 <div>8 <h1>Hello Devsaurus</h1>9 <p>My Name is {state}</p>10 </div>11 );12}
state untuk menyimpan data
setState untuk mengubah data
state pada dasarnya adalah sebuah object, sehingga kita bisa menggunakan nama lain seperti:
1const [name, setName] = useState('brachio');
namun untuk saat ini kita akan tetap menggunakan nama state untuk mewakili state dalam component.
Mengakses value dari state
Value dari state dapat diakses di dalam component dengan menambahkan curly brackets {}.
1import React, { useState } from 'react'; // import useState23export default function App() {4 const [state, setState] = useState('brachio');56 return (7 <div>8 <h1>Hello Devsaurus</h1>9 <p>My Name is {state}</p>10 </div>11 );12}
Mengubah state
state tidak bisa diubah secara langsung, untuk mengubah state kita harus menggunakan method setState().
1import React, { useState } from 'react';23export default function App() {4 const [state, setState] = useState('brachio');56 const handleChange = () => {7 setState('t-rex');8 };910 return (11 <div>12 <h1>Hello Devsaurus</h1>13 <p>My Name is {state}</p>14 <button onClick={handleChange}>Change Name</button>15 </div>16 );17}
Pada code di atas kita menambahkan sebuah button, dimana button tersebut jika diklik akan mengubah value dari state.
Mengubah state tanpa menggunakan setState() membuat component tidak akan di re-render.
Pilih mana antara props dan state?
Jawabannya adalah keduanya, karena komunikasi data antar component sulit dilakukan tanpa memakai keduanya.
props & state pada React Class Component
Untuk mempelajari props & state pada React Class Component silahkan lihat disini.
Unidirectional Data Flow
Kita perlu memahami bagaimana data 'mengalir' dari satu component ke component yang lain.
React menerapkan konsep Unidirectional Data Flow , yaitu data mengalir hanya satu arah dari parent component ke child component.
Komunikasi data antar component
Sampai disini mungkin akan timbul pertanyaan, bagaimana kita bisa mengirim data dari component satu ke component lain jika props dan state tidak bisa diakses antar component dan data hanya mengalir satu arah dari parent ke child?
Ada beberapa teknik yang bisa digunakan, dan teknik-teknik ini sering dipakai bersamaan.
1. Parent ke child menggunakan props
Untuk mengirim data state yang ada di parent component ke child component kita bisa mengubah state tersebut menjadi props untuk child component.
1import React, { useState } from 'react';23const User = (props) => {4 const { name } = props;56 return (7 <div>8 <p>My Name is {name} </p>9 </div>10 );11};1213export default function App() {14 const [state, setState] = useState('brachio');1516 return (17 <div>18 <h1>Hello Devsaurus</h1>19 <User name={state} />20 </div>21 );22}
2. Child ke parent menggunakan callback
Teknik ini bisa dibilang sedikit tricky karena sebagaimana dijelaskan bahwa data pada react mengalir dari parent ke child, teknik ini dipakai karena terkadang kita 'terpaksa' mengirim data dari child component ke parent component.
Untuk menggunakan teknik ini kita perlu memahami bagaimana React menghandle event yang terjadi dalam suatu component.
1import React, { useState } from 'react';23const User = (props) => {4 const { send } = props;56 const sendDataToParent = () => {7 send('brachio');8 };910 return (11 <div>12 <button onClick={sendDataToParent}>Get Name from Child</button>13 </div>14 );15};1617export default function App() {18 const [state, setState] = useState('');1920 const getName = (name) => {21 setState(name);22 };2324 return (25 <div>26 <h1>Hello Devsaurus</h1>27 <User send={getName} />28 <p>My Name is {state}</p>29 </div>30 );31}
Pada code di atas:
- line 28, getName adalah callback function yang dikirim ke child sebagai props bernama send
- line 13, send pada child dieksekusi ketika button diclick melalui event handler sendDataToParent
- line 8, send menerima argument berupa data dari child. Karena getName sama dengan send maka getName juga menerima data yang sama
- Selanjutnya callback getName mengubah state pada parent dengan data yang diterima dari child component
3. Context
Kita bisa anggap context sebagai global state dan biasanya context ini dibuat di root component.
Karena bersifat global maka semua component di bawah root component dapat mengakses data yang ada di dalam context.
Pembahasan detail tentang context dibahas pada materi React Hook useContext().
4. React State Management Library
React State Management Library seperti Redux atau Recoil dapat digunakan untuk mengatur state di setiap component dan komunikasi yang terjadi antar component.
Namun baik Redux atau Recoil memiliki konsep atau aturan main sendiri untuk bisa menggunakannya. Sehingga butuh waktu untuk mempelajarinya.
React state management library sering digunakan pada React App yang kompleks yang mungkin telah memiliki puluhan bahkan ratusan component dan harus mengelola data dari banyak server/source.
Event Handling
Kita ambil penjelasan bagaimana React menghandle sebuah event dari dokumentasi React :
Handling event pada React mirip dengan handling event pada DOM element, namun dengan sedikit perbedaan:
- React event menggunakan camelCase, bukan lowercase
- Handler untuk event adalah sebuah function yang ditulis diantara curly braces
{}
dan tidak ditulis dalam bentuk string
Kita ambil contoh code pada pembahasan setState() sebelumnya:
1import React, { useState } from 'react';23export default function App() {4 const [state, setState] = useState('brachio');56 const handleChange = () => {7 setState('t-rex');8 };910 return (11 <div>12 <h1>Hello Devsaurus</h1>13 <p>My Name is {state}</p>14 <button onClick={handleChange}>Change Name</button>15 </div>16 );17}
Event klik button pada React tidak ditulis onclick tapi onClick.
Event handler bernama handleChange berfungsi untuk menghandle event onClick, yang berarti ketika button di klik maka function bernama handleChange akan dieksekusi.
Event handler dengan Argument
1import React, { useState } from 'react';23export default function App() {4 const [state, setState] = useState('brachio');56 const handleChange = (name) => {7 setState(name);8 };910 return (11 <div>12 <h1>Hello Devsaurus</h1>13 <p>My Name is {state}</p>14 <button onClick={() => handleChange('t-rex')}>Change Name</button>15 </div>16 );17}
Untuk event handler dengan argument kita harus menggunakan arrow function(untuk function component):
1<button onClick={() => handleChange('t-rex')}>Change Name</button>
Dan kita tidak bisa menulisnya seperti ini
1<button onClick={handleChange('t-rex')}>Change Name</button>
Jika kita menulisnya tanpa arrow function seperti di atas maka event handler akan dieksekusi di awal pada saat component mulai di-mount, sehingga tidak dieksekusi berdasarkan event yang terjadi di dalam component.