Bereaksi dan Reduxkeduanya membutuhkan fungsi murni ditambah dengan imutabilitas untuk berjalan dengan cara yang dapat diprediksi.
Jika Anda tidak mengikuti dua hal ini, aplikasi Anda akan memiliki bug, yang paling umum React/Reduxtidak dapat melacak perubahan dan tidak dapat membuat ulang saat state/propperubahan Anda .
Dalam hal Bereaksi, pertimbangkan contoh berikut:
let state = {
add: 0,
}
function render() {
//...
}
//pure function
function effects(state,action) {
//following immutability while updating state, not directly mutating the state.
if(action == 'addTen') {
return {...state, add: state.add + 10}
}
return state;
}
function shouldUpdate(s) {
if(s === state){
return false
}
return true
}
state = effects(state, 'addTen')if(shouldUpdate(state)) {
render();
}
Negara dipegang oleh objek negara yang hanya menambahkan properti. Aplikasi ini membuat properti aplikasi. Seharusnya tidak selalu membuat negara ketika sesuatu terjadi tetapi harus memeriksa apakah perubahan terjadi pada objek negara.
Seperti itu, kita memiliki fungsi efek, pure functionyang kita gunakan untuk memengaruhi kondisi kita. Anda melihat bahwa ia mengembalikan status baru ketika status diubah dan mengembalikan status yang sama ketika tidak diperlukan modifikasi.
Kami juga memiliki shouldUpdatefungsi yang memeriksa menggunakan operator === apakah kondisi lama dan kondisi baru sama.
Untuk membuat kesalahan dalam hal Bereaksi, Anda sebenarnya dapat melakukan hal berikut:
function effects(state,action) {
doRandom(); // effects should only be called for updating state.
// Doing any other stuff here would make effects impure.
if(action == 'addTen') {
return {...state, add: state.add + 10}
}
return state;
}
Anda juga dapat membuat kesalahan dengan mengatur negara secara langsung dan tidak menggunakan effectsfungsi.
function doMistake(newValue) {
this.state = newValue
}
Hal di atas tidak boleh dilakukan dan hanya effectsfungsi yang harus digunakan untuk memperbarui status.
Dalam hal Bereaksi, kami menyebutnya effectssebagai setState.
Untuk Redux:
combineReducersUtilitas Redux memeriksa perubahan referensi.
connectMetode React-Redux menghasilkan komponen yang memeriksa perubahan referensi untuk kondisi root dan nilai kembali dari mapStatefungsi untuk melihat apakah komponen yang dibungkus benar-benar perlu di-render ulang.
- Debugging perjalanan waktu mengharuskan peredam dilakukan
pure functionstanpa efek samping sehingga Anda dapat melompat dengan benar di antara berbagai kondisi.
Anda dapat dengan mudah melanggar ketiga di atas dengan menggunakan fungsi tidak murni sebagai peredam.
Berikut ini diambil langsung dari redux docs:
Ini disebut peredam karena itu jenis fungsi yang akan Anda masuki Array.prototype.reduce(reducer, ?initialValue).
Sangat penting bahwa peredam tetap murni. Hal yang tidak boleh Anda lakukan di dalam peredam:
Mutate its arguments;
Perform side effects like API calls and routing transitions;
Call non-pure functions, e.g. Date.now() or Math.random().
Dengan argumen yang sama, harus menghitung status berikutnya dan mengembalikannya. Tidak ada kejutan. Tidak ada efek samping. Tidak ada panggilan API. Tidak ada mutasi. Hanya perhitungan.
window.getElementByIddll sehingga menjalankan fungsi yang sama dengan parameter yang sama dapat memiliki hasil yang berbeda tergantung pada efek sampingnya. Di situlah redux akan gagal.