ReactJS - Refs dan DOM

Hai, para pengembang React masa depan! Hari ini, kita akan mendalamkan sebuah topik yang menarik yang akan membantu Anda berinteraksi secara langsung dengan elemen DOM dalam aplikasi React Anda. Siapkan diri Anda, karena kita akan menelusuri dunia Refs dan DOM!

ReactJS - Refs and the DOM

Apa itu Refs?

Sebelum kita masuk ke hal yang mendalam, mari kita pahami apa itu Refs. Dalam React, "Ref" adalah singkatan dari "reference". Itu seperti memberikan tag nama pada elemen tertentusehingga Anda dapat menemukannya nanti dengan mudah. Bayangkan Anda di sebuah pesta besar, dan Anda ingin mencatat teman terbaik Anda. Anda mungkin memberikan mereka topi khusus atau tag nama unik. Itu sebenarnya apa yang dilakukan Ref di React - itu membantu Anda mencatat elemen tertentu.

Mengapa kita memerlukan Refs?

Anda mungkin berpikir, " Mengapa kita tidak bisa hanya menggunakan JavaScript biasa untuk memilih elemen?" Well, dalam React, kita mencoba untuk menghindari manipulasi DOM secara langsung (Document Object Model) karena React memiliki cara yang efisien untuk memperbarui UI. Namun, ada saat-saat saat kita perlu melangkah keluar dari paradigma deklaratif React dan bekerja secara langsung dengan elemen DOM. Itu adalah saat Refs berguna!

Membuat Refs dengan createRef()

Ayo mulai dengan melihat bagaimana kita membuat Ref di React. Kita menggunakan metode yang disebut createRef().

Tanda tangan metode createRef

Tanda tangan createRef() cukup sederhana:

React.createRef()

Itu saja! Tidak ada parameter, tidak ada kesulitan. Itu mengembalikan objek biasa dengan satu properti: current. Awalnya, properti current ini diatur ke null.

mari lihat contoh:

class MyComponent extends React.Component {
constructor(props) {
super(props);
this.myRef = React.createRef();
}

render() {
return <div ref={this.myRef} />;
}
}

Dalam contoh ini, kita membuat Ref di constructor dan mengassignnya ke this.myRef. Kemudian di metode render, kita melekatkan Ref ini ke elemen div menggunakan atribut ref.

Mengaplikasikan ref

Sekarang kita telah membuat Ref, mari lihat bagaimana kita dapat menggunakannya. Ada beberapa cara untuk mengaplikasikan Ref:

1. Refs pada Elemen DOM

Penggunaan paling umum adalah untuk menerapkan Ref ke elemen DOM:

class AutoFocusInput extends React.Component {
constructor(props) {
super(props);
this.inputRef = React.createRef();
}

componentDidMount() {
this.inputRef.current.focus();
}

render() {
return <input ref={this.inputRef} />;
}
}

Dalam contoh ini, kita membuat Ref untuk elemen input. Setelah komponen terpasang, kita menggunakan Ref untuk secara otomatis fokuskan input. Properti current Ref memberikan kita akses ke node DOM yang sebenarnya.

2. Refs pada Komponen Kelas

Anda juga dapat menggunakan Refs dengan komponen kelas:

class AutoScrollingList extends React.Component {
constructor(props) {
super(props);
this.listRef = React.createRef();
}

componentDidUpdate() {
const node = this.listRef.current;
node.scrollToItem(0);
}

render() {
return <MyListComponent ref={this.listRef} />;
}
}

Dalam kasus ini, this.listRef.current akan menunjuk ke instance kelas MyListComponent.

3. Refs dan Komponen Fungsional

Komponen fungsional tidak bisa secara langsung diberikan Refs, tapi Anda dapat menggunakan fungsi forwardRef untuk meneruskan Refs:

const FancyButton = React.forwardRef((props, ref) => (
<button ref={ref} className="FancyButton">
{props.children}
</button>
));

class MyComponent extends React.Component {
constructor(props) {
super(props);
this.buttonRef = React.createRef();
}

render() {
return <FancyButton ref={this.buttonRef}>Klik saya!</FancyButton>;
}
}

Dalam contoh ini, FancyButton menggunakan forwardRef untuk meneruskan Ref ke elemen tombol yang sebenarnya.

Kasus penggunaan createRef

Sekarang kita tahu bagaimana membuat dan mengaplikasikan Refs, mari lihat beberapa kasus penggunaan umum:

1. Mengelola fokus, pemilihan teks, atau pemutaran media

class TextInput extends React.Component {
constructor(props) {
super(props);
this.inputRef = React.createRef();
}

focusTextInput = () => {
this.inputRef.current.focus();
}

render() {
return (
<div>
<input type="text" ref={this.inputRef} />
<button onClick={this.focusTextInput}>Fokuskan input</button>
</div>
);
}
}

Komponen ini memungkinkan kita untuk secara imperatif fokuskan input saat tombol diklik.

2. Mengaktifkan animasi imperatif

class Animator extends React.Component {
constructor(props) {
super(props);
this.elementRef = React.createRef();
}

animate = () => {
this.elementRef.current.classList.add('animated');
}

render() {
return (
<div>
<div ref={this.elementRef}>Animasikan saya!</div>
<button onClick={this.animate}>Mulai Animasi</button>
</div>
);
}
}

Di sini, kita menggunakan Ref untuk menambahkan kelas CSS ke elemen, memicu animasi.

3. Integrasi dengan pustaka DOM pihak ketiga

class MapComponent extends React.Component {
constructor(props) {
super(props);
this.mapRef = React.createRef();
}

componentDidMount() {
const mapLibrary = new FancyMapLibrary();
mapLibrary.createMap(this.mapRef.current);
}

render() {
return <div ref={this.mapRef} style={{width: '100%', height: '400px'}} />;
}
}

Dalam contoh ini, kita menggunakan Ref untuk memberikan pustaka peta pihak ketiga akses ke node DOM tempat ia dapat merender peta.

Kesimpulan

Refs adalah alat yang kuat di React yang memungkinkan kita untuk keluar dari paradigma deklaratif saat diperlukan. Mereka menyediakan cara untuk mengakses node DOM atau elemen React secara langsung. Namun, penting untuk menggunakan Refs secara bijaksana. Dalam kebanyakan kasus, Anda dapat mencapai apa yang Anda butuhkan melalui API deklaratif React. Tetapi saat Anda memerlukan kontrol ekstra, Refs ada untuk membantu!

Ingat, dengan kekuatan yang besar datang tanggung jawab yang besar. Gunakan Refs bijaksana, dan aplikasi React Anda akan berterima kasih!

Berikut adalah tabel rujukan cepat dari metode yang kita diskusikan:

Metode Deskripsi Contoh
React.createRef() Membuat objek ref this.myRef = React.createRef();
ref attribute Melekatkan ref ke elemen React <div ref={this.myRef} />
forwardRef Memungkinkan komponen fungsional menerima refs const FancyButton = React.forwardRef((props, ref) => ...)

Selamat coding, dan semoga Refs Anda selalu terkini!

Credits: Image by storyset