Saya sedang mengerjakan aplikasi react menggunakan react-router. Saya memiliki halaman proyek yang memiliki url sebagai berikut:
myapplication.com/project/unique-project-id
Ketika komponen proyek dimuat, saya memicu permintaan data untuk proyek itu dari acara componentDidMount. Saya sekarang mengalami masalah di mana jika saya beralih langsung di antara dua proyek jadi hanya id yang berubah seperti ini ...
myapplication.com/project/982378632
myapplication.com/project/782387223
myapplication.com/project/198731289
componentDidMount tidak dipicu lagi sehingga data tidak di-refresh. Apakah ada peristiwa siklus hidup lain yang harus saya gunakan untuk memicu permintaan data saya atau strategi lain untuk mengatasi masalah ini?
reactjs
react-router
Constellates
sumber
sumber
Jawaban:
Jika tautan mengarah ke rute yang sama hanya dengan parameter yang berbeda, itu tidak memasang ulang, melainkan menerima properti baru. Jadi, Anda bisa menggunakan
componentWillReceiveProps(newProps)
fungsi tersebut dan mencarinewProps.params.projectId
.Jika Anda mencoba memuat data, saya sarankan untuk mengambil data sebelum router menangani pertandingan menggunakan metode statis pada komponen. Lihat contoh ini. React Router Mega Demo . Dengan cara itu, komponen akan memuat data dan secara otomatis memperbarui ketika parameter rute berubah tanpa perlu bergantung
componentWillReceiveProps
.sumber
state
. Ini sedikit membingungkan pada awalnya, tetapi kemudian menjadi sedikit lebih jelas.Jika Anda memang membutuhkan komponen yang dipasang kembali saat rute berubah, Anda bisa meneruskan kunci unik ke atribut kunci komponen Anda (kunci tersebut terkait dengan jalur / rute Anda). Jadi setiap kali route berubah, kuncinya juga akan berubah yang memicu komponen React untuk unmount / remount. Saya mendapat ide dari jawaban ini
sumber
Inilah jawaban saya, mirip dengan beberapa di atas tetapi dengan kode.
sumber
Anda harus jelas, bahwa perubahan rute tidak akan menyebabkan halaman disegarkan, Anda harus menanganinya sendiri.
sumber
Jika Anda memiliki:
Di React 16.8 dan yang lebih baru, menggunakan hook , Anda dapat melakukan:
Di sana, Anda hanya memicu
fetchResource
panggilan baru setiap kali adaprops.match.params.id
perubahan.sumber
componentWillReceiveProps
Berdasarkan jawaban @wei, @ Breakpoint25 dan @PaulusLimma, saya membuat komponen pengganti ini untuk
<Route>
. Ini akan memasang ulang halaman saat URL berubah, memaksa semua komponen di halaman untuk dibuat dan dipasang lagi, tidak hanya dirender ulang. SemuacomponentDidMount()
dan semua pengait startup lainnya juga dijalankan pada perubahan URL.Idenya adalah untuk mengubah
key
properti komponen ketika URL berubah dan ini memaksa React untuk memasang kembali komponen tersebut.Anda dapat menggunakannya sebagai pengganti drop-in
<Route>
, misalnya seperti ini:The
<RemountingRoute>
komponen didefinisikan seperti ini:Ini telah diuji dengan React-Router 4.3.
sumber
Jawaban @ wei berfungsi dengan baik, tetapi dalam beberapa situasi saya merasa lebih baik untuk tidak menetapkan kunci komponen dalam, tetapi merutekan itu sendiri. Selain itu, jika jalur ke komponen statis, tetapi Anda hanya ingin komponen dipasang ulang setiap kali pengguna menavigasi ke sana (mungkin untuk membuat panggilan api di componentDidMount ()), sebaiknya setel location.pathname ke kunci rute. Dengan itu rute dan semua isinya akan dipasang kembali ketika lokasi berubah.
sumber
Beginilah cara saya memecahkan masalah:
Metode ini mendapatkan item individu dari API:
Saya memanggil metode ini dari componentDidMount, metode ini hanya akan dipanggil sekali, ketika saya memuat rute ini untuk pertama kalinya:
Dan dari componentWillReceiveProps yang akan dipanggil sejak kedua kalinya kita memuat rute yang sama tetapi ID berbeda, dan saya memanggil metode pertama untuk memuat ulang status dan kemudian komponen akan memuat item baru.
sumber
Jika Anda menggunakan Komponen Kelas, Anda dapat menggunakan componentDidUpdate
sumber
Anda dapat menggunakan metode yang disediakan:
Jika komponen dijamin akan dirender ulang setelah perubahan rute, Anda dapat meneruskan props sebagai dependensi
Bukan cara terbaik tapi cukup baik untuk menangani apa yang Anda cari menurut Kent C Dodds : Pertimbangkan lebih banyak apa yang Anda inginkan terjadi.
sumber
react-router
rusak karena harus memasang kembali komponen pada setiap perubahan lokasi.Saya berhasil menemukan perbaikan untuk bug ini:
https://github.com/ReactTraining/react-router/issues/1982#issuecomment-275346314
Singkatnya (lihat tautan di atas untuk info lengkap)
Ini akan membuatnya dipasang kembali pada setiap perubahan URL
sumber