Saya telah membangun komponen di Bereaksi yang seharusnya memperbarui gayanya sendiri pada jendela gulir untuk membuat efek paralaks.
render
Metode komponen terlihat seperti ini:
function() {
let style = { transform: 'translateY(0px)' };
window.addEventListener('scroll', (event) => {
let scrollTop = event.srcElement.body.scrollTop,
itemTranslate = Math.min(0, scrollTop/3 - 60);
style.transform = 'translateY(' + itemTranslate + 'px)');
});
return (
<div style={style}></div>
);
}
Ini tidak berfungsi karena Bereaksi tidak tahu bahwa komponen telah berubah, dan karena itu komponen tidak dirender ulang.
Saya sudah mencoba menyimpan nilai itemTranslate
dalam keadaan komponen, dan memanggil setState
dalam panggilan balik gulir. Namun, ini membuat pengguliran tidak dapat digunakan karena ini sangat lambat.
Ada saran tentang cara melakukan ini?
javascript
reactjs
Alejandro Pérez
sumber
sumber
render
dalam utas yang sama) hanya harus berkaitan dengan logika yang berkaitan dengan rendering / memperbarui DOM aktual dalam Bereaksi. Sebagai gantinya, seperti yang ditunjukkan oleh @AustinGreco di bawah ini, Anda harus menggunakan metode siklus hidup Bereaksi yang diberikan untuk membuat dan menghapus pengikatan acara Anda. Ini membuatnya mandiri di dalam komponen dan memastikan tidak ada kebocoran dengan memastikan acara mengikat dihapus jika / ketika komponen yang menggunakannya dilepas.Jawaban:
Anda harus mengikat pendengar
componentDidMount
, dengan cara itu hanya dibuat sekali. Anda harus bisa menyimpan gaya dalam keadaan, pendengar mungkin adalah penyebab masalah kinerja.Sesuatu seperti ini:
sumber
this.handleScroll = this.handleScroll.bind(this)
akan mengikat inihandleScroll
ke dalam komponen, bukan jendela.event.target.scrollingElement.scrollTop
Anda dapat mengirimkan fungsi ke
onScroll
acara tersebut pada elemen Bereaksi: https://facebook.github.io/react/docs/events.html#ui-eventsJawaban lain yang serupa: https://stackoverflow.com/a/36207913/1255973
sumber
Solusi saya untuk membuat navbar responsif (posisi: 'relatif' saat tidak menggulir dan diperbaiki saat menggulir dan tidak di bagian atas halaman)
Tidak ada masalah kinerja untuk saya.
sumber
untuk membantu siapa pun di sini yang memperhatikan masalah perilaku / kinerja yang lamban saat menggunakan jawaban Austin, dan ingin contoh menggunakan referensi yang disebutkan dalam komentar, berikut adalah contoh yang saya gunakan untuk mengubah kelas untuk ikon gulir naik / turun:
Dalam metode render:
Dalam metode handler:
Dan tambahkan / hapus penangan Anda dengan cara yang sama seperti yang disebutkan Austin:
dokumen pada referensi .
sumber
this.scrollIcon.className = whatever-you-want
.className
atauclassList
. Juga, saya tidak perluwindow.addEventListener()
: Saya hanya menggunakan React'sonScroll
, dan itu secepat, asalkan Anda tidak memperbarui alat peraga / negara!Saya menemukan bahwa saya tidak dapat berhasil menambah pendengar acara kecuali saya benar seperti:
sumber
userCapture
: Opsional. Nilai Boolean yang menentukan apakah acara harus dieksekusi dalam fase penangkapan atau dalam fase gelembung. Nilai yang mungkin: true - Handler event dieksekusi pada fase penangkapan false- Default. Pengatur acara dieksekusi dalam fase menggelegakContoh menggunakan classNames , React hooks useEffect , useState dan style-jsx :
sumber
dengan kait
sumber
Contoh komponen fungsi menggunakan useEffect:
Catatan : Anda harus menghapus pendengar acara dengan mengembalikan fungsi "bersihkan" di useEffect. Jika tidak, setiap kali komponen diperbarui, Anda akan memiliki pendengar gulir jendela tambahan.
sumber
Jika yang Anda minati adalah komponen anak yang sedang bergulir, maka contoh ini mungkin bisa membantu: https://codepen.io/JohnReynolds57/pen/NLNOyO?editors=0011
sumber
Saya memecahkan masalah melalui menggunakan dan memodifikasi variabel CSS. Dengan cara ini saya tidak perlu mengubah status komponen yang menyebabkan masalah kinerja.
index.css
Navbar.jsx
Navbar.module.css
sumber
Taruhan saya di sini adalah menggunakan komponen Fungsi dengan kait baru untuk menyelesaikannya, tetapi alih-alih menggunakan
useEffect
seperti pada jawaban sebelumnya, saya pikir pilihan yang benar adalahuseLayoutEffect
karena alasan penting:Ini dapat ditemukan di React dokumentasi . Jika kami menggunakan
useEffect
dan kami memuat ulang halaman yang sudah digulir, digulir akan salah dan kelas kami tidak akan diterapkan, menyebabkan perilaku yang tidak diinginkan.Sebuah contoh:
Solusi yang mungkin untuk masalah ini adalah https://codepen.io/dcalderon/pen/mdJzOYq
sumber
useLayoutEffect
. Saya mencoba melihat apa yang Anda sebutkan.useEffect
di sini dibandingkan denganuseLayoutEffect
..Header--scrolled
kadang-kadang menerapkan kelas, tetapi 100% kali.Header--scrolledLayout
diterapkan dengan benar terima kasih useLayoutEffect.Berikut ini adalah contoh lain menggunakan KAIT fontAwesomeIcon dan Kendo UI Bereaksi
[! [Screenshot di sini] [1]] [1]
sumber
Perbarui jawaban dengan React Hooks
Ini adalah dua kait - satu untuk arah (atas / bawah / tidak ada) dan satu untuk posisi aktual
Gunakan seperti ini:
Inilah kaitnya:
sumber
Untuk memperluas jawaban @ Austin, Anda harus menambahkan
this.handleScroll = this.handleScroll.bind(this)
ke konstruktor Anda:Ini memberi
handleScroll()
akses ke ruang lingkup yang tepat ketika dipanggil dari pendengar acara.Ketahuilah bahwa Anda tidak dapat melakukan
.bind(this)
inaddEventListener
atauremoveEventListener
metode karena mereka masing-masing akan mengembalikan referensi ke fungsi yang berbeda dan acara tidak akan dihapus ketika komponen dilepas.sumber