Приложение перезапускается после получения данных через Redux - PullRequest
3 голосов
/ 26 марта 2019

Я пытаюсь извлечь пользовательские данные из 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>

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

У меня была такая же проблема при выполнении запросов POST, потому что он обновлял файл JSON в каталоге проекта, и у меня была включена настройка «Live Reload» в приложении. Если вы включили этот параметр, приложение будет перезагружаться при каждом обновлении файла. Может быть, у вас есть эта проблема.

0 голосов
/ 26 марта 2019
const INITIAL_STATE = {
    rate: null, // init your relevant state fields here , or leave it empty
};

export default (state = INITIAL_STATE, action) => {
    switch (action.type) {
        case USER_PLACE_DATA_FETCH_SUCCESS:
            return { ...state, ...action.payload };
        default:
            return state;
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...