乐闻世界logo
搜索文章和话题

How to Persist Mobx State Tree in React Native?

1个答案

1

When using the Mobx State Tree (MST) for state management in a React Native project, persisting state is a common requirement, especially in scenarios where you need to save application configuration or user data to restore them after the app restarts. Below, I will provide a detailed explanation of how to persist the Mobx State Tree in a React Native project.

Step 1: Install Required Libraries

First, ensure that you have integrated the Mobx State Tree into your React Native project. Next, to persist state, we typically need a local storage solution. async-storage is a widely adopted library in React Native for storing simple data. Install @react-native-async-storage/async-storage:

bash
npm install @react-native-async-storage/async-storage

Step 2: Create Persistence Logic

To persist the Mobx State Tree, we need to load the stored state when the app initializes and save changes to storage whenever the state is modified. Here is a basic implementation approach:

  1. Define functions for storage and loading state:
javascript
import AsyncStorage from '@react-native-async-storage/async-storage'; import { onSnapshot, applySnapshot } from 'mobx-state-tree'; const STATE_STORAGE_KEY = 'app_state'; function saveState(state) { AsyncStorage.setItem(STATE_STORAGE_KEY, JSON.stringify(state)); } async function loadState() { const savedState = await AsyncStorage.getItem(STATE_STORAGE_KEY); if (savedState) { return JSON.parse(savedState); } return undefined; // or return initial state }
  1. Apply these functions within the state tree model:

When creating your Mobx State Tree, use loadState to initialize the state and onSnapshot to listen for state changes and persist them:

javascript
import { types, onSnapshot } from 'mobx-state-tree'; const Todo = types.model({ title: types.string, done: types.boolean }); const RootStore = types.model({ todos: types.array(Todo) }).actions(self => ({ addTodo(title) { self.todos.push({ title, done: false }); } })); async function setupRootStore() { const initialState = await loadState(); const rootStore = RootStore.create(initialState || {}); onSnapshot(rootStore, (snapshot) => { saveState(snapshot); }); return rootStore; }

Step 3: Use the State Tree

In your React Native app's top-level component, use setupRootStore to initialize your state tree and provide it to other parts of the application:

javascript
import React, { useEffect, useState } from 'react'; import { Provider } from 'mobx-react'; import { setupRootStore } from './path/to/your/store'; function App() { const [rootStore, setRootStore] = useState(null); useEffect(() => { setupRootStore().then(setRootStore); }, []); if (!rootStore) return <LoadingIndicator />; return ( <Provider store={rootStore}> <YourAppComponent /> </Provider> ); }

This process ensures that the persisted state is loaded upon app startup and changes are saved immediately whenever the state is modified. Consequently, even after the app is closed and reopened, the user's data can be restored.

2024年8月16日 00:18 回复

你的答案