如何在 React Native 中持久化 Mobx 状态树?

Asw*_*han 5 react-native mobx mobx-state-tree

我需要在 React Native 中保留一个 MST Store。数据很少更改。

我对使用 AsyncStorage 和 AutoRun 感到困惑。

agi*_*ur5 8

对于持久化 MST 存储,您可能有兴趣使用mst-persist,根据自述文件,它目前是 MSTonSnapshot和的小型包装器applySnapshot(免责声明:我是创建者)。

要在 React Native 中持久化数据并mst-persist支持AsyncStorage,可以这样做:

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'))
Run Code Online (Sandbox Code Playgroud)

我最初的用例mst-persist是 React Native,当前的 README 实际上会指向你在我作为例子制作的 OSS RN 漫画阅读器应用程序中的提交

如果您对如何在没有其他库的情况下使用 MST 进行操作感兴趣mst-persist,那么持久性源代码目前实际上 < 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)
    })
}
Run Code Online (Sandbox Code Playgroud)

有极少数的其他例子在野外,显示了类似的功能,以及,如该要点mst-persist部分地被激发,这种回购使用肝卵圆细胞和PersistGate同样的情形来redux-persist,和这个主旨是需要多个商店作为参数。