Saya sedang mengerjakan sebuah proyek dan saya telah membuat tantangan yang menarik untuk diri saya sendiri. render() { const sysObjs = this.state.systemObjects; const jsonPackage = sysObjs[0]; jika (tipe jsonPackage ...

0
SonOfNye 5 April 2021, 20:11

2 jawaban

Jawaban Terbaik

render() dipanggil setiap kali status komponen Anda diperbarui. Itu juga bisa dipanggil dalam sejumlah keadaan lain, tetapi saya pikir itu yang relevan untuk situasi ini.

Anda tidak menampilkan semua kode Anda, tetapi mungkin ada sesuatu yang berjalan di mount atau sesuatu yang serupa yang memperbarui this.state.systemObjects.

Pada render pertama komponen, this.state.systemObjects adalah undefined. Jadi, jika Anda memiliki baris console.log(jsonPackage.replaceAll("\\\\", "\\")); di akhir render, itu akan gagal karena tidak dapat melakukan operasi pada undefined. Namun, dengan dikomentari, itu berjalan dengan baik, karena melewati bagian if(typeof jsonPackage === 'undefined'){ dari klausa if Anda dan bukan klausa else, di mana operasi dilakukan pada jsonPackage.

Kemudian, setelah systemObjects diperbarui, render berjalan lagi. Saat itu, systemObjects sekarang bukan undefined, jadi klausa else dijalankan -- karena Anda tidak lagi memiliki nilai yang tidak ditentukan, itu klausa else berjalan dengan baik.

Kesalahan lintas asal Anda tidak disebabkan oleh kode apa pun yang Anda tampilkan -- mungkin disebabkan oleh permintaan API di suatu tempat. Ada banyak jawaban di SO tentang apa yang dapat menyebabkannya.

1
jnpdx 5 April 2021, 17:19

Saya pikir Anda menjawab pertanyaan Anda sendiri. Ini terjadi karena pertama kali kode Anda dijalankan, jsonPackage tidak ditentukan. Inilah sebabnya mengapa kedua blok dari pernyataan if Anda masuk log, karena selama lintasan pertama adalah undefined dan selama lintasan kedua, yang akan menyebabkan blok else diaktifkan.

Dan inilah mengapa kode Anda rusak, selama lintasan pertama render, jsonPackage tidak ditentukan yang akan menimbulkan kesalahan.

Tidak mungkin untuk menjelaskan mengapa itu tidak didefinisikan pertama kali tanpa melihat sisa kode Anda. Namun, sebagai aturan praktis, Anda biasanya tidak boleh berasumsi bahwa nilai status Bereaksi akan selalu ditentukan dan menambahkan pemeriksaan yang sesuai.

0
Chris Sandvik 5 April 2021, 17:19