Устанавливает состояние в зависимости от того, загружен ли элемент сохранения

#react-native

#react-native

Вопрос:

В моем App.js я хочу установить состояние логической переменной в значение true, когда элемент сохранения завершит загрузку. Я использую пользовательский компонент экрана-заставки, поэтому я хочу установить для состояния логической переменной значение true, когда <PersistGate> завершится загрузка, пожалуйста, как я могу это сделать

Сохранить- Index.js

     import { createStore } from "redux";
import { persistStore, persistReducer } from 'redux-persist'
import storage from 'redux-persist/lib/storage' 
import rootReducer from "../reducers/index";
import autoMergeLevel2 from 'redux-persist/lib/stateReconciler/autoMergeLevel2';
const persistConfig = {
    key: 'root',
    storage,
    stateReconciler: autoMergeLevel2
  }
const persistedReducer = persistReducer(persistConfig, rootReducer)
export default () => {
  let store = createStore(persistedReducer)
  let persistor = persistStore(store)
  return { store, persistor }
}
  

App.js

 import {
    Platform,
    StyleSheet,
    Text,
    Image,
    Dimensions,
    StatusBar,
    ScrollView,
    View,
    DeviceEventEmitter,
    FlatList,
    ActivityIndicator,
    AsyncStorage
} from 'react-native';
import Splash from './components/Splash';
import Home from './components/Home';
import MusicFiles from 'react-native-get-music-files';
import Permissions from 'react-native-permissions';
import { PersistGate } from 'redux-persist/integration/react';


export default class App extends Component{
 constructor(props) {
        super(props);
        this.state = {
            timePassed: false,
            photoPermission: '',
            songs: [], 
            loaded: true,
            loading: false
        };
    }
  render() {
    if (!this.state.loaded) {
        return (
            <Splash/>
           );
    } else {
        return (
            <View style={styles.linearGradient}>
            <Provider store={store}>
            <PersistGate loading={null} persistor={persistor}>
            <Home songs={this.state.songs}/>
            </PersistGate>
            </Provider>
            </View>
        );

    }
}
}
  

Ответ №1:

Вы можете поместить свой компонент splash в loading prop или использовать onBeforeLift

 const onBeforeLift = () => {
  // take some action before the gate lifts
}

 return (
        <View style={styles.linearGradient}>
          <Provider store={store}>
            <PersistGate 
              loading={<Splash/>}
              onBeforeLift={this.onBeforeLift}
              persistor={persistor}>
               <Home songs={this.state.songs}/>
          </PersistGate>
         </Provider>
       </View>
    );
  

Комментарии:

1. «Не удалось выполнить ‘removeChild’ на ‘Node’: Узел, который необходимо удалить, не является дочерним по отношению к этому узлу. «появляется при предоставлении loading={<LoaderComponent />}