Jika Anda menggunakan React 16.3+, cara yang disarankan untuk membuat referensi adalah menggunakan React.createRef()
.
class TestApp extends React.Component<AppProps, AppState> {
private stepInput: React.RefObject<HTMLInputElement>;
constructor(props) {
super(props);
this.stepInput = React.createRef();
}
render() {
return <input type="text" ref={this.stepInput} />;
}
}
Saat komponen dipasang, properti ref
atribut current
akan ditetapkan ke komponen yang direferensikan / elemen DOM dan ditugaskan kembali ke null
saat dilepas. Jadi, misalnya, Anda bisa mengaksesnya menggunakan this.stepInput.current
.
Untuk lebih lanjut RefObject
, lihat jawaban @ apieceofbart atau PR createRef()
ditambahkan.
Jika Anda menggunakan React versi sebelumnya (<16.3) atau membutuhkan lebih banyak kendali atas kapan ref disetel dan tidak disetel, Anda bisa menggunakan "callback refs" .
class TestApp extends React.Component<AppProps, AppState> {
private stepInput: HTMLInputElement;
constructor(props) {
super(props);
this.stepInput = null;
this.setStepInputRef = element => {
this.stepInput = element;
};
}
render() {
return <input type="text" ref={this.setStepInputRef} />
}
}
Saat komponen dipasang, React akan memanggil ref
callback dengan elemen DOM, dan akan memanggilnya dengan null
saat dilepas. Jadi, misalnya, Anda dapat mengaksesnya hanya dengan menggunakan this.stepInput
.
Dengan mendefinisikan ref
callback sebagai metode terikat pada kelas sebagai kebalikan dari fungsi inline (seperti dalam versi sebelumnya dari jawaban ini), Anda dapat menghindari callback dipanggil dua kali selama update.
Ada yang digunakan untuk menjadi sebuah API mana ref
atribut adalah string (lihat jawaban Akshar Patel ), namun karena beberapa masalah , ref string sangat tidak dianjurkan dan akhirnya akan dihapus.
Diedit 22 Mei 2018 untuk menambahkan cara baru dalam melakukan ref di React 16.3. Terima kasih @apieceofbart karena telah menunjukkan bahwa ada cara baru.
refs
atribut class tidak akan digunakan lagi dalam versi React yang akan datang.Salah satu cara (yang telah saya lakukan ) adalah mengatur secara manual:
maka Anda bahkan dapat membungkus ini dalam fungsi pengambil yang lebih baik (misalnya di sini ):
sumber
any
tidak wajib di sini. Sebagian besar contoh yang saya lihat digunakanHTMLInputElement
. Hanya menyatakan yang sudah jelas, tetapi jikaPeoplePicker
referensi Anda menggunakan komponen React (yaitu ), Anda dapat menggunakan komponen itu sebagai tipe untuk mendapatkan pengetikan.Sejak React 16.3 cara untuk menambahkan ref adalah dengan menggunakan React.createRef seperti yang ditunjukkan Jeff Bowen dalam jawabannya. Namun Anda bisa memanfaatkan Ketikan untuk mengetik referensi Anda dengan lebih baik.
Dalam contoh Anda, Anda menggunakan ref pada elemen masukan. Jadi cara saya melakukannya adalah:
Dengan melakukan ini ketika Anda ingin menggunakan referensi itu, Anda memiliki akses ke semua metode masukan:
Anda juga dapat menggunakannya pada komponen khusus:
dan kemudian memiliki, misalnya, akses ke properti:
sumber
EDIT: Ini bukan lagi cara yang tepat untuk menggunakan referensi dengan Ketikan. Lihat jawaban Jeff Bowen dan beri suara positif untuk meningkatkan visibilitasnya.
Menemukan jawaban atas masalah tersebut. Gunakan referensi seperti di bawah ini di dalam kelas.
Terima kasih @basarat karena telah menunjuk ke arah yang benar.
sumber
Property 'stepInput' does not exist on type '{ [key: string]: Component<any, any> | Element; }'
, saat mencoba mengaksesthis.refs.stepInput
.refs
objek Anda hanya memiliki[key: string]
entri.React.createRef
(komponen kelas)Catatan: Menghilangkan API lama String Refs di sini ...
Referensi hanya baca untuk simpul DOM: Referensi yang dapat diubah untuk nilai yang disimpan sewenang-wenang:React.useRef
(Pengait / komponen fungsi)Catatan: Jangan menginisialisasi
useRef
dengannull
dalam kasus ini. Itu akan membuatrenderCountRef
tipereadonly
(lihat contoh ). Jika Anda perlu memberikannull
sebagai nilai awal, lakukan ini:Referensi panggilan balik (berfungsi untuk keduanya)
Sampel taman bermain
sumber
useRef() as MutableRefObject<HTMLInputElement>
danuseRef<HTMLInputElement>(null)
?current
properti dariMutableRefObject<HTMLInputElement>
dapat dimodifikasi, sedangkanuseRef<HTMLInputElement>(null)
membuatRefObject
tipe dengancurrent
ditandai sebagaireadonly
. Yang pertama dapat digunakan, jika Anda perlu mengubah node DOM saat ini di ref sendiri, misalnya dalam kombinasi dengan pustaka eksternal. Hal ini juga dapat ditulis tanpaas
:useRef<HTMLInputElement | null>(null)
. Yang terakhir adalah pilihan yang lebih baik untuk node DOM yang dikelola React, seperti yang digunakan dalam banyak kasus. React menyimpan node di ref itu sendiri dan Anda tidak ingin mencoba-coba mengubah nilai-nilai ini.Jika Anda menggunakan
React.FC
, tambahkanHTMLDivElement
antarmuka:Dan gunakan seperti berikut:
sumber
Untuk menggunakan gaya panggilan balik ( https://facebook.github.io/react/docs/refs-and-the-dom.html ) seperti yang direkomendasikan pada dokumentasi React, Anda dapat menambahkan definisi untuk properti di kelas:
sumber
Kurangnya contoh lengkap, berikut adalah skrip tes kecil saya untuk mendapatkan input pengguna saat bekerja dengan React dan TypeScript. Berdasarkan sebagian komentar lain dan tautan ini https://medium.com/@basarat/strongly-typed-refs-for-react-typescript-9a07419f807#.cdrghertm
}
sumber
Untuk pengguna skrip tidak diperlukan konstruktor.
...
...
sumber
Dari definisi tipe React
Jadi Anda dapat mengakses elemen referensi Anda sebagai berikut
tanpa redefinisi indeks referensi.
Seperti yang disebutkan @manakor, Anda bisa mendapatkan error seperti
jika Anda mendefinisikan ulang ref (tergantung pada IDE dan versi ts yang Anda gunakan)
sumber
Hanya untuk menambahkan pendekatan yang berbeda - Anda cukup memberikan referensi Anda, seperti:
sumber
Saya selalu melakukan ini, dalam hal itu untuk meraih wasit
let input: HTMLInputElement = ReactDOM.findDOMNode<HTMLInputElement>(this.refs.input);
sumber
Jika Anda tidak ingin meneruskan
ref
, dalam antarmuka Props Anda perlu menggunakanRefObject<CmpType>
tipeimport React, { RefObject } from 'react';
sumber
Bagi mereka yang mencari cara melakukannya ketika Anda memiliki serangkaian elemen:
sumber
letakkan di suatu objek
sumber