Di bagian terjemahan React tutorial hari ini, kami akan menyelesaikan pekerjaan pada aplikasi Todo dan berbicara tentang cara menggunakan data dari komponen internal dan kemampuan JavaScript standar untuk memuat data dari sumber eksternal.

→
Bagian 1: ikhtisar kursus, alasan popularitas React, ReactDOM dan JSX→
Bagian 2: komponen fungsional→
Bagian 3: file komponen, struktur proyek→
Bagian 4: komponen induk dan anak→
Bagian 5: mulai bekerja pada aplikasi TODO, dasar-dasar gaya→
Bagian 6: tentang beberapa fitur kursus, JSX dan JavaScript→
Bagian 7: gaya inline→
Bagian 8: terus bekerja pada aplikasi TODO, terbiasa dengan sifat-sifat komponen→
Bagian 9: properti komponen→
Bagian 10: Workshop bekerja dengan properti komponen dan gaya→
Bagian 11: pembuatan markup dinamis dan metode susunan peta→
Bagian 12: lokakarya, pekerjaan tahap ketiga pada aplikasi TODO→
Bagian 13: komponen berbasis kelas→
Bagian 14: lokakarya tentang komponen berbasis kelas, status komponen→
Bagian 15: bengkel kesehatan komponen→
Bagian 16: tahap keempat dari pengerjaan aplikasi TODO, penanganan acara→
Bagian 17: tahap kelima bekerja pada aplikasi TODO, memodifikasi status komponen→
Bagian 18: tahap keenam dari pengerjaan aplikasi TODO→
Bagian 19: metode siklus hidup komponenBagian 20: pelajaran pertama dalam rendering bersyarat→
Bagian 21: pelajaran kedua dan lokakarya tentang rendering bersyarat→
Bagian 22: tahap ketujuh bekerja pada aplikasi TODO, mengunduh data dari sumber eksternal→
Bagian 23: pelajaran pertama tentang bekerja dengan formulir→
Bagian 24: Pelajaran Bentuk Kedua→
Bagian 25: Workshop bekerja dengan formulir→
Bagian 26: arsitektur aplikasi, pola Container / Komponen→
Bagian 27: proyek kursusPelajaran 39. Workshop. Aplikasi TODO. Tahap nomor 7
→
Asli▍ pekerjaan
Sekarang aplikasi Todo terlihat seperti gambar berikut.
Halaman aplikasi di browserTodoItem
komponen
TodoItem
terlihat seperti ini:
import React from "react" function TodoItem(props) { return ( <div className="todo-item"> <input type="checkbox" checked={props.item.completed} onChange={() => props.handleChange(props.item.id)} /> <p>{props.item.text}</p> </div> ) } export default TodoItem
Tugas Anda adalah mendesain item daftar sesuai dengan statusnya. Tampilan kasus yang diselesaikan harus berbeda dari tidak lengkap. Saat memformat item daftar yang mewakili tugas yang diselesaikan, teksnya dapat berwarna abu-abu, dapat dicoret, dicetak miring, atau modifikasi lainnya dapat dilakukan.
OlSolusi
Masalah yang disajikan di sini dapat diselesaikan dengan berbagai cara. Kita akan menggunakan gaya
TodoItem
, yang akan kita gambarkan sebagai konstanta
TodoItem
dalam
TodoItem
komponen fungsional
TodoItem
. Di sini kita mengkonfigurasi properti teks
fontStyle
,
color
dan
textDecoration
. Setelah itu, menggunakan teknik rendering bersyarat, kami akan menetapkan gaya ini ke elemen
<p>
jika case yang diambil olehnya ditandai sebagai selesai. Kami akan menentukan ini berdasarkan properti yang diteruskan ke instance komponen, yang tersedia di dalamnya sebagai
props.item.completed
.
Kode komponen yang dikonversi akan terlihat seperti ini:
import React from "react" function TodoItem(props) { const completedStyle = { fontStyle: "italic", color: "#cdcdcd", textDecoration: "line-through" } return ( <div className="todo-item"> <input type="checkbox" checked={props.item.completed} onChange={() => props.handleChange(props.item.id)} /> <p style={props.item.completed ? completedStyle: null}>{props.item.text}</p> </div> ) } export default TodoItem
Begini cara tampilan halaman aplikasi berubah.
Halaman aplikasi berubah di browserPada saat yang sama, gaya diterapkan ketika mengatur dan menghapus centang pada bendera yang menunjukkan status item dalam daftar yang harus dilakukan.
Ini menyimpulkan pekerjaan pada aplikasi Todo.
Pelajaran 40. Mengunduh Data dari Sumber Eksternal
→
AsliDalam pelajaran tentang metode siklus hidup komponen, kami berbicara tentang metode
componentDidMount()
. Cobalah untuk mengingat cara kerjanya. Metode ini memungkinkan Anda untuk mengganggu pengoperasian komponen dengan mengeksekusi beberapa kode segera setelah komponen ditambahkan ke pohon DOM. Ketika kita berbicara tentang metode siklus hidup komponen, saya menyebutkan bahwa metode
componentDidMount()
paling sering digunakan untuk memuat data dari beberapa sumber eksternal. Data ini digunakan oleh komponen untuk mewujudkan tujuannya.
Mari kita mulai eksperimen kita hari ini dengan proyek baru yang dibuat menggunakan alat create-react-app
App.js
yang file
App.js
-
App.js
berisi kode berikut:
import React, {Component} from "react" class App extends Component { constructor() { super() this.state = {} } render() { return ( <div> Code goes here </div> ) } } export default App
Dalam kode komponen
App
berbasis-komponen, kami menggambarkan metode
componentDidMount()
dan memeriksa operabilitas dari konstruk yang dihasilkan dengan mengeluarkan sesuatu ke konsol dari metode ini.
import React, {Component} from "react" class App extends Component { constructor() { super() this.state = {} } componentDidMount() { console.log("Hi!") } render() { return ( <div> Code goes here </div> ) } } export default App
Output ke string konsol
Hi!
membuktikan fungsionalitas kode, sehingga kami dapat terus bekerja. Seperti yang telah disebutkan, metode ini biasanya memuat data yang diperlukan agar komponen berfungsi.
Dalam pelajaran ini, kita akan menggunakan beberapa alat bantu yang akan berguna bagi kita saat memuat data ke dalam komponen.
Yang pertama adalah fitur JavaScript bawaan. Kita berbicara tentang
Ambil API , yang merupakan antarmuka yang nyaman untuk memperoleh sumber daya, berdasarkan
janji , yang memungkinkan Anda untuk melakukan permintaan HTTP, di mana data dimuat.
Alat kedua yang akan kita gunakan adalah
Star Wars API . Proyek ini bagus karena dapat digunakan dalam aplikasi front-end tanpa kesulitan khusus (khususnya, kita berbicara tentang fitur konfigurasi CORS).
Dalam metode
componentDidMount()
, kita akan menggunakan fungsi
fetch()
, mengirimkannya alamat untuk memuat data, mengonversi data ini ke tipe yang kita butuhkan, dan, untuk memeriksa operasi sistem yang benar, mengeluarkan data ini ke konsol. Kami mengubah kode metode ke bentuk berikut:
componentDidMount() { fetch("https://swapi.co/api/people/1") .then(response => response.json()) .then(data => console.log(data)) }
Di sini kita mengunduh data tentang pahlawan film tertentu, merujuk pada API, setelah itu kita mengubah apa yang datang dari server ke format JSON, dan kemudian mencetak data ini ke konsol. Apa yang masuk ke konsol ditunjukkan pada gambar berikut.
Data yang diunduh dari Star Wars API adalah output ke konsolSeperti yang Anda lihat, objek dengan data tentang Luke Skywalker masuk ke konsol. Sekarang, setelah kita memiliki data, kita perlu memikirkan cara menampilkannya di halaman aplikasi. Untuk mengatasi masalah ini, pertama-tama Anda harus mempertimbangkan fakta bahwa data yang diunduh dari luar, jika tidak disimpan di mana pun, tidak dapat ditampilkan pada halaman aplikasi di browser. Tempat yang berfungsi untuk menyimpan data tersebut adalah keadaan komponen. Tambahkan properti baru,
character
, yang diwakili oleh objek kosong ke status komponen:
this.state = { character: {} }
Kita akan menyimpan objek ini di properti ini dengan deskripsi karakter, data yang diunduh dari sumber eksternal. Mereka ada sebagai objek, jadi ketika kita menginisialisasi keadaan, kita menjadikan properti
character
sebagai objek kosong.
Setelah itu, di tempat itu kode metode
componentDidMount()
, di mana kita mendapatkan data, kita akan menulisnya ke keadaan menggunakan metode
setState()
. Selain itu, dalam hal ini, apa yang disimpan di negara bagian sebelum itu tidak menarik bagi kita, oleh karena itu, kita dapat dengan mudah melewati metode ini objek yang berisi representasi baru negara. Akibatnya, kita sampai pada kode metode
componentDidMount()
ini:
componentDidMount() { fetch("https://swapi.co/api/people/1") .then(response => response.json()) .then(data => { this.setState({ character: data }) }) }
Untuk memverifikasi operasi yang benar dari mekanisme yang sekarang ada dalam kode, kami akan menampilkan dalam metode
render()
sesuatu yang harus ada di negara bagian setelah data yang dimuat ditulis ke dalamnya. Sekarang kode file
App.js
akan terlihat seperti ini:
import React, {Component} from "react" class App extends Component { constructor() { super() this.state = { character: {} } } componentDidMount() { fetch("https://swapi.co/api/people/1") .then(response => response.json()) .then(data => { this.setState({ character: data }) }) } render() { return ( <div> {this.state.character.name} </div> ) } } export default App
Dan inilah tampilan halaman aplikasi di browser.
Halaman aplikasi di browserMenampilkan teks
Luke Skywalker
pada halaman menunjukkan bagaimana mekanisme pemuatan data bekerja.
Aplikasi kami menggunakan permintaan sederhana, sebagai tanggapan terhadap mana aplikasi menerima sejumlah kecil data yang dengan cepat diproses dan ditampilkan pada halaman. Butuh sedikit waktu untuk menyelesaikan semua tindakan ini. Oleh karena itu, data ditampilkan di layar dengan sangat cepat sehingga kami mendapatkan kesan bahwa komponen, segera setelah menampilkannya di layar, sudah berisi itu. Tetapi jika sumber data jarak jauh diakses menggunakan jalur komunikasi yang sangat lambat, atau API dari mana data dimuat secara perlahan menanggapi permintaan, dibutuhkan waktu lama sebelum aplikasi dapat menampilkan data ini di layar. . Selama ini, layar akan tetap kosong. Jika ini terjadi di aplikasi dunia nyata, itu membingungkan pengguna mereka, yang mungkin memutuskan bahwa aplikasi tersebut tidak berfungsi dengan benar. Untuk mengantisipasi situasi yang sama, perlu, selama pemuatan dan pemrosesan data, untuk menunjukkan kepada pengguna pesan yang sesuai. Ini tidak berlaku untuk topik kita hari ini, tetapi di sinilah tepat untuk membahasnya.
Dalam aplikasi nyata, untuk mengingatkan pengguna bahwa ia harus menunggu tindakan tertentu, seperti mengunduh data, mereka menggunakan sesuatu seperti indikator pemuatan. Dalam kasus kami, kami, sampai data diunggah dan siap untuk ditampilkan pada halaman, hanya akan menampilkan
loading...
teks
loading...
Dengan melakukan ini, kita akan dapat menilai kemungkinan bahwa penyimpanan data dalam keadaan aplikasi memberi kita.
Tambahkan properti baru ke status, yang menunjukkan apakah data sedang dimuat di beberapa titik waktu. Sebut itu
loading
dan menginisialisasi ke
false
. Setelah itu, segera sebelum memuat data menggunakan
fetch()
, kami menulis
true
ke properti ini.
Selanjutnya, dalam metode
render()
, berdasarkan properti state
loading
, kami akan mengonfigurasi teks yang ditampilkan pada halaman. Berikut adalah
App.js
kode
App.js
setelah konversi ini.
import React, {Component} from "react" class App extends Component { constructor() { super() this.state = { loading: false, character: {} } } componentDidMount() { this.setState({loading: true}) fetch("https://swapi.co/api/people/1") .then(response => response.json()) .then(data => { this.setState({ character: data }) }) } render() { const text = this.state.loading ? "loading..." : this.state.character.name return ( <div> <p>{text}</p> </div> ) } } export default App
Namun kode ini tidak berfungsi dengan benar. Yaitu, seperti inilah tampilan aplikasi sekarang.
Halaman aplikasi di browserDiasumsikan bahwa
loading...
prasasti
loading...
harus ditampilkan hanya ketika mengunduh data dari sumber eksternal, tetapi tampaknya sekarang ditampilkan pada halaman secara konstan. Sebelum membaca lebih lanjut, coba dan temukan dan koreksi kesalahan dalam kode.
Sebenarnya, masalahnya di sini adalah, sebelum memulai pemuatan data, kami menetapkan
loading
ke
true
, dan setelah pengunduhan selesai, kami tidak
loading
false
untuk
loading
. Akibatnya,
loading...
teks
loading...
selalu ditampilkan pada halaman. Tidak sulit untuk memperbaiki kesalahan ini. Cukup, di tempat yang sama tempat kami menulis data yang dimuat ke status, atur
loading
ke
false
. Sebagai hasilnya, kode
App.js
mengambil bentuk berikut:
import React, {Component} from "react" class App extends Component { constructor() { super() this.state = { loading: false, character: {} } } componentDidMount() { this.setState({loading: true}) fetch("https://swapi.co/api/people/1") .then(response => response.json()) .then(data => { this.setState({ loading: false, character: data }) }) } render() { const text = this.state.loading ? "loading..." : this.state.character.name return ( <div> <p>{text}</p> </div> ) } } export default App
Sekarang, ketika memuat data, tulisan prasasti
loading...
muncul sebentar, dan setelah itu nama karakter ditampilkan pada halaman.
Ringkasan
Dalam pelajaran ini, Anda menyelesaikan pekerjaan pada aplikasi Todo dan belajar cara menggunakan
componentDidMount()
metode siklus hidup
componentDidMount()
dan API Ambil standar untuk memuat data dari sumber eksternal, memprosesnya, dan menampilkannya di halaman. Selain itu, di sini kita berbicara tentang implementasi mekanisme untuk memberi tahu pengguna tentang operasi yang menjalankan aplikasi, yang dapat memakan banyak waktu. Lain kali kita akan berbicara tentang formulir.
Pembaca yang budiman! Bagaimana Anda memuat data dari sumber eksternal ke aplikasi Bereaksi?