Saya ingin bertahan beberapa bagian pohon negara saya ke Penyimpanan lokal. Apa tempat yang tepat untuk melakukannya? Peredam atau aksi?
sumber
Saya ingin bertahan beberapa bagian pohon negara saya ke Penyimpanan lokal. Apa tempat yang tepat untuk melakukannya? Peredam atau aksi?
Peredam tidak pernah merupakan tempat yang tepat untuk melakukan ini karena peredam harus murni dan tidak memiliki efek samping.
Saya akan merekomendasikan hanya melakukannya di pelanggan:
store.subscribe(() => {
// persist your state
})
Sebelum membuat toko, baca bagian-bagian yang bertahan:
const persistedState = // ...
const store = createStore(reducer, persistedState)
Jika Anda menggunakan combineReducers()
Anda akan melihat bahwa reduksi yang belum menerima status akan "boot up" seperti biasa menggunakan standarnyastate
nilai argumen . Ini bisa sangat berguna.
Dianjurkan agar Anda debounce pelanggan Anda sehingga Anda tidak menulis ke localStorage terlalu cepat, atau Anda akan memiliki masalah kinerja.
Akhirnya, Anda dapat membuat middleware yang merangkumnya sebagai alternatif, tetapi saya akan mulai dengan pelanggan karena ini adalah solusi yang lebih sederhana dan melakukan pekerjaan dengan baik.
Untuk mengisi kekosongan jawaban Dan Abramov, Anda dapat menggunakan
store.subscribe()
seperti ini:Sebelum membuat toko, periksa
localStorage
dan uraikan JSON apa pun di bawah kunci Anda seperti ini:Anda kemudian meneruskan
persistedState
konstanta ini kecreateStore
metode Anda seperti ini:sumber
persistedState
mengembalikaninitialState
objek kosong? Kalau tidak, saya pikircreateStore
akan menginisialisasi dengan objek kosong itu.Dalam sebuah kata: middleware.
Lihat redux-persisten . Atau tulis sendiri.
[UPDATE 18 Des 2016] Diedit untuk menghapus penyebutan dua proyek serupa yang sekarang tidak aktif atau usang.
sumber
Jika ada yang mengalami masalah dengan solusi di atas, Anda dapat menulis sendiri. Mari saya tunjukkan apa yang saya lakukan. Abaikan
saga middleware
hal-hal hanya fokus pada dua hallocalStorageMiddleware
danreHydrateStore
metode. yanglocalStorageMiddleware
menarik semuaredux state
dan menempatkan dalamlocal storage
danrehydrateStore
menarik semuaapplicationState
di penyimpanan lokal jika ada dan menempatkan dalamredux store
sumber
localStorage
walaupun tidak ada yang berubah di toko? Bagaimana Anda mengimbangi penulisan yang tidak perluSaya tidak bisa menjawab @Gardezi tetapi opsi berdasarkan kodenya bisa:
perbedaannya adalah bahwa kami hanya menyimpan beberapa tindakan, Anda dapat menggunakan fungsi debounce untuk menyimpan hanya interaksi terakhir dari negara Anda
sumber
Saya agak terlambat tetapi saya menerapkan kondisi persisten sesuai dengan contoh yang dinyatakan di sini. Jika Anda ingin memperbarui negara hanya setiap X detik, pendekatan ini dapat membantu Anda:
Tentukan fungsi pembungkus
Panggil fungsi wrapper di pelanggan Anda
Dalam contoh ini, negara diperbarui paling banyak setiap 5 detik, terlepas dari seberapa sering pembaruan dipicu.
sumber
(state) => { updateLocalStorage(store.getState()) }
dilodash.throttle
seperti ini:store.subscribe(throttle(() => {(state) => { updateLocalStorage(store.getState())} }
dan menghapus waktu memeriksa logika dalam.Mengembangkan saran yang sangat baik dan kutipan kode pendek yang disediakan dalam jawaban lain (dan artikel Medium Jam Creencia ), inilah solusi lengkap!
Kami membutuhkan file yang berisi 2 fungsi yang menyimpan / memuat status ke / dari penyimpanan lokal:
Fungsi-fungsi itu diimpor oleh store.js tempat kami mengonfigurasi toko kami:
CATATAN: Anda harus menambahkan satu ketergantungan:
npm install lodash.throttle
Toko diimpor ke index.js sehingga dapat dilewatkan ke Penyedia yang membungkus App.js :
Perhatikan bahwa impor absolut memerlukan perubahan ini ke YourProjectFolder / jsconfig.json - ini memberi tahu tempat untuk mencari file jika tidak dapat menemukannya pada awalnya. Jika tidak, Anda akan melihat keluhan tentang upaya mengimpor sesuatu dari luar src .
sumber