Ini adalah contoh dari halaman aplikasi Google Adsense. Layar memuat ditampilkan sebelum halaman utama muncul setelah.
Saya tidak tahu bagaimana melakukan hal yang sama dengan Bereaksi karena jika saya membuat layar pemuatan yang dibuat oleh komponen Bereaksi, itu tidak ditampilkan saat halaman sedang memuat karena harus menunggu DOM yang diberikan sebelumnya.
Diperbarui :
Saya membuat contoh pendekatan saya dengan memasukkan screen loader index.html
dan menghapusnya di ReactcomponentDidMount()
metode siklus hidup .
Contoh dan bereaksi memuat layar .
reactjs
asynchronous
redux
Thanh Nguyen
sumber
sumber
Jawaban:
Ini dapat dilakukan dengan menempatkan ikon memuat di file html Anda (index.html untuk ex), sehingga pengguna melihat ikon segera setelah file html dimuat.
Saat aplikasi Anda selesai memuat, Anda bisa menghapus ikon memuat itu di hook siklus hidup, saya biasanya melakukannya
componentDidMount
.sumber
Hasil
Ketika halaman html di-render, segera tampilkan spinner (saat React memuat), dan sembunyikan setelah React siap.
Karena spinner dirender dalam HTML / CSS murni (di luar domain Bereaksi), Bereaksi seharusnya tidak mengontrol proses menampilkan / menyembunyikan secara langsung, dan implementasinya harus transparan untuk Bereaksi.
Solusi 1 -: pseudo-class kosong
Karena Anda membuat reaksi ke dalam wadah DOM -
<div id="app"></div>
, Anda dapat menambahkan pemintal ke wadah itu, dan ketika reaksi akan memuat dan merender, pemintal akan menghilang.Anda tidak dapat menambahkan elemen DOM (misalnya div) di dalam root reaksi, karena Bereaksi akan mengganti konten wadah segera setelah
ReactDOM.render()
dipanggil. Bahkan jika Anda membuatnull
, konten masih akan digantikan oleh komentar -<!-- react-empty: 1 -->
. Ini berarti bahwa jika Anda ingin menampilkan pemuat sementara komponen utama dipasang, data dimuat, tetapi tidak ada yang benar-benar ditampilkan, markup pemuat ditempatkan di dalam wadah (<div id="app"><div class="loader"></div></div>
misalnya) tidak akan berfungsi.Solusinya adalah menambahkan kelas pemintal ke wadah reaksi, dan menggunakan
:empty
kelas pseudo . Pemintal akan terlihat, selama tidak ada yang dirender ke dalam wadah (komentar tidak masuk hitungan). Segera setelah reaksi membuat sesuatu selain komentar, pemuat akan hilang.Contoh 1
Dalam contoh Anda dapat melihat komponen yang merender
null
hingga siap. Kontainer adalah loader juga -<div id="app" class="app"></div>
, dan kelas loader hanya akan berfungsi jika:empty
(lihat komentar dalam kode):Tampilkan cuplikan kode
Contoh 2
Variasi dalam menggunakan
:empty
kelas pseudo untuk menunjukkan / menyembunyikan pemilih, adalah mengatur pemintal sebagai elemen saudara ke wadah aplikasi, dan menunjukkannya selama wadah kosong menggunakan kombinator saudara yang berdekatan (+
):Tampilkan cuplikan kode
Solusi 2 - Lulus "penangan" pemintal sebagai alat peraga
Untuk memiliki kontrol berbutir halus atas kondisi tampilan pemintal, buat dua fungsi
showSpinner
danhideSpinner
, dan meneruskannya ke wadah root melalui alat peraga. Fungsi dapat memanipulasi DOM, atau melakukan apa pun yang diperlukan untuk mengendalikan pemintal. Dengan cara ini, Bereaksi tidak menyadari "dunia luar", juga tidak perlu mengendalikan DOM secara langsung. Anda dapat dengan mudah mengganti fungsi untuk pengujian, atau jika Anda perlu mengubah logika, dan Anda bisa meneruskannya ke komponen lain di pohon Bereaksi.Contoh 1
Tampilkan cuplikan kode
Contoh 2 - kait
Contoh ini menggunakan
useEffect
kait untuk menyembunyikan pemintal setelah komponen dipasang.Tampilkan cuplikan kode
sumber
Solusi untuk ini adalah:
Dalam fungsi render Anda, lakukan sesuatu seperti ini:
Menginisialisasi isLoading sebagai true dalam konstruktor dan false pada componentDidMount
sumber
Jika ada orang yang mencari pustaka drop-in, zero-config dan dependensi-nol untuk case-use di atas, coba pace.js ( http://github.hubspot.com/pace/docs/welcome/ ).
Secara otomatis menghubungkan ke acara (ajax, readyState, pushstate riwayat, js event loop dll) dan menunjukkan loader disesuaikan.
Bekerja dengan baik dengan proyek reaksi / relai kami (menangani perubahan navigasi menggunakan router reaksi, permintaan relai) (Tidak terafiliasi; telah menggunakan pace.js untuk proyek kami dan ini bekerja sangat baik)
sumber
public/index.html
dan pilih gaya. ini adalah plugin sederhana yang luar biasa. Terima kasih.Ketika aplikasi Bereaksi Anda sangat besar, itu benar-benar membutuhkan waktu untuk bangkit dan berjalan setelah halaman dimuat. Katakanlah, Anda me-mount Anda Bereaksi bagian dari aplikasi untuk
#app
. Biasanya, elemen ini di index.html Anda hanyalah sebuah div kosong:Apa yang dapat Anda lakukan adalah meletakkan beberapa gaya dan banyak gambar di sana untuk membuatnya terlihat lebih baik antara memuat halaman dan rendering aplikasi Bereaksi awal ke DOM:
Setelah halaman dimuat, pengguna akan segera melihat konten asli index.html. Tak lama setelah itu, ketika Bereaksi siap untuk memasang seluruh hirarki komponen yang diberikan ke simpul DOM ini, pengguna akan melihat aplikasi yang sebenarnya.
Perhatikan
class
, tidakclassName
. Itu karena Anda perlu memasukkan ini ke file html Anda.Jika Anda menggunakan SSR, hal-hal yang tidak terlalu rumit karena pengguna akan benar-benar melihat aplikasi yang sebenarnya setelah halaman dimuat.
sumber
Ini akan terjadi sebelum
ReactDOM.render()
mengendalikan root<div>
. Yaitu Aplikasi Anda tidak akan dipasang hingga saat itu.Jadi Anda dapat menambahkan loader Anda di
index.html
file Anda di dalam root<div>
. Dan itu akan terlihat di layar sampai React mengambil alih.Anda dapat menggunakan elemen pemuat apa pun yang paling cocok untuk Anda (
svg
dengan animasi misalnya).Anda tidak perlu menghapusnya dengan metode siklus hidup apa pun. Bereaksi akan mengganti anak-anak dari akarnya
<div>
dengan yang Anda render<App/>
, seperti yang dapat kita lihat di GIF di bawah.Contoh di CodeSandbox
index.html
index.js
Menggunakan
debugger
untuk memeriksa halaman sebelumReactDOM.render()
dijalankan.sumber
Saat ini kita dapat menggunakan kait juga di Bereaksi 16.8:
sumber
Mengatur batas waktu dalam componentDidMount berfungsi tetapi dalam aplikasi saya, saya menerima peringatan kebocoran memori. Coba sesuatu seperti ini.
sumber
Saya harus berurusan dengan masalah itu baru-baru ini dan datang dengan solusi, yang berfungsi dengan baik untuk saya. Namun, saya sudah mencoba solusi @Ori Drori di atas dan sayangnya itu tidak berfungsi dengan baik (ada beberapa penundaan + saya tidak suka penggunaan
setTimeout
fungsi di sana).Inilah yang saya pikirkan:
index.html
mengajukanhead
Tag di dalam - gaya untuk indikator:Sekarang ini
body
tag:Dan kemudian muncul logika yang sangat sederhana, di dalam
app.js
file (dalam fungsi render):Bagaimana cara kerjanya?
Ketika komponen pertama (dalam aplikasi saya
app.js
juga dalam kebanyakan kasus) mount dengan benar,spinner
sedang disembunyikan dengan menerapkanhidden
atribut padanya.Apa yang lebih penting untuk ditambahkan -
!spinner.hasAttribute('hidden')
kondisi mencegah untuk menambahkanhidden
atribut ke pemintal dengan setiap komponen mount, jadi sebenarnya itu akan ditambahkan hanya satu kali, ketika seluruh aplikasi dimuat.sumber
Saya menggunakan paket react-progress-2 npm, yang merupakan ketergantungan nol dan bekerja sangat baik di ReactJS.
https://github.com/milworm/react-progress-2
Instalasi:
npm install react-progress-2
Sertakan reaksi-kemajuan-2 / main.css ke proyek Anda.
import "node_modules/react-progress-2/main.css";
Sertakan
react-progress-2
dan letakkan di suatu tempat di komponen-atas, misalnya:Sekarang, setiap kali Anda perlu menunjukkan indikator, panggil saja
Progress.show()
, misalnya:Harap dicatat, itu
show
danhide
panggilan ditumpuk, jadi setelah n-berturut-turut menunjukkan panggilan, Anda perlu melakukan dan menyembunyikan panggilan untuk menyembunyikan indikator atau Anda dapat menggunakanProgress.hideAll()
.sumber
Saya juga menggunakan Bereaksi di aplikasi saya. Untuk permintaan saya menggunakan interseptor axios, cara terbaik untuk membuat layar loader (halaman penuh seperti yang Anda tunjukkan contoh) adalah dengan menambahkan kelas atau id ke tubuh contoh di dalam interceptor (di sini kode dari dokumentasi resmi dengan beberapa kode khusus):
Dan kemudian implementasikan saja di CSS loader Anda dengan elemen semu (atau tambahkan kelas atau id ke elemen lain, bukan isi yang diinginkan) - Anda dapat mengatur warna latar belakang menjadi buram atau transparan, dll ... Contoh:
sumber
Edit lokasi file index.html Anda di folder publik . Salin gambar Anda ke lokasi yang sama dengan index.html di folder publik. Dan kemudian ganti bagian dari isi index.html yang berisi
<div id="root"> </div>
tag ke kode html yang diberikan di bawah ini.Logo sekarang akan muncul di tengah halaman selama proses pemuatan. Dan kemudian akan diganti setelah beberapa detik oleh Bereaksi.
sumber
Anda tidak perlu banyak usaha, inilah contoh dasar.
Anda dapat bermain-main dengan
HTML
danCSS
membuatnya terlihat seperti contoh Anda.sumber
Pertanyaan yang paling penting adalah: apa yang Anda maksud dengan 'memuat'? Jika Anda berbicara tentang elemen fisik yang dipasang, beberapa jawaban pertama di sini sangat bagus. Namun, jika hal pertama yang dilakukan aplikasi Anda adalah memeriksa keaslian, yang sebenarnya Anda muat adalah data dari backend apakah pengguna melewati cookie yang memberi label mereka pengguna yang sah atau tidak sah.
Ini didasarkan pada redux, tetapi Anda dapat dengan mudah mengubahnya menjadi model keadaan reaksi polos.
pembuat aksi:
Bagian terakhir berarti apakah pengguna diotorisasi atau tidak, layar pemuatan hilang setelah respons diterima.
Berikut komponen yang memuatnya:
Jika state.loading benar, kami akan selalu melihat layar pemuatan. Pada componentDidMount, kami memanggil fungsi getTodos kami, yang merupakan pembuat tindakan yang mengubah state.loading falsy ketika kami mendapat respons (yang bisa menjadi kesalahan). Pembaruan komponen kami, panggilan render lagi, dan kali ini tidak ada layar pemuatan karena pernyataan if.
sumber
Awal aplikasi reaksi didasarkan pada unduhan bundel utama. Bereaksi aplikasi hanya dimulai setelah bundel utama diunduh di browser. Ini bahkan berlaku dalam kasus arsitektur pemuatan malas. Tetapi faktanya adalah kita tidak dapat secara tepat menyebutkan nama bundel apa pun. Karena webpack akan menambahkan nilai hash di akhir setiap bundel pada saat Anda menjalankan perintah 'npm run build'. Tentu saja kita dapat menghindarinya dengan mengubah pengaturan hash, tetapi itu akan sangat memengaruhi masalah data cache di Browser. Browser mungkin tidak mengambil versi baru karena nama bundel yang sama. . kita membutuhkan pendekatan webpack + js + CSS untuk menangani situasi ini.
ubah public / index.html seperti di bawah ini
Dalam konfigurasi webpack produksi Anda, ubah opsi HtmlWebpackPlugin ke bawah
Anda mungkin perlu menggunakan perintah 'eject' untuk mendapatkan file konfigurasi. webpack terbaru mungkin memiliki opsi untuk mengkonfigurasi HtmlWebpackPlugin tanpa mengeluarkan proyek.
sumber
Saya juga menggunakan jawaban @Ori Drori dan berhasil membuatnya bekerja. Ketika kode Bereaksi Anda tumbuh, bundel akan dikompilasi sehingga browser klien harus mengunduh pada akses pertama kali. Ini membebankan masalah pengalaman pengguna jika Anda tidak menanganinya dengan baik.
Apa yang saya tambahkan ke jawaban @Ori adalah menambahkan dan menjalankan fungsi onload di index.html pada atribut onload dari tag body, sehingga loader hilang setelah semuanya dimuat penuh di dalam browse, lihat cuplikan di bawah ini:
sumber
Bagaimana dengan menggunakan Pace
Gunakan alamat tautan ini di sini.
https://github.hubspot.com/pace/docs/welcome/
1. Di situs web mereka pilih gaya yang Anda inginkan dan tempel di index.css
2. pergi ke cdnjs Salin tautan untuk Pace Js dan tambahkan ke tag skrip Anda di public / index.html
3. Secara otomatis mendeteksi beban web dan menampilkan langkah di browser Top.
Anda juga dapat memodifikasi ketinggian dan animasi di css.
sumber