Saya mengalami masalah saat menavigasi ke halaman lain, posisinya akan tetap seperti halaman sebelumnya. Jadi itu tidak akan bergulir ke atas secara otomatis. Saya juga mencoba menggunakan window.scrollTo(0, 0)
di onChange
router. Saya juga pernah scrollBehavior
memperbaiki masalah ini tetapi tidak berhasil. Ada saran tentang ini?
javascript
reactjs
react-router
react-router-redux
adrian hartanto
sumber
sumber
componentDidMount
komponen rute baru?document.body.scrollTop = 0;
dalamcomponentDidMount
komponen Anda pindah keJawaban:
Dokumentasi untuk React Router v4 berisi contoh kode untuk pemulihan gulir. Berikut adalah contoh kode pertama mereka, yang berfungsi sebagai solusi seluruh situs untuk "gulir ke atas" saat halaman dinavigasi ke:
Kemudian render di bagian atas aplikasi Anda, tetapi di bawah Router:
^ disalin langsung dari dokumentasi
Jelas ini berfungsi untuk banyak kasus, tetapi ada lebih banyak tentang cara menangani antarmuka tab dan mengapa solusi umum belum diterapkan.
sumber
Because browsers are starting to handle the “default case” and apps have varying scrolling needs (like this website!), we don’t ship with default scroll management. This guide should help you implement whatever scrolling needs you have.
membuat saya sedih, karena semua opsi yang mereka berikan untuk contoh kode, sebenarnya dapat dimasukkan ke dalam kontrol melalui pengaturan properti, dengan beberapa konvensi seputar perilaku default yang kemudian dapat diubah. Ini terasa super hacky dan belum selesai, imho. Berarti hanya pengembang react lanjutan yang dapat melakukan perutean dengan benar dan tidak ada #pitOfSuccesswork-arounds
telah diabaikan oleh semua pihak di sini. +100 untuk @danielnixontetapi kelasnya begitu 2018
Implementasi ScrollToTop dengan React Hooks
ScrollToTop.js
Pemakaian:
ScrollToTop juga dapat diimplementasikan sebagai komponen pembungkus:
ScrollToTop.js
Pemakaian:
sumber
scrollToTop
ke<Route>
. Sepertinya fitur ini sangat sering digunakan.action !== 'POP'
. Pendengar menerima tindakan sebagaiJawaban ini untuk kode lama, untuk router v4 + periksa jawaban lain
Jika tidak berhasil, Anda harus menemukan alasannya. Juga di dalam
componentDidMount
Anda bisa menggunakan:
Anda dapat menambahkan beberapa bendera seperti "scrolled = false" dan kemudian memperbarui:
sumber
window.scrollTo(0,0);
onUpdate
hook tidak digunakan lagi di react-router v4 - hanya ingin menunjukkannyaonUpdate
kail?Untuk react-router v4 , berikut adalah aplikasi create-react yang mencapai pemulihan gulir: http://router-scroll-top.surge.sh/ .
Untuk mencapai ini, Anda dapat membuat menghias
Route
komponen dan memanfaatkan metode siklus hidup:Di bagian
componentDidUpdate
kita dapat memeriksa kapan nama path lokasi berubah dan mencocokkannya denganpath
prop dan, jika mereka puas, mengembalikan window scroll.Yang keren dari pendekatan ini, adalah kita dapat memiliki rute yang memulihkan gulir dan rute yang tidak mengembalikan gulir.
Berikut adalah
App.js
contoh bagaimana Anda dapat menggunakan yang di atas:Dari kode di atas, yang menarik untuk ditunjukkan adalah bahwa hanya ketika menavigasi ke
/about
atau/another-page
tindakan gulir ke atas yang akan dilakukan. Namun ketika/
tidak ada pemulihan gulir yang akan terjadi.Seluruh basis kode dapat ditemukan di sini: https://github.com/rizedr/react-router-scroll-top
sumber
Home
. Sekarang gulir ke bagian bawahHome
dan sekarang pergi ke 'AnotherPage' dan jangan gulir. Sekarang jika Anda kembali keHome
halaman ini, halaman ini akan digulir ke atas. Tetapi menurut jawaban Anda,home
halaman harus tetap di-scroll.Perlu dicatat bahwa
onUpdate={() => window.scrollTo(0, 0)}
metode ini sudah usang.Berikut adalah solusi sederhana untuk react-router 4+.
sumber
#
dan?
ke akhir url kami. Dalam kasus pertama Anda harus menggulir tidak ke atas dalam kasus kedua Anda tidak boleh menggulir sama sekaliJika Anda menjalankan React 16.8+, ini mudah ditangani dengan komponen yang akan menggulir jendela ke atas pada setiap navigasi:
Ini di komponen scrollToTop.js
Kemudian render di bagian atas aplikasi Anda, tetapi di bawah Router, di
sini ada di app.js
atau di index.js
sumber
React Hook yang dapat Anda tambahkan ke komponen Route Anda. Menggunakan
useLayoutEffect
alih-alih pendengar khusus.Pembaruan : Diperbarui untuk digunakan
useLayoutEffect
sebagai penggantiuseEffect
, untuk mengurangi visual jank. Secara kasar ini diterjemahkan menjadi:useEffect
: membuat komponen -> cat ke layar -> gulir ke atas (efek run)useLayoutEffect
: membuat komponen -> gulir ke atas (efek run) -> cat ke layarBergantung pada apakah Anda memuat data (pikirkan pemintal) atau jika Anda memiliki animasi transisi halaman,
useEffect
mungkin bekerja lebih baik untuk Anda.sumber
Saya memiliki masalah yang sama dengan aplikasi saya, menggunakan potongan kode di bawah ini membantu saya menggulir ke bagian atas halaman dengan mengklik tombol berikutnya.
Namun, masalah masih berlanjut di browser belakang. Setelah banyak percobaan, saya menyadari bahwa ini karena objek riwayat jendela browser, yang memiliki properti scrollRestoration yang disetel ke auto.Menyetel ini ke manual memecahkan masalah saya.
sumber
Dalam komponen di bawah ini
<Router>
Cukup tambahkan React Hook (jika Anda tidak menggunakan kelas React)
sumber
Saya ingin membagikan solusi saya untuk mereka yang menggunakan
react-router-dom v5
karena tidak ada solusi v4 yang berhasil untuk saya.Apa yang memecahkan masalah saya adalah menginstal react-router-scroll-top dan meletakkan pembungkusnya
<App />
seperti ini:dan hanya itu! itu berhasil!
sumber
Hooks dapat disusun, dan sejak React Router v5.1 kami memiliki
useHistory()
hook. Jadi berdasarkan jawaban @ zurfyx, saya telah membuat pengait yang dapat digunakan kembali untuk fungsi ini:sumber
Solusi saya: komponen yang saya gunakan di komponen layar saya (di mana saya ingin gulir ke atas).
Ini mempertahankan posisi gulir saat kembali. Menggunakan useEffect () adalah buggy bagi saya, ketika kembali dokumen akan bergulir ke atas dan juga memiliki efek berkedip ketika rute diubah dalam dokumen yang sudah digulir.
sumber
React hooks 2020 :)
sumber
const ScrollToTop: React.FC = () => {
Saya tidak mengerti apaScrollToTop: React.FC
artinyaSaya menulis Komponen Tingkat Tinggi bernama
withScrollToTop
. HOC ini mengambil dua tanda:onComponentWillMount
- Apakah akan menggulir ke atas saat navigasi (componentWillMount
)onComponentDidUpdate
- Apakah akan menggulir ke atas saat update (componentDidUpdate
). Bendera ini diperlukan jika komponen tidak dilepas tetapi peristiwa navigasi terjadi, misalnya, dari/users/1
ke/users/2
.Untuk menggunakannya:
sumber
Ini metode lain.
Untuk react-router v4 Anda juga dapat mengikat pendengar untuk mengubah peristiwa sejarah, dengan cara berikut:
Level gulir akan diatur ke 0 tanpa
setImmediate()
juga jika rute diubah dengan mengklik tautan tetapi jika pengguna menekan tombol kembali pada browser maka itu tidak akan berfungsi karena browser mengatur ulang level gulir secara manual ke level sebelumnya ketika tombol kembali ditekan , jadi dengan menggunakansetImmediate()
kami menyebabkan fungsi kami dijalankan setelah browser selesai mengatur ulang level gulir sehingga memberi kami efek yang diinginkan.sumber
dengan router React dom v4 Anda dapat menggunakan
buat komponen scrollToTopComponent seperti di bawah ini
atau jika Anda menggunakan tab, gunakan sesuatu seperti di bawah ini
semoga ini membantu untuk lebih lanjut tentang restorasi gulir, ada docs hare react router dom scroll restoration
sumber
Saya menemukan itu
ReactDOM.findDomNode(this).scrollIntoView()
berhasil. Saya menempatkannya di dalamcomponentDidMount()
.sumber
Untuk aplikasi yang lebih kecil, dengan 1-4 rute, Anda dapat mencoba meretasnya dengan pengalihan ke elemen DOM teratas dengan #id, bukan hanya sebuah rute. Maka tidak perlu menggabungkan Rute di ScrollToTop atau menggunakan metode siklus hidup.
sumber
Di Anda
router.js
, tambahkan saja fungsi ini dirouter
objek. Ini akan berhasil.Seperti ini,
**Routes.js**
sumber
Bisa menjadi solusi sederhana jika props tidak diubah dan componentDidUpdate () tidak aktif.
sumber
Ini hacky (tapi berhasil): Saya hanya menambahkan
window.scrollTo (0,0);
untuk merender ();
sumber