ReactJS - Refs dan DOM

Hai, 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 mengeksplorasi dunia Refs dan DOM!

ReactJS - Refs and the DOM

Apa itu Refs?

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

Mengapa kita butuh Refs?

Anda mungkin bertanya-tanya, "Mengapa kita tidak bisa hanya menggunakan JavaScript biasa untuk memilih elemen?" Well, dalam React, kita mencoba untuk menghindari manipulasi DOM secara langsung karena React memiliki cara yang efisien untuk memperbarui UI. Namun, ada saat-saat saat kita perlu 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().

Signature dari metode createRef

Tanda tangan createRef() cukup sederhana:

React.createRef()

Itu saja! Tidak ada parameter, tidak ada komplikasi. Itu mengembalikan objek biasa dengan properti tunggal: 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 menugaskan nya ke this.myRef. Kemudian di metode render, kita melekatkan Ref ini ke elemen div menggunakan atribut ref.

Menerapkan ref

Sekarang kita telah membuat Ref kita, mari lihat bagaimana kita bisa menggunakannya. Ada beberapa cara untuk menerapkan 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 pada input. Properti current Ref memberikan akses ke node DOM aktual.

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, tetapi 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 aktual.

Kasus penggunaan createRef

Sekarang kita tahu bagaimana membuat dan menerapkan 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 programatis 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 dengan bijak. 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 bijak, dan aplikasi React Anda akan berterima kasih!

Berikut adalah tabel rujukan cepat metode yang kita diskusikan:

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

Semoga coding Anda senantiasa menyenangkan, dan may your Refs always be current!

Credits: Image by storyset