如何在 React Native 中持久化 Mobx 状态树?
How to Persist Mobx State Tree in React Native?
我需要在 React Native 中保留一个 MST 商店。数据很少变动。
我对使用 AsyncStorage 和 AutoRun 感到困惑。
对于持久化 MST 存储,您可能对使用 mst-persist
感兴趣,根据 README,它目前是 MST onSnapshot
和 applySnapshot
的一个小包装(免责声明:我我是创作者)。
要在 AsyncStorage
支持下 mst-persist
在 React Native 中持久化数据,可以这样做:
import { types } from 'mobx-state-tree'
import { AsyncStorage } from 'react-native'
import { persist } from 'mst-persist'
const SomeStore = types.model('Store', {
name: 'John Doe',
age: 32
})
const someStore = SomeStore.create()
persist('some', someStore, {
storage: AsyncStorage, // default: localStorage
jsonify: true // if you use AsyncStorage, this should be true
// default: true
whitelist: ['name'] // only these keys will be persisted
}).then(() => console.log('someStore has been hydrated'))
我对 mst-persist
的原始用例是针对 React Native 的,当前的 README 实际上会将您指向我制作的 OSS RN 漫画 reader 应用程序中的 a commit 作为示例。
如果您对如何在没有像 mst-persist
这样的其他库的情况下使用 MST 做到这一点感兴趣,持久性源代码目前实际上 < 50 LoC。减去一些功能,它很轻快 < 20 LoC:
import { onSnapshot, applySnapshot } from 'mobx-state-tree'
export const persist = (name, store, options = {}) => {
let {storage, jsonify} = options
onSnapshot(store, (_snapshot) => {
const snapshot = { ..._snapshot }
const data = !jsonify ? snapshot : JSON.stringify(snapshot)
storage.setItem(name, data)
})
return storage.getItem(name)
.then((data) => {
const snapshot = !jsonify ? data : JSON.parse(data)
applySnapshot(store, snapshot)
})
}
还有一些其他示例也显示了类似的功能,例如 this gist that mst-persist
is partly inspired by, this repo that uses HoCs and PersistGate
s similar to redux-persist
, and this gist 将多个商店作为参数。
我需要在 React Native 中保留一个 MST 商店。数据很少变动。
我对使用 AsyncStorage 和 AutoRun 感到困惑。
对于持久化 MST 存储,您可能对使用 mst-persist
感兴趣,根据 README,它目前是 MST onSnapshot
和 applySnapshot
的一个小包装(免责声明:我我是创作者)。
要在 AsyncStorage
支持下 mst-persist
在 React Native 中持久化数据,可以这样做:
import { types } from 'mobx-state-tree'
import { AsyncStorage } from 'react-native'
import { persist } from 'mst-persist'
const SomeStore = types.model('Store', {
name: 'John Doe',
age: 32
})
const someStore = SomeStore.create()
persist('some', someStore, {
storage: AsyncStorage, // default: localStorage
jsonify: true // if you use AsyncStorage, this should be true
// default: true
whitelist: ['name'] // only these keys will be persisted
}).then(() => console.log('someStore has been hydrated'))
我对 mst-persist
的原始用例是针对 React Native 的,当前的 README 实际上会将您指向我制作的 OSS RN 漫画 reader 应用程序中的 a commit 作为示例。
如果您对如何在没有像 mst-persist
这样的其他库的情况下使用 MST 做到这一点感兴趣,持久性源代码目前实际上 < 50 LoC。减去一些功能,它很轻快 < 20 LoC:
import { onSnapshot, applySnapshot } from 'mobx-state-tree'
export const persist = (name, store, options = {}) => {
let {storage, jsonify} = options
onSnapshot(store, (_snapshot) => {
const snapshot = { ..._snapshot }
const data = !jsonify ? snapshot : JSON.stringify(snapshot)
storage.setItem(name, data)
})
return storage.getItem(name)
.then((data) => {
const snapshot = !jsonify ? data : JSON.parse(data)
applySnapshot(store, snapshot)
})
}
还有一些其他示例也显示了类似的功能,例如 this gist that mst-persist
is partly inspired by, this repo that uses HoCs and PersistGate
s similar to redux-persist
, and this gist 将多个商店作为参数。