Saya mengalami masalah dengan formulir Bereaksi dan mengelola negara dengan benar. Saya memiliki bidang input waktu dalam formulir (dalam modal). Nilai awal diatur sebagai variabel keadaan di getInitialState
, dan diteruskan dari komponen induk. Ini dengan sendirinya berfungsi dengan baik.
Masalahnya muncul ketika saya ingin memperbarui nilai start_time default melalui komponen induk. Pembaruan itu sendiri terjadi di komponen induk melalui setState start_time: new_time
. Namun dalam formulir saya, nilai start_time default tidak pernah berubah, karena hanya didefinisikan sekali dalam getInitialState
.
Saya telah mencoba menggunakan componentWillUpdate
untuk memaksa perubahan melalui negara setState start_time: next_props.start_time
, yang benar-benar bekerja, tetapi memberi saya Uncaught RangeError: Maximum call stack size exceeded
kesalahan.
Jadi pertanyaan saya adalah, apa cara yang benar untuk memperbarui keadaan dalam kasus ini? Apakah saya memikirkan kesalahan ini?
Kode Saat Ini:
@ModalBody = React.createClass
getInitialState: ->
start_time: @props.start_time.format("HH:mm")
#works but takes long and causes:
#"Uncaught RangeError: Maximum call stack size exceeded"
componentWillUpdate: (next_props, next_state) ->
@setState(start_time: next_props.start_time.format("HH:mm"))
fieldChanged: (fieldName, event) ->
stateUpdate = {}
stateUpdate[fieldName] = event.target.value
@setState(stateUpdate)
render: ->
React.DOM.div
className: "modal-body"
React.DOM.form null,
React.createElement FormLabelInputField,
type: "time"
id: "start_time"
label_name: "Start Time"
value: @state.start_time
onChange: @fieldChanged.bind(null, "start_time”)
@FormLabelInputField = React.createClass
render: ->
React.DOM.div
className: "form-group"
React.DOM.label
htmlFor: @props.id
@props.label_name + ": "
React.DOM.input
className: "form-control"
type: @props.type
id: @props.id
value: @props.value
onChange: @props.onChange
[..]going to be deprecated in the future
Rupanya semuanya berubah .... getDerivedStateFromProps () sekarang menjadi fungsi yang disukai.
(kode di atas oleh danburzo @ github)
sumber
null
jika tidak ada yang berubah begitu setelah Anda jika, Anda harus pergi denganreturn null
getDerivedStateFromProps
atau memo reactjs.org/blog/2018/06/07/...componentWillReceiveProps
sedang ditinggalkan karena menggunakannya "sering mengarah ke bug dan inkonsistensi".Jika ada perubahan dari luar, pertimbangkan untuk mengatur ulang komponen anak sepenuhnya
key
.Memberikan
key
penyangga ke komponen turunan memastikan bahwa kapan pun nilaikey
perubahan dari luar, komponen ini dirender ulang. Misalnya,Tentang kinerjanya:
sumber
JSON.stringify(myObject)
untuk mendapatkan kunci unik dari objek Anda.Ada juga componentDidUpdate yang tersedia.
Signatur fungsi:
Gunakan ini sebagai peluang untuk beroperasi pada DOM ketika komponen telah diperbarui. Tidak dipanggil pada awal
render
.Sampai jumpa Mungkin Anda Tidak Perlu Turunkan Artikel Negara , yang menjelaskan Anti-Pola untuk keduanya
componentDidUpdate
dangetDerivedStateFromProps
. Saya merasa sangat berguna.sumber
componentDidUpdate
karena sederhana dan lebih cocok untuk kebanyakan kasus.Cara kait baru untuk melakukan ini adalah dengan menggunakan useEffect alih-alih componentWillReceiveProps dengan cara lama:
menjadi yang berikut dalam komponen yang digerakkan oleh kait fungsional:
kami mengatur negara menggunakan setState, menggunakan useEffect kami memeriksa perubahan pada prop yang ditentukan, dan mengambil tindakan untuk memperbarui status pada perubahan prop.
sumber
Anda Mungkin Tidak Perlu Status Turunan
1. Atur kunci dari induk
2. Gunakan
getDerivedStateFromProps
/componentWillReceiveProps
Dengan menggunakan
getDerivedStateFromProps
Anda dapat mengatur ulang bagian mana pun dari negara tetapi tampaknya sedikit buggy saat ini (v16.7) !, lihat tautan di atas untuk penggunaansumber
Dari dokumentasi reaksi: https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html
Sejak Bereaksi 16, componentWillReceiveProps sudah tidak digunakan lagi. Dari dokumentasi reaksi, pendekatan yang direkomendasikan dalam kasus ini adalah penggunaan
ParentComponent
satuModalBody
akan memilikistart_time
negara. Ini bukan pendekatan pilihan saya dalam hal ini karena saya pikir modal harus memiliki keadaan ini.start_time
status dari AndaModalBody
dan menggunakangetInitialState
seperti yang telah Anda lakukan. Untuk mengatur ulangstart_time
keadaan, Anda cukup mengubah kunci dariParentComponent
sumber
Ini cukup jelas dari dokumen mereka:
Gunakan: https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#what-about-memoization
sumber
Gunakan Memoize
Derivasi keadaan op adalah manipulasi langsung alat peraga, tanpa derivasi sejati yang diperlukan. Dengan kata lain, jika Anda memiliki properti yang dapat digunakan atau diubah secara langsung, Anda tidak perlu menyimpannya di negara bagian .
Mengingat bahwa nilai state
start_time
hanyalah propstart_time.format("HH:mm")
, informasi yang terkandung dalam prop sudah cukup untuk memperbarui komponen.Namun jika Anda hanya ingin memanggil format pada perubahan prop, cara yang benar untuk melakukan ini per dokumentasi terbaru akan melalui Memoize: https://reactjs.org/blog/2018/06/07/you-probably-dont- need-diturunkan-state.html # what-about-memoization
sumber
Saya pikir menggunakan ref aman untuk saya, tidak perlu peduli dengan beberapa metode di atas.
sumber