Saya baru saja pindah dari Angular ke ReactJs. Saya menggunakan jQuery untuk panggilan API. Saya memiliki API yang mengembalikan daftar pengguna acak yang akan dicetak dalam daftar.
Saya tidak yakin bagaimana cara menulis panggilan API saya. Apa praktik terbaik untuk ini?
Saya mencoba yang berikut tetapi saya tidak mendapatkan hasil apa pun. Saya terbuka untuk mengimplementasikan pustaka API alternatif jika perlu.
Di bawah ini adalah kode saya:
import React from 'react';
export default class UserList extends React.Component {
constructor(props) {
super(props);
this.state = {
person: []
};
}
UserList(){
return $.getJSON('https://randomuser.me/api/')
.then(function(data) {
return data.results;
});
}
render() {
this.UserList().then(function(res){
this.state = {person: res};
});
return (
<div id="layout-content" className="layout-content-wrapper">
<div className="panel-list">
{this.state.person.map((item, i) =>{
return(
<h1>{item.name.first}</h1>
<span>{item.cell}, {item.email}</span>
)
})}
<div>
</div>
)
}
}
javascript
jquery
reactjs
Raj Rj
sumber
sumber
componentDidMount
panggilan balik.fetch()
alih-alih jQuery jika Anda hanya menggunakan jQuery untuk melakukan permintaan Ajax.useEffect
ini mungkin merupakan tempat untuk melakukan panggilan api sekarang. Lihat btholt.github.io/complete-intro-to-react-v5/effectsJawaban:
Dalam hal ini, Anda dapat melakukan panggilan ajax di dalam
componentDidMount
, dan kemudian memperbaruistate
sumber
Anda mungkin ingin melihat Arsitektur Flux . Saya juga merekomendasikan memeriksa Implementasi React-Redux . Masukkan panggilan api Anda dalam tindakan Anda. Ini jauh lebih bersih daripada memasukkan semuanya ke dalam komponen.
Tindakan adalah semacam metode pembantu yang dapat Anda panggil untuk mengubah status aplikasi Anda atau melakukan panggilan api.
sumber
Gunakan
fetch
metode di dalamcomponentDidMount
untuk memperbarui status:sumber
Diskusi ini telah berlangsung beberapa lama dan jawaban @Alexander T. memberikan panduan yang baik untuk mengikuti React seperti saya. Dan saya akan berbagi beberapa pengetahuan tambahan tentang memanggil API yang sama beberapa kali untuk menyegarkan komponen, saya pikir itu mungkin masalah umum yang mungkin dihadapi pemula pada awalnya.
componentWillReceiveProps(nextProps)
, dari dokumentasi resmi :Kita dapat menyimpulkan bahwa di sini adalah tempat kami menangani alat peraga dari komponen induk, memiliki panggilan API, dan memperbarui status.
Berdasarkan contoh @Alexander T.:
Memperbarui
componentWillReceiveProps()
akan ditinggalkan.Berikut ini hanya beberapa metode (semuanya dalam Doc ) dalam siklus hidup yang saya pikir akan terkait dengan penerapan API dalam kasus umum:
Dengan merujuk diagram di atas:
Sebarkan API di
componentDidMount()
Skenario yang tepat untuk melakukan panggilan API di sini adalah bahwa konten (dari respons API) komponen ini akan statis,
componentDidMount()
hanya menyala sekali saat komponen sedang dipasang, bahkan alat peraga baru dilewatkan dari komponen induk atau memiliki tindakan untuk memimpinre-rendering
.Komponen memeriksa perbedaan untuk merender ulang tetapi tidak memasang kembali .
Kutipan dari doc :
static getDerivedStateFromProps(nextProps, prevState)
Kita harus memperhatikan bahwa ada dua jenis pembaruan komponen ,
setState()
dalam komponen saat ini tidak akan memicu metode ini, tetapi rendering ulang atau alat peraga baru dari komponen induk lakukan. Kami dapat menemukan bahwa metode ini juga menyala saat pemasangan.Ini adalah tempat yang tepat untuk menggunakan API jika kami ingin menggunakan komponen saat ini seperti templat, dan parameter baru untuk API adalah alat peraga yang berasal dari komponen induk .
Kami menerima respons berbeda dari API dan mengembalikan yang baru di
state
sini untuk mengubah konten komponen ini.Sebagai contoh:
Kami memiliki daftar dropdown untuk Mobil yang berbeda di komponen induk, komponen ini perlu menunjukkan detail dari yang dipilih.
componentDidUpdate(prevProps, prevState)
Berbeda dari
static getDerivedStateFromProps()
, metode ini dipanggil segera setelah setiap rendering kecuali rendering awal. Kami dapat membuat panggilan API dan membuat perbedaan dalam satu komponen.Perluas contoh sebelumnya:
Komponen untuk menampilkan detail Mobil mungkin berisi daftar seri mobil ini, jika kita ingin memeriksa yang produksi 2013, kita dapat mengklik atau memilih atau ... daftar item untuk memimpin yang pertama
setState()
untuk mencerminkan ini perilaku (seperti menyoroti item daftar) di komponen ini, dan berikut inicomponentDidUpdate()
kami mengirim permintaan kami dengan parameter baru (status). Setelah mendapatkan respons, kamisetState()
kembali untuk merender konten yang berbeda dari detail Mobil. Untuk mencegah hal-hal berikutcomponentDidUpdate()
dari menyebabkan infinity loop, kita perlu membandingkan keadaan dengan memanfaatkanprevState
di awal metode ini untuk memutuskan apakah kita mengirim API dan merender konten baru.Metode ini benar-benar dapat dimanfaatkan seperti halnya
static getDerivedStateFromProps()
dengan alat peraga, tetapi perlu menangani perubahanprops
dengan memanfaatkanprevProps
. Dan kita perlu bekerja sama dengancomponentDidMount()
untuk menangani panggilan API awal.Kutipan dari doc :
sumber
Saya ingin Anda melihat redux http://redux.js.org/index.html
Mereka memiliki cara yang sangat baik dalam menangani panggilan async yaitu panggilan API, dan alih-alih menggunakan jQuery untuk panggilan API, saya ingin merekomendasikan menggunakan fetch atau meminta paket npm, fetch saat ini didukung oleh browser modern, tetapi shim juga tersedia untuk sisi server.
Ada juga ini paket superagent yang luar biasa , yang memiliki banyak pilihan ketika membuat permintaan API dan sangat mudah digunakan.
sumber
Fungsi render harus murni, artinya hanya menggunakan status dan alat peraga untuk membuat, jangan pernah mencoba mengubah keadaan dalam render, ini biasanya menyebabkan bug jelek dan menurunkan kinerja secara signifikan. Ini juga merupakan poin yang baik jika Anda memisahkan pengambilan data dan membuat masalah di Aplikasi Bereaksi Anda. Saya sarankan Anda membaca artikel ini yang menjelaskan ide ini dengan sangat baik. https://medium.com/@learnreact/container-components-c0e67432e005#.sfydn87nm
sumber
Bagian dari dokumentasi React v16 ini akan menjawab pertanyaan Anda, baca tentang componentDidMount ():
Seperti yang Anda lihat, componentDidMount dianggap sebagai tempat dan siklus terbaik untuk melakukan panggilan api , juga mengakses node, berarti saat ini aman untuk melakukan panggilan, memperbarui tampilan atau apa pun yang dapat Anda lakukan ketika dokumen siap, jika Anda siap menggunakan jQuery, ini seharusnya mengingatkan Anda pada document.ready () fungsi, di mana Anda dapat memastikan semuanya siap untuk apa pun yang ingin Anda lakukan dalam kode Anda ...
sumber
1) Anda dapat menggunakan F etch API untuk mengambil data dari Endd Points:
Contoh mengambil semua
Github
istirahat untuk pengguna2) Alternatif Lainnya adalah Aksioma
Sekarang Anda dapat memilih untuk mengambil data menggunakan salah satu strategi ini di
componentDidMount
Sementara itu Anda dapat menampilkan bilah kemajuan saat data dimuat
sumber
Anda juga dapat mengambil data dengan kait di komponen fungsi Anda
contoh lengkap dengan panggilan api: https://codesandbox.io/s/jvvkoo8pq3
contoh kedua: https://jsfiddle.net/bradcypert/jhrt40yv/6/
sumber
Karena tempat dan praktik terbaik untuk panggilan API eksternal adalah React Lifecycle method componentDidMount () , di mana setelah eksekusi panggilan API Anda harus memperbarui status lokal yang akan dipicu panggilan metode render () baru , maka perubahan di negara bagian yang diperbarui akan diterapkan pada tampilan komponen.
Sebagai pilihan lain untuk panggilan sumber data eksternal awal di Bereaksi adalah menunjuk konstruktor () metode kelas. Konstruktor adalah metode pertama yang dijalankan pada inisialisasi instance objek komponen. Anda bisa melihat pendekatan ini dalam contoh dokumentasi untuk Komponen Orde Tinggi .
Method methodWillMount () dan UNSAFE_componentWillMount () tidak boleh digunakan untuk panggilan API eksternal, karena mereka dimaksudkan untuk tidak digunakan lagi. Di sini Anda bisa melihat alasan umum, mengapa metode ini akan usang.
Lagi pula Anda tidak boleh menggunakan metode render () atau metode yang dipanggil langsung dari render () sebagai titik untuk panggilan API eksternal. Jika Anda melakukan ini, aplikasi Anda akan diblokir .
sumber
Cara bersih adalah membuat panggilan API asinkron di dalam componentDidMount dengan fungsi coba / tangkap .
Ketika kami memanggil API, kami menerima respons. Kemudian kami menerapkan metode JSON di atasnya, untuk mengubah respons menjadi objek JavaScript. Kemudian kita ambil dari objek respons itu hanya objek anaknya yang bernama "hasil" (data.result).
Pada awalnya kami mendefinisikan "userList" dalam keadaan sebagai array kosong. Segera setelah kami melakukan panggilan API dan menerima data dari API itu, kami menetapkan "hasil" ke userList menggunakan metode setState .
Di dalam fungsi render, kami memberi tahu bahwa userList akan berasal dari negara. Karena userList adalah larik objek yang kami petakan, untuk menampilkan gambar, nama, dan nomor telepon dari masing-masing objek "pengguna". Untuk mengambil informasi ini, kami menggunakan notasi titik (mis., Pengguna ponsel).
CATATAN : tergantung pada API Anda, respons Anda mungkin terlihat berbeda. Console.log seluruh "respons" untuk melihat variabel mana yang Anda butuhkan darinya, dan kemudian tetapkan di setState.
UserList.js
sumber
Akan bagus untuk menggunakan aksioma untuk permintaan api yang mendukung pembatalan, pencegat dll. Bersama dengan aksioma, saya menggunakan reaksi-redux untuk manajemen negara dan redux-saga / redux-thunk untuk efek samping.
sumber