Saya ingin membangun sistem obrolan dan secara otomatis menggulir ke bawah saat memasuki jendela dan saat pesan baru masuk. Bagaimana Anda secara otomatis menggulir ke bagian bawah wadah di React?
127
Seperti yang disebutkan Tushar, Anda dapat menyimpan div tiruan di bagian bawah obrolan Anda:
render () {
return (
<div>
<div className="MessageContainer" >
<div className="MessagesList">
{this.renderMessages()}
</div>
<div style={{ float:"left", clear: "both" }}
ref={(el) => { this.messagesEnd = el; }}>
</div>
</div>
</div>
);
}
dan kemudian gulir ke sana setiap kali komponen Anda diperbarui (mis. status diperbarui saat pesan baru ditambahkan):
scrollToBottom = () => {
this.messagesEnd.scrollIntoView({ behavior: "smooth" });
}
componentDidMount() {
this.scrollToBottom();
}
componentDidUpdate() {
this.scrollToBottom();
}
Saya menggunakan metode Element.scrollIntoView standar di sini.
this.messagesEnd.scrollIntoView()
bekerja dengan baik untuk saya. Tidak perlu menggunakanfindDOMNode()
.scrollToBottom(){this.scrollBottom.scrollIntoView({ behavior: 'smooth' })}
untuk membuatnya bekerja dalam versi yang lebih baruSaya hanya ingin memperbarui jawaban agar sesuai dengan
React.createRef()
metode baru , tetapi pada dasarnya sama, hanya perlu diingatcurrent
properti di ref yang dibuat:MEMPERBARUI:
Sekarang hook tersedia, saya memperbarui jawaban untuk menambahkan penggunaan
useRef
danuseEffect
hook, hal yang sebenarnya melakukan keajaiban (React refs danscrollIntoView
metode DOM) tetap sama:Juga buat kotak kode (sangat dasar) jika Anda ingin memeriksa perilaku https://codesandbox.io/s/scrolltobottomexample-f90lz
sumber
this.messagesEnd.current
selalu ada. Meskipun demikian, penting untuk diperhatikan bahwa memanggilthis.messagesEnd.current
sebelum render pertama akan menghasilkan kesalahan yang Anda tunjuk. Thnx.this.messagesEnd
contoh pertama Anda dalam metode scrollTo?useEffect
Metode perlu ditempatkan dengan() => {scrollToBottom()}
. Terima kasih banyakJangan gunakan
findDOMNode
Komponen kelas dengan ref
Komponen fungsi dengan kait:
sumber
behavior
(tidak dapat mengedit karena "suntingan minimal harus 6 karakter", huh).scrollIntoView
dengansmooth
sangat buruk saat ini.Terima kasih kepada @enlitement
kita harus menghindari penggunaan
findDOMNode
, kita dapat menggunakanrefs
untuk melacak komponenreferensi:
sumber
Anda dapat menggunakan
ref
s untuk melacak komponen.Jika Anda mengetahui cara untuk menyetel
ref
salah satu komponen individu (yang terakhir), silakan posting!Inilah yang menurut saya berhasil untuk saya:
sumber
react-scrollable-feed secara otomatis menggulir ke bawah ke elemen terbaru jika pengguna sudah berada di bagian bawah bagian yang dapat digulir. Jika tidak, pengguna akan berada di posisi yang sama. Saya rasa ini cukup berguna untuk komponen obrolan :)
Saya pikir jawaban lain di sini akan memaksa gulir setiap kali tidak peduli di mana bilah gulir itu. Masalah lainnya
scrollIntoView
adalah ia akan menggulir seluruh halaman jika div yang dapat digulir tidak terlihat.Ini bisa digunakan seperti ini:
Pastikan untuk memiliki komponen pembungkus dengan
height
ataumax-height
Penafian: Saya adalah pemilik paket
sumber
Referensi wadah pesan Anda.
Temukan wadah pesan Anda dan buat
scrollTop
atributnya samascrollHeight
:Bangkitkan metode di atas pada
componentDidMount
dancomponentDidUpdate
.Beginilah cara saya menggunakan ini di kode saya:
sumber
Saya membuat elemen kosong di akhir pesan, dan menggulir ke elemen itu. Tidak perlu melacak ref.
sumber
Jika Anda ingin melakukan ini dengan React Hooks, metode ini dapat diikuti. Untuk div dummy telah ditempatkan di bagian bawah chat. useRef Hook digunakan di sini.
Referensi API Hooks: https://reactjs.org/docs/hooks-reference.html#useref
sumber
Cara termudah dan terbaik yang saya rekomendasikan adalah.
Versi ReactJS saya: 16.12.0
Struktur HTML di dalam
render()
fungsiscrollToBottom()
fungsi yang akan mendapatkan referensi dari elemen tersebut. dan scroll sesuaiscrollIntoView()
fungsinya.dan memanggil fungsi di atas di dalam
componentDidMount()
dancomponentDidUpdate()
untuk penjelasan lebih lanjut tentang
Element.scrollIntoView()
kunjungi developer.mozilla.orgsumber
Saya tidak bisa mendapatkan salah satu dari jawaban di bawah ini untuk bekerja tetapi js sederhana melakukan trik untuk saya:
sumber
Contoh Kerja:
Anda dapat menggunakan
scrollIntoView
metode DOM untuk membuat komponen terlihat dalam tampilan.Untuk ini, saat merender komponen, berikan ID referensi untuk elemen DOM menggunakan
ref
atribut. Kemudian gunakan metode tersebutscrollIntoView
padacomponentDidMount
siklus hidup. Saya hanya meletakkan kode contoh yang berfungsi untuk solusi ini. Berikut ini adalah rendering komponen setiap kali pesan diterima. Anda harus menulis kode / metode untuk merender komponen ini.Berikut
this.props.message.MessageId
adalah ID unik dari pesan obrolan tertentu yang diteruskan sebagaiprops
sumber
sumber
Saya suka melakukannya dengan cara berikut.
sumber
terima kasih 'metakermit' untuk jawaban yang bagus, tapi saya pikir kita bisa membuatnya lebih baik, untuk scroll ke bawah, kita harus menggunakan ini:
tetapi jika Anda ingin menggulir ke atas, Anda harus menggunakan ini:
dan kode ini umum:
sumber
Sebagai opsi lain, ada baiknya melihat komponen gulir reaksi .
sumber
Menggunakan
React.createRef()
sumber
Ini adalah bagaimana Anda akan menyelesaikan ini di TypeScript (menggunakan ref ke elemen yang ditargetkan tempat Anda menggulir ke):
Untuk informasi lebih lanjut tentang menggunakan ref dengan React dan Typecript, Anda dapat menemukan artikel bagus di sini .
sumber
Versi lengkap (Skrip Ketik):
sumber
Property 'scrollIntoView' does not exist on type 'RefObject<unknown>'.
danType 'HTMLDivElement | null' is not assignable to type 'RefObject<unknown>'. Type 'null' is not assignable to type 'RefObject<unknown>'.
...