Photo by Lautaro Andreani on Unsplash
Memahami Komponen Presentational dan Container pada React
Memahami Perbedaan Presentational dan Container Components di React
Pada postingan blog ini kita akan mengekplorasi tentang React component. Ini menjelaskan dua jenis komponen - Presentational dan Container, karena keduanya bisa lebih dipahami sebagai pasangan.
Sebelum kita mulai mengekplorasi lebih jauh, kita perlu memahami dua hal:
Dua tipe ini tidak meng-extend class dasar dari
React.Component
. Tidak ada tipe sepertiPresentational
atauContainer
. Ini lebih seperti konvensi atau pattern/pola. Dimana para developer biasanya menggunakan ketika membuat sebuah aplikasi dengan React.Pasangan ini juga bisa disebut sebagai stateless dan statefull atau impure dan pure component, tapi ini tidak sama. Presentational component dapat menjadi statefull, dan Container component dapat menjadi stateless juga, dan mereka juga dapat menjadi functional component atau class component.
Pengenalan dan Gambaran
Seperti yang sudah disebutkan diatas, devisi untuk Presentational component dan Container component adalah development pattern, biasanya digunakan oleh developer untuk membedakan komponen berdasarkan tujuannya:
Presentational component mengatur bagaimana sesuatu terlihat.
Container component mengatur bagaimana sesuatu berkerja.
Fitur Utama dari Presentational Component
Fungsi utamanya adalah untuk menampilkan data.
Biasanya hanya berisi method
render()
atau hanyaJSX
.Memiliki style.
Tidak memiliki state (Ketika memiliki, itu bisanya state UI bukan data).
Tidak tahu bagaimana cara merubah data.
Menerima data melalui props dari Container component.
Biasanya ditulis sebagai stateless functional component (Meskipun ini bukan aturan)
Contoh
const Book = ({ title, img_url }) => (
<div className="book">
<img src={img_url} alt={title}/>
<h3>{title}</h3>
</div>
)
export default Book;
Contoh diatas hanya memiliki satu tugas yang harus dilakukan yaitu me-render props yang diterima yaitu title
dan img_url
kedalam DOM.
Contoh berikut juga merupakan contoh dari Presentational component
karena apa yang sebenarnya dilakukan adalah menentukan cara menampilkan daftar komponen dan mengirim data melalui props ke child component.
const BookList = ({ books }) => (
<div className="book-list">
{ books.map(book => <Book title={book.title} img_url={book.img_url} />) }
</div>
)
export default BookList;
Presentational component mendapatkan data dari Container component, dan jika kita lihat relasinya, itu adalah relasi child-parent, dimana Presentational component sebagai child dan Container component hampir disetiap kasus merupaka parent dari Presentational component.
Fitur Utama dari Container Component
Fungsi utamanya adalah mengatur prilaku data.
Berisi lebih banyak element/komponen dengan fungsi
render()
(Presentational component, lifecycle methods atau hooks)Tidak memiliki style.
Memiliki state dan mengaturnya.
Memberikan data ke children component.
Selalu ditulis sebagai statefull class component (walaupun saat ini cenderung ditulis menggunakan hooks, jadi paling sering ditulis sebagai functional statefull component)
Contoh (class component)
import BookList from './BookList'
class BookList extends Component {
constructor(props) {
super(props);
this.state = {
books: []
};
}
componentDidMount() {
fetch('https://learn-co-curriculum.github.io/books-json-example-api/books.json')
.then(response => response.json())
.then(bookData => this.setState({ books: bookData.books }))
}
render() {
return <BookList books={this.state.books} />
}
}
export default BookListContainer;
Contoh (funtional component)
import BookList from './BookList';
import {useState, useEffect} from 'react';
const BookList = () => {
const [books, setBooks] = useState([]);
useEffect(() => {
fetch('https://learn-co-curriculum.github.io/books-json-example-api/books.json')
.then(response => response.json())
.then(bookData => setBooks({bookData.books}) }, []);
}
render() {
return <BookList books={books} />
}
}
export default BookListContainer;
Kesimpulan
2 jenis komponen ini selalu berjalan bersamaan karena memiliki pola yang sama. Karena React terus berkembang, dimungkinkan untuk menulis aplikasi React HANYA menggunakan fungsional component
dan hook
, karena mereka dapat menyelesaikan sebagian besar masalah sekarang. Pemisahan masalah antara Presentational dan logika adalah cara yang baik untuk lebih memahami bagaimana aplikasi kita harus bekerja dan UI apa yang akan dimilikinya. Tetapi pola ini BUKANLAH suatu keharusan dan kamu dapat menggunakannya jika menurut kamu wajar untuk aplikasi kamu.
Sumber