Saya punya masalah, yang saya tidak punya ide, bagaimana menyelesaikannya. Dalam komponen reaksi saya, saya menampilkan daftar panjang data dan beberapa tautan di bagian bawah. Setelah mengklik salah satu tautan ini, saya mengisi daftar dengan koleksi tautan baru dan perlu menggulir ke atas.
Masalahnya adalah - bagaimana cara menggulir ke atas setelah koleksi baru diberikan?
'use strict';
// url of this component is #/:checklistId/:sectionId
var React = require('react'),
Router = require('react-router'),
sectionStore = require('./../stores/checklist-section-store');
function updateStateFromProps() {
var self = this;
sectionStore.getChecklistSectionContent({
checklistId: this.getParams().checklistId,
sectionId: this.getParams().sectionId
}).then(function (section) {
self.setState({
section,
componentReady: true
});
});
this.setState({componentReady: false});
}
var Checklist = React.createClass({
mixins: [Router.State],
componentWillMount: function () {
updateStateFromProps.call(this);
},
componentWillReceiveProps(){
updateStateFromProps.call(this);
},
render: function () {
if (this.state.componentReady) {
return(
<section className='checklist-section'>
<header className='section-header'>{ this.state.section.name } </header>
<Steps steps={ this.state.section.steps }/>
<a href=`#/${this.getParams().checklistId}/${this.state.section.nextSection.Id}`>
Next Section
</a>
</section>
);
} else {...}
}
});
module.exports = Checklist;
React.useEffect(() => { window.scrollTo(0, 0); }, []);
Catatan, Anda juga dapat mengimpor useEffect secara langsung:import { useEffect } from 'react'
Karena solusi asli disediakan untuk versi reaksi paling awal , berikut ini adalah pembaruan:
sumber
ReactDOM.findDOMNode(this).scrollTop = 0
this is undefined in arrow functions
salah. Kata kunci ini terikat dengan konteks yang sama dengan fungsi pengembangAnda bisa menggunakan sesuatu seperti ini. ReactDom untuk react.14. Bereaksi sebaliknya.
Perbarui 5/11/2019 untuk React 16+
sumber
componentDidMount
adalah alternatif lain.Di Bereaksi Perutean ada masalah bahwa jika kita mengarahkan ulang ke rute baru, maka itu tidak akan secara otomatis membawa Anda ke bagian atas halaman.
Bahkan saya punya masalah yang sama.
Saya baru saja menambahkan satu baris ke komponen saya dan itu bekerja seperti mentega.
Rujuk: bereaksi pelatihan
sumber
Ini bisa, dan mungkin harus, ditangani menggunakan referensi :
Kode contoh:
sumber
<div ref={(ref) => this._div = ref} />
di bagian paling pertama<div>
dari pernyataan render saya. Sisa render saya tetap sama persis.<div ref="main">
dan kemudianthis.refs.main.scrollTop=0
Anda dapat melakukan ini di router seperti itu:
The
onUpdate={() => window.scrollTo(0, 0)}
menempatkan gulir atas. Untuk informasi lebih lanjut, periksa: tautan codepensumber
/somePage/:imgId
, itu akan menggulir ke atas :(. Cara apa pun untuk "mengontrol" apakah akan memecat atau tidak acara onUpdate pada rute / params tertentu?onUpdate
tidak ada di props HashRouter ... Jika ada yang menemukan masalah yang sama: Saya akhirnya menggunakan solusi ScrollToTop yang dijelaskan lebih jauh ke bawah (dan dalam dokumen-dokumen router reaksi) yang bekerja dengan baik untuk saya.Bagi mereka yang menggunakan kait, kode berikut ini akan berfungsi.
Catatan, Anda juga dapat mengimpor useEffect secara langsung:
import { useEffect } from 'react'
sumber
[]
sebagai sarana parameter kedua hal itu hanya akan terjadi pada pertama render, apakah Anda mencoba tanpa?Berikut ini pendekatan lain yang memungkinkan Anda untuk memilih komponen yang dipasang yang Anda inginkan untuk mengatur ulang posisi gulir jendela tanpa menduplikasi MassalDidUpdate / ComponentDidMount.
Contoh di bawah ini adalah membungkus komponen Blog dengan ScrollIntoView (), sehingga jika rute berubah ketika komponen Blog dipasang, maka ComponentDidUpdate HOC akan memperbarui posisi gulir jendela.
Anda dapat dengan mudah membungkusnya di seluruh aplikasi, sehingga pada setiap perubahan rute, itu akan memicu pengaturan ulang jendela.
ScrollIntoView.js
Routes.js
Contoh di atas berfungsi dengan baik, tetapi jika Anda telah bermigrasi ke
react-router-dom
, maka Anda dapat menyederhanakan di atas dengan membuatHOC
yang membungkus komponen.Sekali lagi, Anda bisa juga dengan mudah membungkusnya lebih rute Anda (hanya perubahan
componentDidMount
metode untukcomponentDidUpdate
metode contoh kode yang ditulis di atas, serta pembungkusScrollIntoView
denganwithRouter
).wadah / ScrollIntoView.js
komponen / Home.js
sumber
Ini adalah satu-satunya hal yang bekerja untuk saya (dengan komponen kelas ES6):
sumber
Saya menggunakan scrollToTop Component-router yang kode yang dijelaskan dalam docs-router Reaksi
https://reacttraining.com/react-router/web/guides/scroll-restoration/scroll-to-top
Saya mengubah kode dalam file Routes tunggal dan setelah itu tidak perlu mengubah kode di setiap komponen.
Kode Contoh -
Langkah 1 - buat Komponen ScrollToTop.js
Langkah 2 - Dalam file App.js, tambahkan Komponen ScrollToTop setelah
<Router
sumber
Solusi kait :
sumber
Menggunakan Hooks dalam komponen fungsional, dengan asumsi pembaruan komponen ketika ada pembaruan dalam alat peraga hasil
sumber
use
Semua hal di atas tidak berhasil untuk saya - tidak yakin mengapa tetapi:
bekerja, di mana HEADER adalah id dari elemen header saya
sumber
Jika semua yang ingin dilakukan adalah sesuatu yang sederhana di sini adalah solusi yang akan bekerja untuk semua orang
tambahkan fungsi mini ini
panggil fungsi sebagai berikut dari footer halaman
jika Anda ingin menambahkan gaya yang bagus di sini adalah css
sumber
Saya menggunakan React Hooks dan menginginkan sesuatu yang dapat digunakan kembali tetapi juga sesuatu yang bisa saya hubungi kapan saja (bukan hanya setelah render).
Kemudian untuk menggunakan pengait bisa Anda lakukan:
sumber
Jika Anda melakukan ini untuk seluler , setidaknya dengan chrome, Anda akan melihat bilah putih di bagian bawah.
Ini terjadi ketika bilah URL menghilang. Larutan:
Google Developer Documents
sumber
Tidak ada jawaban di atas yang saat ini berfungsi untuk saya. Ternyata
.scrollTo
tidak kompatibel secara luas.scrollIntoView
.Di App.js kami, di
componentWillMount()
kami tambahkanIni adalah satu-satunya solusi yang bekerja secara universal untuk kita. root adalah ID dari Aplikasi kami. Perilaku "smooth" tidak berfungsi di setiap browser / perangkat. Waktu tunggu 777 agak konservatif, tetapi kami memuat banyak data pada setiap halaman, jadi melalui pengujian ini diperlukan. 237 yang lebih pendek mungkin bekerja untuk sebagian besar aplikasi.
sumber
Saya mengalami masalah saat membangun situs dengan Gatsby yang Tautannya dibangun di atas Reach Router. Tampaknya aneh bahwa ini adalah modifikasi yang harus dibuat daripada perilaku default.
Lagi pula, saya mencoba banyak solusi di atas dan satu-satunya yang benar-benar bekerja untuk saya adalah:
Saya menempatkan ini di useEffect tetapi Anda bisa dengan mudah memasukkannya ke dalam componentDidMount atau memicunya dengan cara lain yang Anda inginkan.
Tidak yakin mengapa window.scrollTo (0, 0) tidak berfungsi untuk saya (dan lainnya).
sumber
Semua solusi berbicara tentang menambahkan gulir pada
componentDidMount
ataucomponentDidUpdate
tetapi dengan DOM.Saya melakukan semua itu dan tidak berhasil.
Jadi, menemukan beberapa cara lain yang berfungsi dengan baik untuk saya.
Saya juga menemukan tentang beberapa hal ScrollRestoration , tapi saya malas sekarang. Dan untuk sekarang akan tetap seperti itu "DidUpdate".
Semoga ini bisa membantu!
berhati-hatilah
sumber
Kode ini akan menyebabkan kelancaran pada gulungan :
Anda dapat melewatkan parameter lain di dalam scrollIntoView () Sintaks berikut dapat digunakan:
alignToTop Opsional Adalah nilai Boolean:
scrollIntoViewOptions Opsional Adalah Objek dengan properti berikut:
Rincian lebih lanjut dapat ditemukan di sini: dokumen MDN
sumber
Tidak ada jawaban di atas yang saat ini berfungsi untuk saya. Ternyata
.scrollTo
tidak kompatibel secara luas.scrollIntoView
.Di App.js kami, di
componentWillMount()
kami tambahkanIni adalah satu-satunya solusi yang bekerja secara universal untuk kita.
root
adalah ID dari Aplikasi kami. Perilaku "smooth" tidak berfungsi di setiap browser / perangkat. Waktu tunggu 777 agak konservatif, tetapi kami memuat banyak data pada setiap halaman, jadi melalui pengujian ini diperlukan. 237 yang lebih pendek mungkin bekerja untuk sebagian besar aplikasi.sumber
Jika saya berasumsi Anda membuat bab katakanlah, buku per halaman, yang perlu Anda lakukan adalah menambahkan ini ke kode Anda. Bagi saya ini seperti sulap.
Dengan ini, Anda tidak perlu membuat referensi pada komponen yang diberikan.
sumber
Inilah yang saya lakukan:
sumber
Anda dapat menggunakan, ini bekerja untuk saya.
sumber
Sesuatu seperti ini bekerja untuk saya pada suatu komponen:
Kemudian dalam fungsi apa pun yang berhubungan dengan pembaruan:
sumber
Tidak ada yang berhasil untuk saya kecuali:
sumber