Я пытаюсь извлечь пользовательские данные из Firebase в сцену приложения до их рендеринга. После извлечения данных через действие и после вызова диспетчеризации из редуктора сцена не отображается. Вместо этого приложение перезапускается. Это не сбой, потому что я вижу журналы компонентов в консоли, которые отображаются только при запуске приложения).
Я новичок в React Native и Redux, но это поведение не имеет смысла для меня.
PlaceDetail.js - компонент, из которого данные должны извлекаться
import React, { Component } from 'react';
import { View, Text, ImageBackground } from 'react-native';
import { connect } from 'react-redux';
import ParallaxScrollView from 'react-native-parallax-scroll-view';
import Modal from 'react-native-modal';
import Icon from 'react-native-vector-icons/AntDesign';
import { AirbnbRating } from 'react-native-elements';
import { Actions } from 'react-native-router-flux';
import { ButtonSmall, OneLineDetail, PlaceDescription, Rating } from './common';
import { addRatingToPlace, userPlaceDataFetch } from '../actions';
...
class PlaceDetail extends Component {
state = { showModal: false };
componentWillMount() {
this.props.userPlaceDataFetch(this.props.place.uid); // calling an action
}
onArrowPress() {
Actions.pop();
}
onVisitButtonPress() {
this.setState({ showModal: true });
}
ratingComplete(pUID, value) {
this.props.addRatingToPlace(value, pUID);
}
render() {
return (
<View style={containerStyle}>
<Modal
isVisible={this.state.showModal}
onBackdropPress={() => this.setState({ showModal: false })}
onSwipeComplete={() => this.setState({ showModal: false })}
swipeDirection="left"
>
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Text style={modalTitleStyle}>HODNOTENIE</Text>
<AirbnbRating
count={5}
reviews={['Slabé', 'Ujde', 'V pohode', 'Super', 'Vynikajúce']}
defaultRating={userDataDetail.rate}
size={20}
showRating
onFinishRating={this.ratingComplete.bind(this, uid)}
/>
</View>
</Modal>
...
const mapStateToProps = (state) => {
const userDataDetail = state.userData;
return { userDataDetail };
};
export default connect(mapStateToProps, { addRatingToPlace, userPlaceDataFetch })(PlaceDetail);
UserDataActions.js
import firebase from '@firebase/app';
import '@firebase/auth';
import '@firebase/database';
import { USER_PLACE_DATA_FETCH_SUCCESS } from './types';
export const userPlaceDataFetch = (currentPlaceUID) => {
const { currentUser } = firebase.auth();
return (dispatch) => {
firebase.database().ref(`users/${currentUser.uid}/ratings/${currentPlaceUID}`)
.on('value', snapshot => {
console.log('snapshot.val:', snapshot.val());
dispatch({ type: USER_PLACE_DATA_FETCH_SUCCESS, payload: snapshot.val() });
});
};
};
UserDataReducer.js
import { USER_PLACE_DATA_FETCH_SUCCESS } from '../actions/types';
const INITIAL_STATE = {
showModal: false,
};
export default (state = INITIAL_STATE, action) => {
switch (action.type) {
case USER_PLACE_DATA_FETCH_SUCCESS:
return action.payload;
default:
return state;
}
};
редукторы / index.js
import { combineReducers } from 'redux';
import AuthReducer from './AuthReducer';
import ProfileReducer from './ProfileReducer';
import ListReducer from './ListReducer';
import MapReducer from './MapReducer';
import DetailReducer from './DetailReducer';
import UserDataReducer from './UserDataReducer';
export default combineReducers({
auth: AuthReducer,
prof: ProfileReducer,
places: ListReducer,
maps: MapReducer,
detail: DetailReducer,
userData: UserDataReducer
});
app.js
import React, { Component } from 'react';
import { Provider } from 'react-redux';
import { createStore, applyMiddleware } from 'redux';
import ReduxThunk from 'redux-thunk';
//import firebase from '@firebase/app';
import Firebase from './Firebase';
import Router from './Router';
import reducers from './reducers';
class App extends Component {
render() {
return (
<Provider store={createStore(reducers, {}, applyMiddleware(ReduxThunk))}>
<Router />
</Provider>
);
}
}
export default App;
Маршрутизатор - чтобы увидеть, как организованы мои сцены / компоненты
<Router>
<Scene key="root">
<Scene key="isLogged" hideNavBar initial>
<Scene key="splash" component={Splash} hideNavBar />
</Scene>
<Scene key="auth" hideNavBar>
<Scene key="login" component={LoginForm} hideNavBar />
</Scene>
<Scene
key="main"
tabs
tabBarStyle={{ backgroundColor: '#10172C' }}
hideNavBar
>
<Scene
key="list"
component={ListOfPlaces}
icon={iconList}
title="Zoznam miest"
initial
hideNavBar
dataPlaces={this.props.places}
/>
<Scene
key="map"
component={MapOfPlaces}
icon={iconMap}
title="Mapa"
hideNavBar
dataPlaces={this.props.places}
/>
<Scene
key="profile"
component={Profile}
icon={iconUser}
title="Profil"
hideNavBar
/>
</Scene>
<Scene
key="place"
component={PlaceDetail}
hideNavBar
/>
</Scene>
</Router>